打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
【转】位带操作的原理及使用

位带操作原理

把每个比特膨胀(映射)为一个32位的字,当访问这些字的时候就达到了访问比特的目的,比如说BSRR寄存器有32个位,那么可以映射到32个地址上,我们去访问(读-改-写)这32个地址就达到访问32个比特的目的。

即如果要改写某个寄存器的某一位,通过改写这一位映射的地址即可

 
原理图1

 
原理图2

 
映射对应关系图

位带操作的优越性

 

例子

sys.h里面对GPIO输入输出部分功能实现了位带操作:

#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)) //IO口地址映射#define GPIOA_ODR_Addr    (GPIOA_BASE+12) //0x4001080C #define GPIOB_ODR_Addr    (GPIOB_BASE+12) //0x40010C0C #define GPIOF_ODR_Addr    (GPIOF_BASE+12) //0x40011A0C    #define GPIOG_ODR_Addr    (GPIOG_BASE+12) //0x40011E0C    #define GPIOA_IDR_Addr    (GPIOA_BASE+8) //0x40010808 #define GPIOB_IDR_Addr    (GPIOB_BASE+8) //0x40010C08 #define GPIOG_IDR_Addr    (GPIOG_BASE+8) //0x40011E08 //IO口操作,只对单一的IO口!//确保n的值小于16!#define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)  //输出 #define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n)  //输入 #define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  //输出 #define PBin(n)     BIT_ADDR(GPIOB_IDR_Addr,n)  //输入 …#define PFout(n)   BIT_ADDR(GPIOF_ODR_Addr,n)  //输出 #define PFin(n)    BIT_ADDR(GPIOF_IDR_Addr,n)  //输入#define PGout(n)   BIT_ADDR(GPIOG_ODR_Addr,n)  //输出 #define PGin(n)    BIT_ADDR(GPIOG_IDR_Addr,n)  //输入

输出:(操作ODR寄存器)
BIT_ADDR可以理解为是一个映射关系,用过写PAout(n)=1,即往它映射的地址写1

输入:(操作IDR寄存器)
同上

跑马灯实例

 int main(void) {      delay_init();            //延时函数初始化        LED_Init();         //初始化与LED连接的硬件接口    while(1)    {        PAout(8)=1; //LED0输出低        PDout(2)=0;//LED1输出高        delay_ms(500);        PAout(8)=0;//LED0输出高        PDout(2)=1;//LED1输出低        delay_ms(500);    } }
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
详解CortexM位带操作
STM32 刘凯老师 位绑定程序
. GPIO原理与配置(跑马灯,蜂鸣器,按键)
最简单的STM32入门教程
推荐一种超简单的硬件位带bitband操作方法,让变量,寄存器控制,IO访问更便捷
stm32 端口位操作问题
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服