STM32 既然可以直接操作ODR,为什么还要设置BSRR和BRR?

STM32 既然可以直接操作ODR,为什么还要设置BSRR和BRR?,第1张

如果你想改变某个位的状态而不影响其他的,那用BSRR或BRR就很容易了。直接操作ODR需要“读-操作-写”的过程,速度反而变慢了。

比如说让PA1、PA3、PA7清零而不影响其他位的状态,那就是:

GPIOA->BRR=PA1|PA3|PA7;

你要用ODR来操作的话,那就变成这样了:

GPIOA->ODR&=~(PA1|PA3|PA7);

虽然C的语句都只有一个,但你看汇编代码,就发现使用BRR比ODR快的多。

您好,STM32的GPIO口的功能是非常之强大的。关于GPIO输出的赋值可使用两种方法,方法A:逐一配置法,优点是不会影响到其它的GPIO口,缺点是操作比较繁琐。方法B:ODR设置法,优点是操作轻松,缺点是需要硬件电路作配合。下面我们详细描写这两种方法:方法A:所谓逐一配置法, 就是对需要输出数据的IO口线逐一配置,需要输出为1的IO口使用GPIOx-BSS = 1 N; (N表示第N根线,如PA9, N值为9)需要输出为0的IO口使用GPIOx-BRSS = 1 N;使用以下语句可以完成//to do 先将输出口配置为输出功能for( i = start; i end; i++ ){ if( value BSS = 1 i; } else { GPIOx-BRSS = 1 i; }}方法B: ODR配置法,可以直接使用 GPIO-ODR = value N;给对应的IO口进行输出操作。但是此时在硬件上要保证:1 该功能口(如GPIOA)上的其余的IO口不作为普通的IO输出口使用(由于是键盘扫描,当列输出的时候,行应当是输入;同理,当列输入时,行应当是输出)2 行列以外的GPIO口,要末是普通的IO输入口,要末是功能口。功能口就是UART、USB、PWM、ADC等,对GPIO的ODR进行操作时,不会对功能口产生影响。以上第2条是对第1条的详细解释。总结:如果在硬件上可以满足方法B的利用条件,建议优先采取方法B。在其它1些需要使用并行输出,如并口液晶、NandFlash等应当的时候,也能够斟酌使用方法B。 查看更多答案>>

记得采纳啊

GPIOA是一个结构体指针,他指向一个地址为GPIOA_BASE的结构体GPIO_TypeDef。其中GPIOA_BASE就是控制这组IO口的寄存器组的基地址,GPIO_TypeDef是一个结构体,里面的成员变量对应着A组IO的相关控制寄存器,如:

GPIOA->ODR;GPIOA->IDR;GPIOA->CRL;GPIOA->CRH等等就是控制A组IO口的寄存器,操作GPIOA->ODR就是操作A组IO口。

认真看下手册,下面是我引用的一段,应该能助你理解了~~

端口低配置寄存器寄存器的复位值为0X4444 4444,,复位值其实就是配置端口为浮空输

入模式。STM32的CRL控制着每个IO端口(A~G)的低8位的模式。每

个IO端口的位占用CRL的4个位,高两位为CNF,低两位为MODE。这里我们可以记住几个

常用的配置,比如0X4表示模拟输入模式(ADC用)、0X3表示推挽输出模式(做输出口用,

50M速率)、0X8表示上/下拉输入模式(做输入口用)、0XB表示复用输出(使用IO口的第二

功能,50M速率)。

CRH的作用和CRL完全一样,只是CRL控制的是低8位输出口,而CRH控制的是高8

位输出口。这里我们对CRH就不做详细介绍了。

给个实例,比如我们要设置PORTC的11位为上拉输入,12位为推挽输出。代码如下:

GPIOA->CRH&=0XFFFFFFF0;

GPIOA->CRH|=0X00000003;//PA8 推挽输出

GPIOA->ODR|=1<<8;

//PA8 输出高

再如:

GPIOC->CRH&=0XFFF00FFF;//清掉这2个位原来的设置,同时也不影响其他位的设置

GPIOC->CRH|=0X00038000; //PC11输入,PC12输出

GPIOC->ODR=1<<11;//PC11上拉

通过这3句话的配置,我们就设置了PC11为上拉输入,PC12为推挽输出

n 是第几个管脚的意思 ,就是GPIO_A_n!

//位带操作,实现51类似的GPIO控制功能

//具体实现思想,参考<<CM3权威指南>>第五章(87页~92页)

//IO口操作宏定义

#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)) 

使用BIT_ADDR(addr, bitnum)可以取某一数据的某一位,

例如 I_u8data=5;//0000 0101

//用 I_u8data_bit[8]来取I_u8data的每一位有

for(i=0;i<8;i++)

{

I_u8data_bit[i]=BIT_ADDR((uint32_t)&I_u8data, i);

}

//则有  I_u8data_bit[0]==1; I_u8data_bit[2]==1; 其余为零

GPIOA->IDR这是个只读寄存器,是不能给它赋值的,就算你给它赋值也是无效的,也就是说你的:GPIOA->IDR=GPIOA->IDR>>8;这句话是无效的,你应该这样:

先定义一个变量unsigned short temp;然后

while(1)

{

temp = GPIOA->IDR>>8;

GPIOA->ODR = temp;

}

欢迎分享,转载请注明来源:品搜搜测评网

原文地址:https://pinsoso.cn/meirong/3084184.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2024-01-20
下一篇2024-01-20

随机推荐

  • 什么是芦荟胶?

    在如今的美容市场中,芦荟胶是一种备受欢迎的护肤品。那么,什么是芦荟胶呢?芦荟胶是由芦荟植物中提取的一种透明的凝胶状物质。它含有丰富的营养成分,包括维生素、氨基酸、矿物质和多糖等,对于保护和修护肌肤有很好的效果。在市场上,有许多品牌的芦荟胶产

    2024-04-15
    26500
  • 男生沐浴露哪个最好用

    男士沐浴露有很多品牌和种类,各自有不同的功效和适用场景。以下是一些备受推崇且适合男性使用的沐浴露:AXE黑木香男士沐浴露:AXE系列沐浴露推出多种款式,其中黑木香是最受欢迎的一款,散发出烟熏木质的清新味道,能够让皮肤保持滋润柔软。NIVEA

    2024-04-15
    20300
  • 雅诗兰黛小棕瓶多少钱?

    不同的地方价格也好似不一样的,比如在香港购买的佳果恶事480元港币,含量只有15ml,在京东购买雅诗兰黛即时修护特润精华露50ml,价格是528元。还有在其它网店上雅诗兰黛小棕瓶即时修护眼部精华霜15ml特润眼霜价格是318元,雅诗兰黛第六

    2024-04-15
    9900
  • 妮维雅630成分安全吗

    妮维雅630成分安全。经查询相关资料:妮维雅630经过成分表和安全分析得到风险成分和孕妇慎用成分均为0种。NIVEA妮维雅630系列,是亚马逊海外购的又一必购产品,秉承着好用不贵的原则吸引了很多女士。妮维雅这个品牌大家都比较熟悉,很多人都会

    2024-04-15
    10500
  • 你觉得妮维雅这个牌子怎么样?

    妮维雅是德国的品牌,众所周知,德国的品牌一直以高品质著称。妮维雅的产品是好产品,其品牌的广告较少,更加注重产品的品质。一、品牌介绍妮维雅产品在身体保养,脸部保养,防晒,唇部保养,个人清洁,男士护肤等品类已稳居欧洲市场排名第一。二、品牌价值高

    2024-04-15
    17200
  • 护美兵王的小说目录

    第一章 开房风波第二章 战火岁月第三章 卖艺也卖身第四章 飞天遛鸟侠第五章 禽兽!放开那个女孩!第六章 极限秒杀扒衣术第七章 这个女兵也有枪第八章 人不风骚枉少年第九章 出了虎穴又入狼窝第十章 这可是你逆推的我第十一章 KTV包房春光第十二

    2024-04-15
    8900
  • 希思黎全能乳液是精华以后用吗?之后再使用面霜吗?还是不需要再用面霜

    希思黎全能乳液是在精华液之后使用的,之后可以根据自己的肤质,选择涂或不涂面霜。希思黎的护肤品使用顺序如下:一、赋活水润保湿精华:1、一滴精华,对抗肌肤缺水源头;轻盈质地,作为日常美肤第一步,从造水、促进水分循环及储水三大关键步骤,帮助强化肌

    2024-04-15
    16400

发表评论

登录后才能评论
保存