STM32自学笔记 - 位带操作

根据位带区地址算位带别名区地址公式


#define BITBAND(GPIOB_ODR_Addr , bitnum) ((GPIOB_ODR_Addr & 0xF0000000) + 0x02000000 + ((GPIOB_ODR_Addr & 0x00FFFFFF) << 5) + (bitnum << 2))

 分析

  1. //用于保留最高位,舍去其他位
    //片上SRAM位带区地址始于 0x20000000
    //片上外设位带区地址始于 0x40000000
    //测试:(GPIOB_ODR_Addr & 0xF0000000) = (0X40010C0C & 0xF0000000) = 0X40000000
    (GPIOB_ODR_Addr & 0xF0000000) 

  2. //片上SRAM和外设起始地址 + 0x02000000 得到对应位带别名区起始地址
    + 0x02000000

  3. //舍去最高两位,保留剩余六位
    //测试:(GPIOB_ODR_Addr & 0x00FFFFFF) = (0X40010C0C & 0x00FFFFFF) = 0X10C0C
    ((GPIOB_ODR_Addr & 0x00FFFFFF)

  4. //2 进制左移 5 位等于乘以 5 的 2 次方,即为:x 32
    << 5

  5. //位带别名区4字节表示位带区的1位,所以 x 4
    (bitnum << 2)

 测试记录

APB2PERIPH_BASE = 0x40000000 + 0x10000 = 0X40010000
GPIOB_BASE = APB2PERIPH_BASE + 0x0c00 = 0X40010C00
GPIOB_ODR_Addr = GPIOB_BASE + 0x0c = 0X40010C0C
(GPIOB_ODR_Addr & 0xF0000000) = (0X40010C0C & 0xF0000000) = 0X40000000
//0X10C0C 转10进制为 68620
(GPIOB_ODR_Addr & 0x00FFFFFF) = (0X40010C0C & 0x00FFFFFF) = 0X10C0C
//68620 * 32 = 2195840; 2195840 转16进制为 0X218180
((GPIOB_ODR_Addr & 0x00FFFFFF) << 5) = ((0X40010C0C & 0x00FFFFFF) << 5) = 0X218180

参考图

  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值