首页 > 其他分享 >STM32 GPIO 寄存器的配置

STM32 GPIO 寄存器的配置

时间:2024-08-28 16:36:38浏览次数:13  
标签:15 16 32 GPIOx 端口 STM32 寄存器 GPIO

32位配置寄存器:GPIOx_CRL,GPIOx_CRH
32位数据寄存器:GPIOx_IDR,GPIOx_ODR
32位置位/复位寄存器:GPIOx_BSRR
16位复位寄存器:GPIOx_BRR
32位锁定寄存器:GPIOx_LCKR

GPIO 寄存器详解

CRL和CRH控制IO口,是四个位控制一个口,所以要两个32位的来控制16个口

CRL

32位端口配置低寄存器(GPIOx_CRL) (x=A..E)

CNFy[1:0]:端口x配置位(y = 0…7)
在输入模式(MODE[1:0]=00):
00:模拟输入模式
01:浮空输入模式(复位后的状态)
10:上拉/下拉输入模式
11:保留
在输出模式(MODE[1:0]>00):
00:通用推挽输出模式
01:通用开漏输出模式
10:复用功能推挽输出模式
11:复用功能开漏输出模式
------------
MODEy[1:0]:端口x的模式位(y = 0…7)
00:输入模式(复位后的状态)
01:输出模式,最大速度10MHz
10:输出模式,最大速度2MHz
11:输出模式,最大速度50MHz

CRH

32位端口配置高寄存器(GPIOx_CRH) (x=A..E)

CNFy[1:0]:端口x配置位(y = 8…15)
------------
MODEy[1:0]:端口x的模式位(y = 8…15)

IDR

32位端口输入数据寄存器(GPIOx_IDR) (x=A..E)

位31:16 保留,始终读为0。

位15:0 IDRy[15:0]:端口输入数据(y = 0…15) (Port input data)
这些位为只读并只能以字(16位)的形式读出。读出的值为对应I/O口的状态。

ODR

32位端口输出数据寄存器(GPIOx_ODR) (x=A..E)

位31:16 保留,始终读为0。

位15:0 ODRy[15:0]:端口输出数据(y = 0…15) (Port output data)
这些位可读可写并只能以字(16位)的形式操作。
注:对GPIOx_BSRR(x = A…E),可以分别地对各个ODR位进行独立的设置/清除。

BRR、BSRR是原子操作,不会被中断操作打断

BSRR

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

位31:16
BRy: 清除端口x的位y (y = 0…15) (Port x Reset bit y)
这些位只能写入并只能以字(16位)的形式操作。
0:对对应的ODRy位不产生影响
1:清除对应的ODRy位为0
注:如果同时设置了BSy和BRy的对应位, BSy位起作用。
------------
位15:0
BSy: 设置端口x的位y (y = 0…15) (Port x Set bit y)
这些位只能写入并只能以字(16位)的形式操作。
0:对对应的ODRy位不产生影响
1:设置对应的ODRy位为1

BRR

端口位清除寄存器(GPIOx_BRR) (x=A..E)

位31:16 保留。

位15:0 BRy: 清除端口x的位y (y = 0…15) (Port x Reset bit y)
这些位只能写入并只能以字(16位)的形式操作。
0:对对应的ODRy位不产生影响
1:清除对应的ODRy位为0

LCKR

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

位31:17 保留。

位16
LCKK:锁键 (Lock key)
该位可随时读出,它只可通过锁键写入序列修改。
0:端口配置锁键位激活
1:端口配置锁键位被激活,下次系统复位前GPIOx_LCKR寄存器被锁住。
锁键的写入序列:
写1 -> 写0 -> 写1 -> 读0 -> 读1
最后一个读可省略,但可以用来确认锁键已被激活。
注:在操作锁键的写入序列时,不能改变LCK[15:0]的值。
操作锁键写入序列中的任何错误将不能激活锁键。
------------
位15:0
LCKy: 端口x的锁位y (y = 0…15) (Port x Lock bit y)
这些位可读可写但只能在LCKK位为0时写入。
0:不锁定端口的配置
1:锁定端口的配置

寄存器代码实现

LED控制

以PC4为例,LED 的负极连接到 GND,而正极连接到 PC4

void LED_Init(void)
{
    RCC->APB2ENR|=1<<4;    //使能时钟 PORTC
    GPIOC->CRL&=0XFFF0FFFF;//PC4 配置位清零
    GPIOC->CRL|=0X00030000;//PC4 推挽输出
    GPIOC->ODR|=1<<4;      //PC4 输出高电平,熄灭。等价于 GPIOC->ODR |= 0X10;
}
int main()
{
    GPIOC->BSRR = 0x10;//设置对应的 ODRy 位为 1,给高电平->熄灭
    GPIOC->BRR = 0x10; //清除对应的 ODRy 位为 0,给低电平->点亮
}

标签:15,16,32,GPIOx,端口,STM32,寄存器,GPIO
From: https://www.cnblogs.com/songpoetry/p/18385051

相关文章

  • stm32F4系列 CCM_RAM使用
    stm32F4系列CCM_RAM使用使用方法1、这种情况下,所有管理工作都是编译来处理的,不方面用户将变量定义到指定的CCM或者SDRAM中。而使用__attribute__指定具体地址又不方便管理。针对这种情况,使用一个脚本文件即可解决,脚本定义如下:;*************************************......
  • 基于stm32f103c8t6的智能蓝牙遥控小车(有代码)
    智能小车对于初学者而言还是有点挑战性的,由于本人一直以来都在专注于学业绩点,很少有时间来学习stm32,但这学期开始课慢慢的变少,所以又开始学习32顺便做一些小项目,本文将以stm32为核心制作蓝牙遥控小车。之后我也会继续发一些其他的小项目资料和经验总结。所需材料:12v的电源3......
  • 最全!嵌入式STM32单片机开发环境配置教学Win/Mac!!!
    嵌入式STM32单片机开发环境配置教学Win/Mac    ·本教程支持Windows和Mac    ·Windows可选的开发软件为Keil、Clion、STM32CubeMX,可自由选择开发方式    ·Mac的开发环境为(Clion+OpenOCD+STM32CubeMX),仅支持HAL库Windows配置教程        在Windows......
  • STM32学习记录-08-USART串口
    1通信接口        通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统        通信协议:制定通信的规则,通信双方按照协议规则进行数据收发                USART:TX数据发送、RX数据接收        I2C:SCL时钟、SDA数据  ......
  • MQ-2烟雾传感器模块功能实现(STM32)
    烟雾传感器在家庭安全系统中扮演着重要角色,能够及时检测到火灾初期的烟雾,从而保护人们的生命财产安全。MQ-2烟雾传感器是一种广泛使用的传感器,它能够检测多种可燃气体和烟雾。本文将介绍如何使用STM32微控制器来实现MQ-2烟雾传感器模块的功能。实验目的理解MQ-2烟雾传感器......
  • FPGA与STM32_FSMC总线通信实验
    在嵌入式系统设计中,FPGA(现场可编程门阵列)与微控制器如STM32的通信是常见的应用场景。STM32通过FSMC(灵活静态存储控制器)接口与FPGA进行数据交换,可以实现高速数据传输和复杂逻辑控制。本文将介绍如何通过FSMC总线实现STM32与FPGA之间的通信。实验目的理解FSMC总线的基本工作......
  • stm32f103c8t6 程序编译后的 Program Size: Code=xxx RO-data=xxx RW-data=xxx ZI-dat
            之前在裸机跑一些简单的项目内存完全够用,就不会涉及到内存方面的问题。最近在学FreeRTOS时,将大容量的stm32f103rct6代码移植到小容量的stm32f103c8t6上时,就遇到了内存不足的问题,所以才注意到这些东西。    那么在我们编译后看到的这些东西到底......
  • IDA反汇编STM32代码学习记录
    首先,使用IDA反汇编STM32代码应该打开的是bin文件,而不是.hex或.axf文件,只有bin文件是和下载到flash内的数据一致的。具体参见:三种文件的区别那么,怎么生成bin文件呢,在有工程的情况下,在MDK中是在user的afterbuild后添加命令:fromelf--bin-o./Output/@L.bin./Output/@L.axf@L代......
  • STM32或者RSIC-V输出SPWM波形
    直接上代码吧,其余的内容可以到别的地方搜索,包括什么是SPWM /*@NotePWMoutputroutine:TIM1_CH1(PA8)ThisexampledemonstratesthattheTIM_CH1(PA8)pinoutputsPWMinPWMmode1andPWMmode2.*/#include"debug.h"/*PWMOutputModeDefinition*/#definePWM_M......
  • java实现线性反馈移位寄存器实例
    题目:3级线性反馈移位寄存器C3=1时可有4种线性反馈函数,设其初始状态为(a1,a2,a3)=(1,0,1),输出由它们得到的密钥流,并分别利用生成的密钥流对明文“0x0123456789ABCDEF”进行加密,输出加密后的结果,再对密文进行解密,输出解密后的结果。1.分析相关题目详解:3级线性反馈移位寄存器......