野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 18584|回复: 8

菜鸟求解,这段程序没看明白啊,c语音没学好>_<

[复制链接]
发表于 2013-7-29 22:04:55 | 显示全部楼层 |阅读模式
//带参宏,可以像内联函数一样使用
#define LED1(a) if (a) \
     GPIO_SetBits(GPIOC,GPIO_Pin_3);\
     else  \
     GPIO_ResetBits(GPIOC,GPIO_Pin_3)
回复

使用道具 举报

发表于 2013-7-29 22:32:35 | 显示全部楼层
本帖最后由 flyleaf 于 2013-7-29 22:34 编辑

等同于:
#define LED1(a)  if (a)  GPIO_SetBits(GPIOC,GPIO_Pin_3);    else  GPIO_ResetBits(GPIOC,GPIO_Pin_3)
a非0的时候执行 前面的GPIO_SetBits(GPIOC,GPIO_Pin_3);
a为0的时候执行 后面的GPIO_ResetBits(GPIOC,GPIO_Pin_3)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-29 23:01:12 | 显示全部楼层
flyleaf 发表于 2013-7-29 22:32
等同于:
#define LED1(a)  if (a)  GPIO_SetBits(GPIOC,GPIO_Pin_3);    else  GPIO_ResetBits(GPIOC,GPI ...

if和else不属于宏定义的内容吧,我是在这有点晕?
回复 支持 反对

使用道具 举报

发表于 2013-7-29 23:03:13 | 显示全部楼层
就是调用的时候 LED1(a)
会最终替换为:
if (a)   GPIO_SetBits(GPIOC,GPIO_Pin_3);     else       GPIO_ResetBits(GPIOC,GPIO_Pin_3)

\ 是换行符号
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-29 23:07:40 | 显示全部楼层
微粒子 发表于 2013-7-29 23:03
就是调用的时候 LED1(a)
会最终替换为:
if (a)   GPIO_SetBits(GPIOC,GPIO_Pin_3);     else       GPI ...

明白!多谢多谢,弱弱再问一句,SET和RESET函数有什么区别,今天刚拿到板子,看数据手册感觉还是不清楚
回复 支持 反对

使用道具 举报

发表于 2013-7-30 21:07:01 | 显示全部楼层
痛并快乐着 发表于 2013-7-29 23:07
明白!多谢多谢,弱弱再问一句,SET和RESET函数有什么区别,今天刚拿到板子,看数据手册感觉还是 ...

SET是使引脚输出高电平,RESET是使引脚为低电平,详见STM32的库帮助文档或《STM32库开发实战指南》
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-30 22:45:21 | 显示全部楼层
flyleaf 发表于 2013-7-30 21:07
SET是使引脚输出高电平,RESET是使引脚为低电平,详见STM32的库帮助文档或《STM32库开发实战指南》

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
00359 {
00360   /* Check the parameters */
00361   assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
00362   assert_param(IS_GPIO_PIN(GPIO_Pin));
00363   
00364   GPIOx->BSRR = GPIO_Pin;
00365 }
这是库函数的具体实现,问题是形参传递的是管脚的名称,这样为什么能实现对GPIOx->BSRR里写值呢?
回复 支持 反对

使用道具 举报

发表于 2013-7-30 22:51:44 | 显示全部楼层
调用 GPIO_SetBits函数的时候GPIO_Pin 会使用宏GPIO_Pin0~GPIO_Pin15,宏展开后就是0~15
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-30 23:39:02 | 显示全部楼层
flyleaf 发表于 2013-7-30 22:51
调用 GPIO_SetBits函数的时候GPIO_Pin 会使用宏GPIO_Pin0~GPIO_Pin15,宏展开后就是0~15

我的意思是这个过程中怎么实现对GPIOx->BSRR 寄存器写0或写1?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-26 03:10 , Processed in 0.036896 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表