历史上的今天
今天是:2024年08月26日(星期一)
2018年08月26日 | STM32 GPIO 配置之ODR, BSRR, BRR 详解
2018-08-26 来源:eefocus
用stm32 的配置GPIO 来控制LED 显示状态,可用ODR,BSRR,BRR 直接来控制引脚输出状态.
ODR寄存器可读可写:既能控制管脚为高电平,也能控制管脚为低电平。
管脚对于位写1 gpio 管脚为高电平,写 0 为低电平
BSRR 只写寄存器:[color=Red]既能控制管脚为高电平,也能控制管脚为低电平。
对寄存器高 16bit 写1 对应管脚为低电平,对寄存器低16bit写1对应管脚为高电平。写 0 ,无动作
BRR 只写寄存器:只能改变管脚状态为低电平,对寄存器 管脚对于位写 1 相应管脚会为低电平。写 0 无动作。
刚开始或许你跟我一样有以下疑惑:
1.既然ODR 能控制管脚高低电平为什么还需要BSRR和SRR寄存器?
2.既然BSRR能实现BRR的全部功能,为什么还需要SRR寄存器?
对于问题 1 ------ 意法半导体给的答案是---
“This way, there is no risk that an IRQ occurs between the read and the modify access.”
什么意思呢?就就是你用BSRR和BRR去改变管脚状态的时候,没有被中断打断的风险。也就不需要关闭中断。
用ODR操作GPIO的伪代码如下:
disable_irq()
save_gpio_pin_sate = read_gpio_pin_state();
save_gpio_pin_sate = xxxx;
chang_gpio_pin_state(save_gpio_pin_sate);
enable_irq();
关闭中断明显会延迟或丢失一事件的捕获,所以控制GPIO的状态最好还是用SBRR和BRR
对于问题 2 ------- 个人经验判断意法半导体仅仅是为了程序员操作方便估计做么做的。
因为BSRR的 低 16bsts 恰好是set操作,而高16bit是 reset 操作 而BRR 低 16bits 是reset 操作。
简单地说GPIOx_BSRR的高16位称作清除寄存器,而GPIOx_BSRR的低16位称作设置寄存器。
另一个寄存器GPIOx_BRR只有低16位有效,与GPIOx_BSRR的高16位具有相同功能。
举个例子说明如何使用这两个寄存器和所体现的优势。
例如GPIOE的16个IO都被设置成输出,而每次操作仅需要
改变低8位的数据而保持高8位不变,假设新的8位数据在变量Newdata中,
这个要求可以通过操作这两个寄存器实现,STM32的固件库中有两个函数
GPIO_SetBits()和GPIO_ResetBits()使用了这两个寄存器操作端口。
上述要求可以这样实现:
GPIO_SetBits(GPIOE, Newdata & 0xff);
GPIO_ResetBits(GPIOE, (~Newdata & 0xff));
也可以直接操作这两个寄存器:
GPIOE->BSRR = Newdata & 0xff;
GPIOE->BRR = ~Newdata & 0xff;
当然还可以一次完成对8位的操作:
GPIOE->BSRR = (Newdata & 0xff) | ( (~Newdata & 0xff)<<16 );
当然还可以一次完成对16位的操作:
GPIOE->BSRR = (Newdata & 0xffff) | ( (~Newdata )<<16 );
从最后这个操作可以看出使用BSRR寄存器,可以实现8个端口位的同时修改操作。
有人问是否BSRR的高16位是多余的,请看下面这个例子:
假如你想在一个操作中对GPIOE的位7置'1',位6置'0',则使用BSRR非常方便:
GPIOE->BSRR = 0x400080;
如果没有BSRR的高16位,则要分2次操作,结果造成位7和位6的变化不同步!
GPIOE->BSRR = 0x80;
GPIOE->BRR = 0x40;

BSRR还有一个特点,就是Set比Reset的级别高,
就是说同一个bit又做Set又做Reset,最后结果是Set
要同步变化只要简单的 GPIOx->BSRR = 0xFFFF0000 | PATTEN;
即可,不用考虑哪些需要置1,哪些需要清零
从最后这个操作可以看出使用BSRR寄存器,可以实现8个端口位的同时修改操作。
史海拾趣
|
本帖最后由 jameswangsynnex 于 2015-3-3 20:01 编辑 电视卡播放软件DScaler完全攻略 很多朋友在为自己的爱机添置了电视卡后,通常都是用电视卡本身所带的软件来收看电视节目,如果该软件的收视效果不能令你满意的话,不妨试用一个第三方的电视卡 ...… 查看全部问答> |
|
目前的工控板一般是: 8个光耦隔离的输入 8个光耦隔离的输出 4路12位的AD 4路pwm的DA 1个usb 1个485 1个232 一个2.4G无线发送模块 大家看看这些功能是否已经足够?在开发过程中是否需要删减? [ 本帖最后由 clark 于 2009-3-25 11:45 ...… 查看全部问答> |
|
求助:(TFTP)TIMEOUT waiting for Ack block 我是个新手,用一块板子s3c2510测试了下tftp的功能,发现程序中定义的的包结构,都偏移了两个字节发送出去,在发送前人为添加了两个字节,可以正常与tftpserver通信了,并能下载104K 的BIN文件, 但在下载稍微大点的应用文件(大约4M)时,总会报 ...… 查看全部问答> |
|
大家好,我现在使用的WINCE6.0,想利用camera Interface接上摄像头,在应用程序里获取BMP图像,并且实时显示到屏幕上,据我了解有DSHOW和直接使用DevieceIoControl两种方法,后者最好,简单一点。 需要的结果就是视频时实时显示的,不会卡。 camer ...… 查看全部问答> |
|
模电、数电、单片机硬软件的核心原理与衔接关系(可对整个电子有个感性了解 模电、数电、单片机硬件、单片机软件的核心原理 模电: 模电的核心是电路(网络、回路),它分析的是电流和电压在整个回路中所产生的各种转换作用之和。设计模拟电路往往会利用到艺术的一些原理,如平衡、稳定、对称、美观、折中……它会有各种直 ...… 查看全部问答> |
|
/*请教下各位大侠 为什么读出来的数据老是等于0呢 麻烦各位这点一下*/ #include #include \"NUC1xx.h\" #include \"DrvGPIO.h\" #include \"DrvSYS.h\" /*$$$$$$$$$$$$$$$$$RAM$$$$$$$$$$$$$$$$$$$$$$*/ #define& ...… 查看全部问答> |
|
哪位大牛给介绍一款常用的内部带flash的fpga 领导非要用内部带flash的,小弟新手找了好久爱也没找到,不知道从手册的哪里能够看出来有没有内置flash。 我们公司以前的产品里面貌似只有XC3S50AN-4TQ144C这个里面有,但是这个的资源不够用… 查看全部问答> |




