历史上的今天
返回首页

历史上的今天

今天是:2025年02月08日(星期六)

正在发生

2020年02月08日 | 怎样用STM32单片机的GPIO控制LED显示状态

2020-02-08 来源:elecfans

用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;

怎样用STM32单片机的GPIO控制LED显示状态

BSRR还有一个特点,就是Set比Reset的级别高,

就是说同一个bit又做Set又做Reset,最后结果是Set

要同步变化只要简单的 GPIOx-》BSRR = 0xFFFF0000 | PATTEN;

即可,不用考虑哪些需要置1,哪些需要清零

从最后这个操作可以看出使用BSRR寄存器,可以实现8个端口位的同时修改操作。

推荐阅读

史海拾趣

EMC [ELAN Microelectronics Corp]公司的发展小趣事

随着公司的发展,义隆电子不断加大研发投入,致力于技术创新和产品多元化。公司拥有一支高素质的研发团队,拥有多项自主知识产权和核心技术。通过不断的技术创新和产品升级,义隆电子成功推出了微控制器、个人计算机外设芯片、数字显示器芯片等一系列具有市场竞争力的产品。同时,公司还积极拓展智能型人机接口技术之应用芯片等新兴领域,为未来的发展奠定了坚实的基础。

Curtis Industries公司的发展小趣事

随着电子行业的不断发展,Curtis Industries公司意识到技术创新的重要性。公司投入大量资源进行技术研发,成功推出了一系列具有行业领先水平的产品。其中,公司在某一关键领域的突破性技术,不仅解决了行业内的技术难题,还为公司赢得了广泛的赞誉。Curtis Industries因此成为了电子行业的技术创新引领者,推动了整个行业的发展。

Cree(科瑞)公司的发展小趣事

Cree公司成立于1987年,初期专注于硅碳(SiC)材料的研发。在LED灯珠的制造工艺中,Cree的工程师们发现采用SiC材料制成的MOS功率管具备更好的市场价值。随着技术的不断进步,Cree开始将其应用于LED生产,这一创新使得Cree在LED行业中脱颖而出。公司的LED产品以其高效、耐用的特性受到市场的广泛认可,为Cree的后续发展奠定了坚实的基础。

Hongfa公司的发展小趣事

为了推动公司的进一步发展,宏发公司于2008年进行了股份制改造,并成立了“厦门宏发电声股份有限公司”。2012年,公司成功上市,通过资本市场获得了更多的资金支持和发展动力。上市后,宏发继续加大在技术研发、市场拓展和产能提升等方面的投入,不断巩固和扩大其在继电器行业的领先地位。同时,公司还积极履行社会责任,为行业发展和地方经济做出了积极贡献。

Hasco Relays and Electronics International Corp公司的发展小趣事

Harris公司最初成立于1890年代,起初以无线电通信技术为核心业务。在早期,公司凭借其创新的无线电通信技术,在通信领域迅速崭露头角。这一时期,Harris不仅为军事领域提供了关键的通信解决方案,还逐步拓展到商业和民用市场,为当时的电话、电报等通信方式带来了革命性的变化。通过不断的技术研发和产品创新,Harris逐渐奠定了其在电子行业的重要地位。

COMPEX公司的发展小趣事

COMPEX公司自成立以来,一直致力于电子技术的研发与创新。在光通讯领域,公司凭借先进的光通讯模块电路板小器件技术,逐渐在市场中占据了一席之地。COMPEX团队不断突破技术壁垒,推出了多款高性能、高可靠性的产品,赢得了客户的广泛认可。同时,公司还积极与国内外知名企业和研究机构合作,共同推动电子行业的技术进步。

问答坊 | AI 解惑

12864C系列中文液晶显示模块使用说明书

C系列中文模块可以显示字母、数字符号、中文字型及图形,具有绘图及文字画面混合显示功能。提供 三种控制接口,分别是8位微处理器接口,4位微处理器接口及串行接口(OCMJ4X16A/B无串行接口)。所 有的功能,包含显示RAM,字型产生器,都包含在一 ...…

查看全部问答>

03月31日 【EEWORLD带你DIY】示波器方案讨论

报名页面:https://www.eeworld.com.cn/formguide/index.php?formid=90 (请在备注中注明自己所参与的部分) DIY示波器活动QQ群:16254999 在整体方案上参考上的示波器设计方案,采用STM32F103RBT6作为主控CPU,LPC2103作为辅助CPU,对于原有模拟 ...…

查看全部问答>

mp3文件如何存入到nor flash中

给分虽然少,但已经是本人分数的多一半了,不好意思哈 现在具体说一下问题的内容: 核心是把mp3文件烧录到arm7板的片外nor flash中,如果没有操作系统,也没有文件系统的话,我应该怎么考虑呢?按照字节串口传输吗?我该如何把mp3文件转成字节的 ...…

查看全部问答>

哪个有在JZ4730上PS2的驱动开发经验的?

有的话,能否赐教下本人,给个思路,或者可以参照系统中的哪些文件,都可以,只要是有帮助的都有分…

查看全部问答>

vc编的程序转为evc4在WINCE上运行问题

VC6编的程序,想在ARM9模块上运行,程序是关于串口输入输出的,还有同上位机数据库连接的内容,用了MFC。 请问一下,我这个程序转为EVC4程序,要作些什么,难度几何?…

查看全部问答>

.net 1.0 调用.net 2.0的 dll

做一个程序 需在WinCE系统.net 1.0 上运行,有什么方法用.net 2.0里实现的功能吗?比如实现WebBrowser功能,能否引用System.Windows.Forms.dll来实现? 虽然几乎不可能,但我还是要问,想知道为什么不行?…

查看全部问答>

111

111222222 [ 本帖最后由 lelede1987 于 2011-3-30 18:11 编辑 ]…

查看全部问答>

Spartan-6 LX9 Microboard不用XCF04怎么实现配置

Spartan-6 LX9 Microboard开发板中不用XCF04怎么实现配置的。   想知道原来装有XCFO4,怎样去掉。 好像只有TDO信号没连拉到JTAG。   [ 本帖最后由 sdjntl 于 2011-8-4 17:39 编辑 ]…

查看全部问答>

简易空间方位测量

        小弟在此向各位大侠请教,各位大侠好,小弟在这有礼了!         小弟这里遇到一个问题,请问如何用最一般的设备测出一个物体相对于测量的空间方位。   ...…

查看全部问答>

petalinux移植

大家谁有petalinux源代码,和fs-boot源码。想学习学习。先谢谢了。…

查看全部问答>