历史上的今天
返回首页

历史上的今天

今天是:2024年09月23日(星期一)

正在发生

2020年09月23日 | GPIO 配置之ODR, BSRR, BRR 详解

2020-09-23 来源: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个端口位的同时修改操作。


推荐阅读

史海拾趣

百佳(BAIJIA)公司的发展小趣事

百佳公司的创始人蔡永权,在改革开放初期,凭借敏锐的商业洞察力和对技术的执着追求,创立了中山市古镇百佳电子电器厂。初创时期,公司面临着资金短缺、设备简陋、市场竞争激烈等多重困难。然而,蔡永权带领团队坚持不懈,以质量为核心,通过不断改进生产工艺和提升产品质量,逐渐赢得了客户的信任和市场的认可。

Corporation Soneet公司的发展小趣事

在电子行业的激烈竞争中,一家名为Soneet的新兴公司凭借其在半导体技术上的创新突破,逐渐崭露头角。Soneet的研发团队经过数年的努力,成功开发出一种新型的低功耗、高性能的芯片,这一技术突破不仅提高了电子设备的性能,还大大降低了能耗。凭借这一优势,Soneet迅速赢得了市场的认可,其产品在各大电子设备制造商中广受欢迎。

EBG RESISTORS LLC公司的发展小趣事

EBG RESISTORS LLC公司始终将品质管理放在首位。他们建立了严格的质量控制体系,确保每一款产品的性能和质量都符合客户要求。同时,公司还鼓励员工提出改进意见,不断优化生产流程和产品性能。这种持续改进的精神使得EBG RESISTORS LLC公司的产品在市场上始终保持着领先地位。

DREMEL公司的发展小趣事

随着电子行业的不断发展,数据治理和云数据湖领域也面临着越来越多的挑战。Dremio公司始终保持敏锐的市场洞察力,积极应对各种挑战。他们不断投入研发资源,推出了一系列创新产品和技术解决方案。例如,他们开发了一种基于人工智能的数据分析引擎,能够自动识别和预测数据中的异常和趋势。这一技术不仅提高了数据分析的准确性和效率,也为企业提供了更全面的数据支持。

Fenghua (HK) Electronics Ltd公司的发展小趣事

人才是企业发展的重要保障。Fenghua (HK) Electronics Ltd高度重视人才队伍建设,通过校园招聘、社会招聘等多种渠道吸引优秀人才加入公司。公司提供了完善的培训体系和晋升机会,激发了员工的积极性和创造力。同时,公司注重营造良好的企业文化氛围,让员工在工作中感受到归属感和成就感。

Hind Rectifiers Ltd公司的发展小趣事

作为一家有社会责任感的企业,Fenghua (HK) Electronics Ltd积极履行社会责任,关注环保和公益事业。公司采用了环保材料和节能技术,降低了生产过程中的能耗和排放。同时,公司积极参与社会公益活动,为当地社区和教育事业做出了积极贡献。这些举措不仅提升了公司的社会形象,也为企业的可持续发展奠定了坚实基础。

请注意,以上故事框架仅供参考,你可以根据Fenghua (HK) Electronics Ltd公司的实际情况和发展历程进行进一步的拓展和完善。

问答坊 | AI 解惑

【FPGA小技巧】同步设计方法中TC的生成和使用

上图是时钟分频的例子,从电路可以看出1110 后就变为000 ,就是15分频了,其对应的程序例子如下: signal Counter: std_logic_vector(3 downto 0); signal TC: std_logic; signal flop: std_logic; process(TC, Clk) begin if ...…

查看全部问答>

有人做过ce上的指纹识别么,给个思路

各位大虾,有人做过ce上的指纹识别么? 盼望给个思路,如需要添加哪些系统的feature,以及驱动的实现等等 谢谢了…

查看全部问答>

10000元开发项目,北京的请进!

熟悉RAM7,RAM9,FPGA的朋友,需要做一个LED显示屏控制卡,有兴趣的请联系QQ:40634865,TEL:13366161232…

查看全部问答>

水泥电阻大小的识别

上面标为3WR5J 的电阻大小是多少哇  这应该是硬件常识得 但我们一般用的都是色环的    我理解的是 3瓦的 5欧姆电阻    求指教啊 …

查看全部问答>

单片机如何测方波的电压

我们学院布置了一个任务,做1hz和10hz的正弦波振荡器,然后能用单片机切换两种波,并且正弦波能用单片机检测。 我们想到先将正弦波通过电路转化为方波,然后想用单片机测量,但不知道怎么测,求帮助!有没有什么原理图,或者建议或者优良的代码~ …

查看全部问答>

寄存器

  [ 本帖最后由 zzbeagle 于 2012-5-18 06:38 编辑 ]…

查看全部问答>

求助 基于AT89S51单片机的天车电脑称设计

放大器的型号 数模转换的型号  最好有成品  急求啊  各位大大们…

查看全部问答>

开关电源中TL431的作用与原理

开关电源中TL431的作用与原理 在常见的开关电源中的反馈系统,经常作用TL431与隔离光耦,其作用是什么?外接电容,电阻该如何选择,附件中的两个文档供参考,对初学可能会帮助。 …

查看全部问答>

电荷泵 反相电压

准备用PWM电压反相器做出-Vin的输出,按照网上的例子用multisim12.0仿真了一下,发现每次都得到约-2*Vin的电压,求大神指导~~ 电路图如下所示: 用函数发生器模拟PWM信号,输入输出如下:    把电压改成3.3V之后:     ...…

查看全部问答>