提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、模式配置寄存器CRL和CRH
  • 二、端口输入数据寄存器(GPIOx_IDR) (x=A..E)
  • 三、端口输出数据寄存器(GPIOx_ODR) (x=A..E)
  • 四、端口位设置/清除寄存器(GPIOx_BSRR) (x=A..E)
  • 五、端口位清除寄存器(GPIOx_BRR) (x=A..E)
  • 六、端口配置锁定寄存器(GPIOx_LCKR) (x=A..E)

前言

1、主要介绍stm32GPIO 相关的寄存器。
STM32 的 IO 口可以由软件配置成如下 8 种模式:
1、输入浮空
2、输入上拉
3、输入下拉
4、模拟输入
5、开漏输出
6、推挽输出
7、推挽式复用功能
8、开漏复用功能

【硬件干货】漏极开路?推挽输出?介绍GPIO的工作模式


STM32 的每个 IO 端口都有 7 组寄存器来控制。他们分别是:
1、两个配置模式的32 位的端口配置寄存器 CRL 和 CRH,控制着每个 IO 口的模式及输出速率;
3、两个 32 位的数据寄存器 IDR 和 ODR;
4、一个 32 位的置位/复位寄存器BSRR;
5、一个 16 位的复位寄存器 BRR;
6、一个 32 位的锁存寄存器 LCKR;这里我们仅介绍常用 的
几个寄存器,我们常用的 IO 端口寄存器只有 4 个:CRL、CRH、IDR、ODR。


一、模式配置寄存器CRL和CRH



该寄存器的复位值为 0X4444 4444,复位值其实就是配置端口为浮空输入模式。从上图还可以得出:STM32 的 CRL 控制着每组 IO 端口(A~G)的低 8 位的模式。每个 IO 端口的位占用 CRL 的 4 个位,高两位为 CNF,低两位为 MODE。这里我们可以记住几个常用的配置,比如 0X0 表示模拟输入模式(ADC 用)、0X3 表示推挽输出模式(做输出口用,50M 速率)、0X8 表示上/下拉输入模式(做输入口用)、0XB 表示复用输出(使用 IO 口的第二功能,50M 速率)。
CRH 的作用和 CRL 完全一样,只是 CRL 控制的是低 8 位输出口,而 CRH 控制的是高 8位输出口。这里我们对 CRH 就不做详细介绍了。
例:

GPIOC->CRH&=0XFFF00FFF;//清掉这 2 个位原来的设置,同时也不影响其他位的设置
GPIOC->CRH|=0X00038000; //PC11 输入,PC12 输出
GPIOC->ODR=1<<11; //PC11 上拉

二、端口输入数据寄存器(GPIOx_IDR) (x=A…E)

IDR 是一个端口输入数据寄存器,只用了低 16 位。该寄存器为只读寄存器,并且只能以16 位的形式读出。

三、端口输出数据寄存器(GPIOx_ODR) (x=A…E)


该寄存器为可读写,从该寄存器读出来的数据可以用于判断当前 IO 口的输出状态。而向该寄存器写数据,则可以控制某个 IO 口的输出电平。

四、端口位设置/清除寄存器(GPIOx_BSRR) (x=A…E)

该寄存器是对GPIOx_ODR寄存器的操作,我们之前举例时,都是用GPIOx_ODR去和一个16位数进行与运算和或运算,在进行运算时,需要求这个16位数,比较麻烦。不过可以移位法,将第一位置1,然后左移一定的位数(<<)。GPIOx_BSRR可以直接对GPIOx_ODR寄存器的某位进行设置。唯一不同的用GPIOx_BSRR操作GPIOx_ODR寄存器时,不用考虑GPIOx_ODR寄存器的不相关位。
![在这里插入图片描述](https://img-blog.csdnimg.cn/babed782c0d44360b2017cf634e7b6a2.png
GPIOx_BSRR也是32位寄存器,其中低16位是对GPIOx_ODR寄存器16个IO位置1,高16位是对GPIOx_ODR寄存器16个IO位置0。注意的是,如果GPIOx_BSRR的高16位和低16位都对某一IO口进行了配置,则以GPIOx_BSRR寄存器的低16位的配置为优先级

五、端口位清除寄存器(GPIOx_BRR) (x=A…E)

GPIOx_BRR寄存器也是32位寄存器,但是高16位被保留,所以可以把它当做是16位寄存器。它的作用是将对应的0~15 IO口清零。即当对应位为1时,对应IO口置0,当对应位为0时,对应IO口保持原来的状态。

编程时,只需:GPIO(A~E)=1<<m,即可将PXm置0。

六、端口配置锁定寄存器(GPIOx_LCKR) (x=A…E)

当执行正确的写序列设置了位16(LCKK)时,该寄存器用来锁定端口位的配置。位[15:0]用于锁定GPIO端口的配置。
注意:锁住的是端口配置寄存器CRL或CRH
在规定的写入操作期间,不能改变LCKP[15:0]。当对相应的端口位执行了LOCK序列后,在下次系统复位之前将不能再更改端口位的配置。每个锁定位锁定控制寄存器(CRL, CRH)中相应的4个位。

具体叙述一下:

首先第16位,即高16位的第1位为LCKK,要开启锁IO模式,必须先“开锁”,开锁密码:写1——>写0——>写1——>读0——>读1。最后的读1可省略,但其它“密码”顺序、内容都不能错。

    开锁程序:(GPIOB为例)uint32_t t;GPIOB->LCKR|=0x00010000;//LCKK写入1GPIOB->LCKR&=0x0000ffff;//LCKK写入0GPIOB->LCKR|=0x00010000;//LCKK写入1t=GPIOB->LCKR;//LCKK读0t=GPIOB->LCKR;//LCKK读出1

然后就是给某IO口上锁了,需要注意的是,只有第16位——>LCKK为0时,GPIOx_LCKR寄存器才可以被写入,某位写入1,则对应的IO口被锁住。

以PB5为例:

     //开启锁定寄存器模式GPIOB->LCKR&=0x0000ffff;//LCKK写入0GPIOB->LCKR=1<<5;//锁定PB5

在HAL库中有函数用于锁定GPIO

HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
/**
* @brief  Locks GPIO Pins configuration registers.
* @note   The locking mechanism allows the IO configuration to be frozen. When the LOCK sequence
*         has been applied on a port bit, it is no longer possible to modify the value of the port bit until
*         the next reset.
* @param  GPIOx: where x can be (A..G depending on device used) to select the GPIO peripheral
* @param  GPIO_Pin: specifies the port bit to be locked.
*         This parameter can be any combination of GPIO_Pin_x where x can be (0..15).
* @retval None
*/
HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
{__IO uint32_t tmp = GPIO_LCKR_LCKK;/* Check the parameters */assert_param(IS_GPIO_LOCK_INSTANCE(GPIOx));assert_param(IS_GPIO_PIN(GPIO_Pin));/* Apply lock key write sequence */SET_BIT(tmp, GPIO_Pin);/* Set LCKx bit(s): LCKK='1' + LCK[15-0] */GPIOx->LCKR = tmp;/* Reset LCKx bit(s): LCKK='0' + LCK[15-0] */GPIOx->LCKR = GPIO_Pin;/* Set LCKx bit(s): LCKK='1' + LCK[15-0] */GPIOx->LCKR = tmp;/* Read LCKK register. This read is mandatory to complete key lock sequence */tmp = GPIOx->LCKR;/* read again in order to confirm lock is active */if ((uint32_t)(GPIOx->LCKR & GPIO_LCKR_LCKK)){return HAL_OK;}else{return HAL_ERROR;}
}

配置好GPIO之后再调用这个函数可以看到


小灯依然会闪烁

STM32寄存器_GPIO操作相关推荐

  1. STM32寄存器操作端口模式CRL/CRH详解

    STM32寄存器操作端口模式CRL/CRH详解 首先,在开始讲解前,大家请先看如下一段代码: #define SDA_IN_24c02(){GPIOB->CRH&=0XFFF0FFFF; ...

  2. STM32寄存器的简介、地址查找,与直接操作寄存器

    什么是寄存器 提到单片机,就不得不提到寄存器.根据百度百科介绍,寄存器是中央处理器内的组成部分.寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令.数据和地址. 简单来说,寄存器就是存放东西的东西 ...

  3. 嵌入式固件开发之二——直接操作STM32寄存器的LED点灯测试程序和仿真

    2 直接操作STM32寄存器的LED点灯测试程序 2.1 创建并编译工程 双击桌面上的"Keil uVision5"图标,启动MDK. 点击"Project"- ...

  4. 【嵌入式系统基础第四周作业a】--STM32寄存器HAL库方式的LED程序

    文章目录 stm32f103c8t6板子点亮流水灯 1.部分原理阐述 1.1地址映射: 1.2寄存器映射: 1.3时钟配置: 1.4输入输出模式设置: 1.5STM32开发板流水灯操作: 2.具体实验 ...

  5. 一个寄存器有几个字节_STM32f103ZET6 学习资料 (连载2 寄存器的操作界限)

    在这之前抛出来几个图片.下面慢慢解释 APB2的 RCC_APB2ENR寄存器 <1> <2> <3> 注意入口参数 USART1 <4> 在STM32 ...

  6. STM32 寄存器库和固件库

    寄存器和固件库开发的差别和联系 固件库就是函数的集合,固件库函数的作用是向下负责与寄存器直接打交道.向上提供用户函数调用的接口(API). 在 51 的开发中我们经常的作法是直接操作寄存器,比方要控制 ...

  7. STM32寄存器点亮LED(什么是寄存器、GPIO工作方式、点亮原理)

    一.什么是寄存器   STM32编程通常有两种编程方法,一种是寄存器编程:另一种是固件库编程,其中寄存器编程是基础,而固件库编程是在寄存器编程的基础上升级而来的一种易于学习和开发的方法,是学习STM3 ...

  8. 嵌入式学习笔记——使用寄存器编程操作GPIO

    使用寄存器编程操作GPIO 前言 GPIO相关的寄存器 GPIO 端口模式寄存器 (GPIOx_MODER) (x = A..I) 位操作 GPIO 端口输出类型寄存器 (GPIOx_OTYPER) ...

  9. 基于STM32寄存器版的嵌入式智慧仓库

    基于STM32寄存器版的嵌入式智慧仓库 1.项目背景 项目环境背景 项目运作的可行性 项目的优势分析 2.总体设计 3.外设选取和引脚连接 外设选取 引脚连接 4.系统架构 5.驱协开发 LED驱动 ...

最新文章

  1. 微博更经济的异地容灾方案是怎么搞的
  2. 代码审计XSS 0day
  3. 如何去学会黑客技术,黑客电脑技术学习必备知识
  4. android 分析boot.img,Android 系统准备知识-bootimg文件的结构
  5. 从技术风口到行业应用,开启区块链与产业深度融合之路
  6. oracle 的自增需要依靠序列和触发器共同实现
  7. Golang网络游戏协议处理框架
  8. DBA最缺的不是技术
  9. 半/全加器中的异或门和与门的应用
  10. CorelDRAW X8超低价优惠啦,你却还在用CDR X4破解?!
  11. pdf文件如何在安卓手机端不用下载在线预览
  12. 数字图像处理 - 相关资源整理
  13. C语言文件详解(一)文件介绍,文件打开和关闭
  14. 如何获取最新的EI期刊杂志目录
  15. 直方图均衡化、规定化、局部直方图均衡化、直方图统计
  16. 1.JAVA基础汇总
  17. “腾讯TLive-无缝接流”护航各大卫视跨年晚会完美收官
  18. 计算机毕业设计系列基于SSM的网上书城系统
  19. OpenGL/OpenGL ES入门:渲染YUV数据实践
  20. uni-app升级APP,包含apk整包升级和wgt应用资源升级

热门文章

  1. 杨梅派 (Waxberry Pi)手册
  2. cmd命令卸载sql server_Ubuntu下部署SQL Server 2017(安装及使用方法,卸载方法)
  3. 时钟初始化flash设置
  4. layer.js确认框
  5. spack的环境搭配
  6. android 类似金山词霸 每日一句源代码 csdn,个人作业2——英语学习APP案例分析(示例代码)...
  7. 机器学习案例——鸢尾花数据集分析
  8. 如何做到年薪 50 万的程序员?
  9. 中职组网络安全2023年山东省赛zip文件破解
  10. 速算小天才 隐私政策协议