小学生
最后登录1970-1-1
在线时间 小时
注册时间2020-11-17
|
发表于 2020-11-23 21:14:32
|
显示全部楼层
本帖最后由 eolasia 于 2020-11-23 21:29 编辑
GPIOB->ODR+GPIO_ODR_ODR0
这个语句是有问题的吧?初学stm32 如有说错 请指正
想要操作GPIOB->ODR寄存器,需要用个操作符(=,|=, &=, ^=)对其进行赋值。
首先取出ODR中的二进制数据 然后将其跟 赋值符号后面寄存器里的二进制数据进行 与/或/异或等操作 再将其置放入语句前面的GPIOB->ODR寄存器中,
ODR(output data register) 控制输出0 1状态。
在火哥的教材中也有这样的用法
GPIOB->ODR ^= GPIO_Pin_0
执行这一语句可以实现Pin_0的高低电平翻转
-----------------------------------------
GPIOB->ODR+GPIO_ODR_ODR0
-----------------------------------------
首先 这个加号无法操作寄存器
需要用到上述的赋值位运算符
其次 GPIO_ODR_ODR0这个是什么鬼,我没见过这种语句
我猜想你是想取GPIO->ODR中的 第0位的数据出来进行处理,火哥后面有一章位带操作,貌似就是可以处理单个bit位的,
因为我也才玩stm32一个星期,还没有二刷,所以这一章没认真看,就2倍速过了一次。关于位带操作我也不好给什么意见...但是可以
GPIOB->ODR &= 1<<0; //GPIOB_Pin_0输出高电平 1
GPIOB->ODR |= 0<<0; //GPIOB_Pin_0输出低电平 0
这样操作 其实这个语句与GPIO_ResetBit 和 setBit 高度类似 不同的是 resetBit和SetBit操作的是BSRR 和 BRR 寄存器 而不是ODR寄存器
还有 #define 宏定义 也就是说 led1 在预处理的时候 把所有led1 替换成GPIOB->ODR+GPIO_ODR_ODR0
语句就会变成
GPIOB->ODR+GPIO_ODR_ODR0 = 1
这个就更读不通了
想要实现你那样的功能 也是可以的 火哥后面的教材中也有
还是用宏定义
#define ON 1
#define OFF 0
#define LED_R(PARAMETER) if(PARAMETER) GPIO_ResetBits(LED_R_GPIO_PORT, LED_R_GPIO_PIN);\
else GPIO_SetBits(LED_R_GPIO_PORT, LED_R_GPIO_PIN);
大概是这样的
然后在main函数中直接 LED_R(ON)即可点亮LED_R
|
|