历史上的今天

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

正在发生

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

发布者:EuphoricMelody 来源: eefocus关键字:STM32  IO口  读写 手机看文章 扫描二维码
随时随地手机看文章

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

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;// 使用规则一和规则二


关键字:STM32  IO口  读写 引用地址:STM32的库如何实现对同一组IO口的一部分引脚进行读写

上一篇:STM32的GPIO口的8种配置模式
下一篇:STM32的嵌套中断系统NVIC和RCC详细整理

推荐阅读

机器人是“制造业皇冠顶端的明珠”,其研发、制造、应用是衡量一个国家科技创新和高端制造业水平的重要标志。近日,聚焦“机器人与智能制造”话题,近百位领域内专家、学者在省自然基金委主办的第三期燕赵科学论坛上,分享了机器人技术研究的最新进展。“拥抱触手可及的机器人时代”成为本次论坛主题,这传递出专家学者对机器人技术将获得更广泛应用的强烈...
本设计以单片机AT89C51为核心,通过软件编程利用其定时器产生PWM信号从而实现对直流电机转速控制。硬件设计主要包括按键电路模块、电机驱动模块、测速模块和转速显示模块。其中采用独立式键盘通过按键将命令输入到单片机,改变PWM信号占空比,再将单片机输出的信号通过光电耦合器和由IGBT组成的H型桥式功率放大驱动电路,根据不同占空比的PWM信号达到电机...
  引言   长久以来,土壤的温度、水分一直是农业研究领域的重点研究对象。作为土壤的两大基本属性,土壤温度、水分的细微变化都会对农作物的生长产生极大的影响。很多研究表明,在土地水土保持、农业节水灌溉、土壤的肥力调配、大范围的局地性气候变化和生态环境保护诸多研究领域中,土壤温度、水分的时空性变化也是极为重要的两个参考性因素。因此,...
1.无显示。泰克示波器不显示的故障原因及泰克示波器维修方法:通常有以下原因造成故障如:保险丝坏了、高压输出线连接不可靠、信号线连接不正常、电源板故障、显示器坏了等,根据不同原因更换元器件或重新连接即可。2.显示花屏。故障原因及修理方法:可由显示电路排线接触不良引起,重新安装牢固或更换即可。3.按按钮或拧旋钮时不起作用、调节不连贯或显示...

史海拾趣

问答坊 | AI 解惑

DS2705主控制器数据资料

利用两片专用IC构成完备的SHA-1主控制器和令牌方案 缩短研发时间 无需分离器件或微控制器软件及硬件开发 专用的“通过/无效”引脚报告认证结果 …

查看全部问答∨

pelco矩阵切换器

谁有pelco矩阵切换器CM4800E-48×8的中文使用手册?…

查看全部问答∨

循迹小车设计方案

小弟在这先谢谢各位了!…

查看全部问答∨

如何在WINDOWS CE的应用程序的Button设置图片

在一个窗体的Button贴上图片,或者设置背景图片 请不要跟我说CBitmapButton, 然后用LoadBitmaps() 这个类在WINDOWS CE上是没有的 那要用什么方法, 好像BitBlt可以 但是不知道怎么用 …

查看全部问答∨

EdbgOutputDebugString 问题

EdbgOutputDebugString函数在哪儿定义的? 今天发现它可能存在bug。想把它掏出来瞅瞅。…

查看全部问答∨

在线等cosmic4.3.4

为什么向cosmic发了邮件申请16K的许可证一直没有回复,用过的帮忙说下.... 或者帮小弟传个附件我直接发送,谢谢了...…

查看全部问答∨

【挖电源】TOP系列开关电源制作

以前不懂开关电源怎么调试,以为把变压器饶好一定的砸数就完事,可是做出来的电源总是不行,要不就是带负载不行,或者是启动不了,偶尔烧东西 然后才知道,TOP算是反激式的需要调整初级电感量的,原来如此!     这个是用公司里的EE2 ...…

查看全部问答∨

分享实验买的超声波模块带原理图与PCB

本帖最后由 paulhyde 于 2014-9-15 03:43 编辑 我们实验室买的超声波模块 分享大家     带原理图与PCB文件  …

查看全部问答∨

有没有那位朋友使用pic的sourceboost ?

有没有那位朋友使用pic的sourceboost ?…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved