完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
|
|
相关推荐
1个回答
|
|
概念
Cortex-M3的存储器系统支持所谓的“位带”(bit‐band)操作。通过它,实现了对单一比特的原子操作。位带操作仅适用于一些特殊的存储器区域中. 支持了位带操作后,可以使用普通的加载/存储指令来对单一的比特进行读写。在CM3中,有两个区中实现了位带。其中一个是 SRAM 区的最低 1MB 范围,第二个则是片内外设区的最低1MB范围。 从上图得知,支持位带操作的两个内存区的范围是: ● 0x2000_0000‐0x200F_FFFF(SRAM 区中的最低 1MB; ● 0x4000_0000‐0x400F_FFFF(片上外设区中的最低 1MB)。 这两个区中的地址除了可以像普通的RAM一样使用外,它们还都有自己的“位带别名区”,位带别名区把每个比特膨胀成一个32位的字。当你通过位带别名区访问这些字时,就可以达到访问原始比特的目的。 从上图看出位带操作将0x20000000地址内的8bit数据映射到了0x22000000-0x2200001C区间内,操作0x22000000-0x2200001C区间的数据,相当于操作了0x20000000地址内的8bit数据。 映射计算公式 对 SRAM 位带区的某个比特,记它所在字节地址为 A,位序号在别名区的地址为: 对于片上外设位带区的某个比特记它所在字节地址为 A,位序号在别名区的地址为: 对上面公式进行总结为一个公式: STM32单片机应用 //IO操作宏定义 #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) //地址计算 #define MEM_ADDR(addr) *((volatile unsigned long *)(addr)) //转化为单片机能识别的地址 #define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum)) //简化 //端口A IO地址定义 #define GPIOA_ODR_Addr (GPIOA_BASE+12) //0x4001080C #define GPIOA_IDR_Addr (GPIOA_BASE+8) //0x40010808 #define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //输入 #define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //输出 |
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2955 浏览 16 评论
3455 浏览 1 评论
8987 浏览 16 评论
4050 浏览 18 评论
1102浏览 3评论
570浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
568浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2301浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1857浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 03:30 , Processed in 1.038647 second(s), Total 81, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号