历史上的今天
返回首页

历史上的今天

今天是:2024年11月09日(星期六)

正在发生

2020年11月09日 | STM32的库如何实现对同一组IO口的一部分引脚进行读写

2020-11-09 来源:eefocus

以写数据为例,提供的函数有 

GPIO_SetBits   

GPIO_ResetBits 

GPIO_WriteBit   

GPIO_Write 

比如我在PD口的高八位接了个并行的数据线,低八位为控制,有输入有输出。怎么实现对高八位写任意数而第八位不受影响呢。 

前两个函数肯定都不可以。 

第三个也不行,是对一个或多个IO口置位或复位。 

第四个是写整个口,势必影 响到第八位的控制信号啊。 


能想到的是写一个for循环,判断每一位然后调用八次 

GPIO_SetBits   

GPIO_ResetBits 

是不是太麻烦了。。。。 


知道一个方法,读输出再写输入就可以了。


GPIO的寄存器BSRR和BRR 


端口位设置/复位寄存器BSRR: 注:如果同时设置了BSy和BRy的对应位,BSy位起作用。 


 位31:16  BRy: 清除端口x的位y (y = 0…15)  

    这些位只能写入并只能以字(16位)的形式操作。  

    0:对对应的ODRy位不产生影响  

    1:清除对应的ODRy位为0  


位15:0 BSy: 设置端口x的位y (y = 0…15)  

    这些位只能写入并只能以字(16位)的形式操作。 

    0:对对应的ODRy位不产生影响 

    1:设置对应的ODRy位为1 


端口位复位寄存器BRR: 

位31:16  保留。  

位15:0 BRy: 清除端口x的位y (y = 0…15)  

     这些位只能写入并只能以字(16位)的形式操作。  

     0:对对应的ODRy位不产生影响  

     1:清除对应的ODRy位为0  


使用方法: 


1.混合改变 

需要置1的端口对应的位,在低16位里置1 

需要置0的端口对应的位,在高16位里置1, 

不改变的,都置0. 

然后写寄存器BSRR 


2.改变引脚为低 

需要置0的端口对应的位,在低16位里置1, 

然后写寄存器BRR 


3.改变引脚为高 

需要置1的端口对应的位,在低16位里置1 

高16为全0 

然后写寄存器BSRR 


另外就是,STM32的库,GPIO_SetBits,GPIO_ResetBits,可以对多个引脚操作的,就是把需要操作的引脚用“|”(或运算)。 


最方便的还是自己直接写寄存器(方法1)。


第一步:第一你要用的IO口 比如说要用A口的高8位定义 GPIOA_USE=0xF0 

第二步:写BSRR寄存器。                            GPIOA->BSRR=data&&GPIOA_USE 

第三步:写BRR寄存器。                             GPIOA->BRR=(~data)&&GPIOA_USE 


假设data为8位要写入的数据: 


GPIO_SetBits(GPIOD, data & 0xff00); 

GPIO_ResetBits(GPIOD, (~data & 0xff00)); 


也可以直接操作这两个寄存器: 

GPIOD->BSRR = data & 0xff00; 

GPIOD->BRR = ~data & 0xff00;


规则: 

一、置GPIOD->BSRR低16位的某位为'1',则对应的I/O端口置'1';而置GPIOD->BSRR低16位的某位为'0',则对应的I/O端口不变。 

二、置GPIOD->BSRR高16位的某位为'1',则对应的I/O端口置'0';而置GPIOD->BSRR高16位的某位为'0',则对应的I/O端口不变。 

三、置GPIOD->BRR低16位的某位为'1',则对应的I/O端口置'0';而置GPIOD->BRR低16位的某位为'0',则对应的I/O端口不变。 


例如: 

1)要设置D0、D5、D10、D11为高,而保持其它I/O口不变,只需一行语句: 

  GPIOD->BSRR = 0x0C21;// 使用规则一 


2)要设置D1、D3、D14、D15为低,而保持其它I/O口不变,只需一行语句: 

  GPIOD->BRR = 0xC00A;// 使用规则三 


3)要同时设置D0、D5、D10、D11为高,设置D1、D3、D14、D15为低,而保持其它I/O口不变,也只需一行语句: 

  GPIOD->BSRR = 0xC00A0C21;// 使用规则一和规则二


推荐阅读

史海拾趣

Anachip公司的发展小趣事

随着国内市场的饱和,Anachip公司开始将目光投向海外市场。公司通过参加国际电子展会、建立海外销售渠道等方式,逐步打开了国际市场。在海外市场,Anachip的产品以其高性能和可靠性赢得了客户的青睐。随着国际化拓展的深入,公司的业绩也实现了快速增长。

GWP Group公司的发展小趣事

随着电子行业的竞争日益激烈,Anachip公司意识到单凭自己的力量难以应对市场的快速变化。于是,公司开始积极寻求与其他企业的合作。通过与多家知名电子企业建立战略合作关系,Anachip成功将自己的芯片技术应用于更多领域,进一步扩大了市场份额。同时,这种合作模式也促进了整个电子行业的共同发展。

爱浦电子(AIPULNION)公司的发展小趣事

为了更好地服务客户,爱浦电子不断完善服务体系,提升服务水平。公司建立了全国性的服务网点,覆盖30多个城市,能够为客户提供及时、专业的技术支持和售后服务。此外,爱浦电子还根据客户需求,提供个性化定制服务,满足不同行业对模块电源的多样化需求。这些举措赢得了客户的广泛赞誉和信任,进一步巩固了公司在市场上的地位。

德崧电子(D-SWITCH)公司的发展小趣事

在激烈的市场竞争中,德崧电子始终坚持品质为先的经营理念。公司从原材料采购到生产加工,再到成品检验,每一个环节都严格把控,确保产品质量。这种对品质的坚守不仅赢得了客户的信任,也为公司赢得了良好的口碑。正是凭借着过硬的产品质量和优质的服务,德崧电子在电子开关行业中树立了良好的品牌形象。

Daito Communication Apparatus Co Ltd公司的发展小趣事

随着微电子学的快速发展,电子设备对元器件的要求也越来越高。Daito公司敏锐地捕捉到了这一市场趋势,决定对保险丝进行进一步的创新。在1995年,他们成功开发出了适用于电路板安装的高精度小型报警保险丝。这一产品的推出,不仅满足了市场对小型化、高精度保险丝的需求,也进一步巩固了Daito公司在电子行业中的领先地位。

随后,Daito公司又针对微电子学的进一步发展,推出了可以连续自动安装的方形微型保险丝。这一产品的推出,大大提高了生产效率,降低了成本,同时也为客户提供了更加便捷的使用体验。近年来,随着面安装技术的兴起,Daito公司又迅速推出了适用于面安装技术的片状保险丝,再次展示了他们在电子行业中的创新实力。

请注意,由于篇幅限制,以上仅为两个故事示例。如果需要更多故事,可以进一步深入研究和探索Daito公司在电子行业中的发展历程和创新实践。

Hpc Technology Inc公司的发展小趣事

自1948年成立以来,Daito公司一直致力于电子元器件的研发与生产。在公司的早期阶段,他们意识到保险丝在电子设备中的重要性,并决定投入大量资源进行研发。经过数年的努力,Daito公司成功开发出了高精度报警保险丝,这一创新产品凭借其卓越的性能和可靠性,迅速在市场上获得了认可。

高精度报警保险丝的成功并没有让Daito公司停止创新的步伐。他们不断对保险丝的失效原因与寿命进行预测和分析,通过全面质量管理,使产品质量得到了显著的提高。同时,Daito公司还将各系列保险丝的额定值多层次化,以满足不同客户的需求,扩大了顾客的选择余地。

问答坊 | AI 解惑

新旭48V-500W 电动自行车电路图

电动自行车电路图,供参考学习。主要是学习电动自行车的电机控制和电量控制. …

查看全部问答>

用DSP的I/O口控制指示灯和报警器的问题

问一个简单的问题,用DSP的I/O口控制外围的指示灯或者报警器时, 在I/O口和指示灯或报警器之间需要什么其他芯片?比如说光耦? 为什么呢? 谢谢大家!…

查看全部问答>

求助:cadence仿真

求一个cadence串扰和反射的布线性能仿真工程,哪位大大有的发我邮箱,fanrui_bupt@yahoo.cn…

查看全部问答>

怎样利用光电二极管代替红外一体化接收器?

  我们一般红外通讯采用的都是红外发射管发送信号,利用一体化接收器接收信号,这种做法是常见的方法,可在低功耗设计中,要实现时时通讯就只能使红外接收器长期供电工作,可红外接收器有一定的功耗不能满足低功耗的设计要求,怎样利用光 ...…

查看全部问答>

计算机与嵌入式设备的网络通讯问题?

现在有一台电脑跟一台嵌入式设备进行网络通讯,用双绞线的, 嵌入式装有操作系统,现在的问题是在电脑上能ping通嵌入式设备,但在嵌入却ping 不通, 第二个问题是,电脑跟设备通讯用的是TCP/IP,我想知道的是上层协议是用什么协议的,一般都是用 ...…

查看全部问答>

已知SFR的寄存器地址,我怎么编程读写此SFR寄存器?

我找不到怎么直接通过SFR的地址来读写SFR. 比如 我得到了一个0x80的地址,这是一个SFR的地址,我怎么向这个地址写入一个字节,或将SFR的内容读出来? void main( void ) {     unsigned char   btSfrAddr  = 0x8 ...…

查看全部问答>

cmd问题

本帖最后由 dontium 于 2015-1-23 12:44 编辑 求助:诚盼高手赐教程序编译通过之后,load .CMD 文件的时候提示我 Data verification failed at address 0x11800000.please verify target memory map. 用的是3530的板子 另附 CMD文件: ME ...…

查看全部问答>

运算放大器是否可以用来做比较器吗?

运算放大器是否可以用来做比较器吗?…

查看全部问答>

cc2530定位

本人zigbee小白,毕业论文是zigbee井下定位,有5块2530板子,想用rssi定位。但2430、1有z-location上位机软件,2530咋整?都说自己编算法,在哪编?用啥上位机软件显示图形啊?求指教啊!!!…

查看全部问答>