STM32的库如何实现对同一组IO口的一部分引脚进行读写

发布者:EuphoricMelody最新更新时间:2020-11-09 来源: 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详细整理

推荐阅读最新更新时间:2024-11-18 20:33

解析STM32的启动过程
当前的嵌入式应用程序开发过程里,并且C语言成为了绝大部分场合的最佳选择。如此一来main函数似乎成为了理所当然的起点 因为C程序往往从main函数开始执行。但一个经常会被忽略的问题是:微控制器(单片机)上电后,是如何寻找到并执行main函数的呢?很显然微控制器无法从硬件上定位main函数的入口地址,因为使用C语言作为开发语言后,变量/函数的地址便由编译器在编译时自行分配,这样一来main函数的入口地址在微控制器的内部存储空间中不再是绝对不变的。相信读者都可以回答这个问题,答案也许大同小异,但肯定都有个关键词,叫 启动文件 ,用英文单词来描述是 Bootloader 。 无论性能高下,结构简繁,价格贵贱,每一种微控制器(处理器)都必须
[单片机]
STM32 mdk软件仿真时过不去时钟的问题
stm32的程序用MDK软件仿真时,由于系统时钟初始化函数里有个等待系统时钟准备好的循环,所以过不去。 设置方式如下:这么设置之后仿真时就可以直接进入main函数了。
[单片机]
<font color='red'>STM32</font> mdk软件仿真时过不去时钟的问题
STM32 TIM定时器 库函数学习笔记
一些库函数的用法手册上讲得不甚详细,网上也几乎没有资料,把我个人理解的一些东西和大家分享一下,如有错漏请批评指正。 TIM_DeInit(TIM2); //注意:按缺省值复位后,时钟源为内部时钟,不必再调用函数设置。如需要更改定时器计时的时钟源, //调用后面的那几个相关函数就行。定时器的时钟不是直接来自APB1/2,而是来自于输入为APB1/2的一个倍频器。 //当APB1/2的预分频系数为1时,定时器的时钟频率等于APB1/2的频率; //当APB1/2的预分频系数为其它数值时,定时器的时钟频率等于APB1/2的频率两倍。 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructur
[单片机]
STM32——FLASH(掉电保存)
今天使用STM32的FLASH进行保存数据,实现掉电保存的功能。 掉电保存:使用FLASH存储时,在每一次数据刷新后,进行一次存储即可。 PS:重新下载时,会刷新保存的数据。 FLASH编程思路: 写入:先执行擦除数据(页擦除||全片擦除),再进行写入操作 写入范围:0x08000000 +程序大小 写入地址 + 写入字节 = flash大小(根据芯片的数据手册可以查看) flash写入过程: 1,读FLASH_CR的LOCK 2,FLASH_SR的BSY位,是否有其他编程正在操作 3,设置FLASH_CR的PG位为1 4,指定的地址写入要编程的半字 5,等待BSY位变为0 6,读出写入的地址并验证数据 flash页擦除过程
[单片机]
STM32单片机FSMC模块的应用
一、基本概念 1.与非总线复用的16位SRAM接口 FSMC配置 SRAM存储器和NOR闪存存储器共用相同的FSMC存储块,所用的协议依不同的存储器类型而有所不同。 控制SRAM存储器,FSMC应该具有下述功能: 使用或禁止地址/数据总线的复用功能。 选择所用的存储器类型:NOR闪存、SRAM或PSRAM。 定义外部存储器的数据总线宽度:8或16位。 使用或关闭扩展模式:扩展模式用于访问那些具有不同读写操作时序的存储器。 正如配置NOR闪存存储器一样,用户必须按照SRAM存储器的数据手册给出的时序数据,计算和设置下列参数: ADDSET:地址建立时间 ADDHOLD:地址保持时间 DATAST:数据建立时间 二、例程 1.
[单片机]
STM32单片机内存管理器实用代码解析与工程应用指南
本代码适用于无操作系统的STM32单片机开发,功能强大。 可申请到地址空间连续的不同大小的内存空间,且用户接口简单,使用方便。 直接复制粘贴如下代码即可: memory.h: #ifndef __MEMORY_H__ #define __MEMORY_H__ #include stdio.h #include string.h #include includes.h //用户使用 typedef struct { void *addr;//申请到的内存的起始地址 uint32_t size;//申请到的内存的大小,按照块大小分配,大于等于申请大小 uint16_t tb; //申请表序号,申
[单片机]
STM32 ST-LINK Utility程序烧录方法
打开软件过后点击Target-》connect 出现以下界面表示STlink链接成功 如果出现没有检测到stlink的话,首先查看是否安装驱动程序,再重新插拔电脑usb口的stlink连接线(或者链接到主机后方的usb口) 再重复以上步骤链接,链接成功过后再次点击Target然后点击AutoMatic Mode 然后选择升级的HEX文件然后点击Start 显示以上信息表示程序烧录完成 软件官网下载比较麻烦这里附上下载链接(内容包含ST-Link驱动) https://cloud.189.cn/web/share?code=VJZre2EzmiIf(访问码:n9rt)
[单片机]
<font color='red'>STM32</font> ST-LINK Utility程序烧录方法
杨祉雄:云计算的真正发展来自企业应用
    编者按:国际知名市场研究机构Gartner发表评论称,云计算是2010年最具影响力的IT技术,也是2011年对众多公司最具战略意义的技术。近日,用友软件旗下企业伟库公司总裁杨祉雄应邀,在《经济日报》云计算相关专题上撰写观点文章,认为:云计算的真正发展来自企业应用。     云计算是2011年IT最热门的关键词。     作为继大型机,个人计算机,互联网后的第四IT次革命,云计算正在改变我们的工作和生活方式,重构IT次序,改变企业经营。     在云计算上,尽管中国起步稍晚,但与先进水平差距尚未拉开,因此我们有很多机会参与这场全球信息工业的洗牌,从而涌现出一批中国的世界级IT企业。     国家已经把云计算作
[网络通信]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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