寄存器位操作在STM32中的应用

最近在学I2C通信,发现有两行代码看不懂(因为一直用的库函数,没用过位操作),代码为:

#define SDA_IN() {
     GPIO->CRL&=0x0FFFFFFF;GPIOB->CRL|=(u32)8<<28)
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
STM32寄存器位操作可以通过使用位带操作实现。位带操作是一种在嵌入式系统常用的技术,可以方便地对单个寄存器的位进行操作。 位带操作使用一个专门的地址映射区域,将每个寄存器的每个位都映射到一个单独的地址上。这样,就可以使用普通的读写指令来访问单个位,而不需要使用移位和逻辑运算等操作。 例如,对于一个32位的寄存器,第0位的地址为0x42000000,第1位的地址为0x42000004,第2位的地址为0x42000008,以此类推。对于一个需要修改第3位的值的操作,可以使用如下代码: ``` #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x02000000+((addr & 0x000FFFFF)<<5)+(bitnum<<2)) #define REG(addr) (*((volatile unsigned long *) (addr))) #define BIT_SET(addr, bitnum) ((REG(BITBAND(addr, bitnum))) = 1) #define BIT_CLR(addr, bitnum) ((REG(BITBAND(addr, bitnum))) = 0) unsigned long *reg = (unsigned long *) 0x40000000; BIT_SET(reg, 3); ``` 这段代码,`BITBAND` 宏将地址和位数转换成一个位带地址。`REG` 宏将位带地址转换为指向寄存器的指针。`BIT_SET` 和 `BIT_CLR` 宏分别设置和清除位。 当然,也可以使用标准的位操作语法来实现位操作,如下所示: ``` unsigned long *reg = (unsigned long *) 0x40000000; *reg |= (1 << 3); // Set bit 3 *reg &= ~(1 << 3); // Clear bit 3 ``` 以上提供两种实现方式,使用哪种方式取决于个人喜好和实际应用场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wu__La

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值