您的位置 首页 软件

怎样用STM32单片机的GPIO操控LED显现状况

怎样用STM32单片机的GPIO控制LED显示状态-ODR寄存器可读可写:既能控制管脚为高电平,也能控制管脚为低电平。

管脚对于位写1 gpio 管脚为高电平,写 0 为低电平

BSRR 只写寄存器:[color=Red]既能控制管脚为高电平,也能控制管脚为低电平。

对寄存器高 16bit 写1 对应管脚为低电平,对寄存器低16bit写1对应管脚为高电平。写 0 ,无动作

BRR 只写寄存器:只能改变管脚状态为低电平,对寄存器 管脚对于位写 1 相应管脚会为低电平。写 0 无动作。

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个端口位的一起修正操作。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/ruanjian/347021.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部