STM32L GPIO
1. 每个GPIO均有以下寄存器:
- 4个32位配置寄存器:GPIOx_MODER、GPIOx_OTYPER、GPIOx_OSPEEDR和GPIOx_PUPDR
GPIOx_MODER :配置IO端口方向为输入/输出/AF/模拟
GPIOx_OTYPER :选择输出类型:推挽/开漏GPIOx_OSPEEDR :选择IO速度(与IO端口方向无关)GPIOx_PUPDR :选择上拉/下拉电阻(与IO端口方向无关)
- 2个32位数据寄存器:GPIOx_IDR、GPIOx_ODR
- 1个32位置位/复位寄存器:GPIOx_BSRR(使用该寄存器读写寄存器可以避免在读写期间被IRQ中断,该读写操作属于一个原子操作)
该寄存器允许置位/复位GPIOx_ODR上指定的一位,GPIOx_ODR上每位关联到两个控制位:GPIOx_BSRR:BSRR(i) [Bits 15:0]和 GPIOx_BSRR:BSRR(i+SIZE)[Bits31:16];往GPIOx_BSRR:BSRR(i) [Bits 15:0]写1 可以置位对应的ODR;往GPIOx_BSRR:BSRR(i) [Bits 31:16]写1 可以置位对应的ODR;往该寄存器写0不会产生任何影响
- 1个32位锁定寄存器:GPIOx_LCKR
必需通过通过一个特殊的读写时序才能写入该寄存器,但时序正确时,bit16会置位(lock key active),bits[15:0]显示哪些IO端口被锁定了,端口被锁定之后直到下一个复位才能解锁,锁定之后以下寄存器将被冻结:GPIOx_MODER、GPIOx_OTYPER、GPIOx_OSPEEDR、GPIOx_PUPDR、GPIOx_AFRH、GPIOx_AFRL
- 2个复用功能寄存器:GPIOx_AFRH、GPIOx_AFRL
2. 每个GPIO端口均可单独设置为以下模式:
- 输入+悬空
- 输入+上拉
- 输入+下拉
- 模拟(用作ADC、DAC输出或者捕获输入情况下)
- 输出+开漏+上拉/下拉(输出模式下GPIO的输出速度是可配置的)
- 输出+推挽+上拉/下拉
- 复用功能+推挽+上拉/下拉
- 复用功能+开漏+上拉/下拉
下图为GPIO的架构图:
3. GPIO一般用途
- 默认情况或者刚复位后,所有IO端口被设置为输入+悬空模式,除了调试接口默认设置为了复用功能+上拉/下拉
- 当端口被设置为输出的时候,修改GPIOx_ODR对应可改变输出高低电平(一般会使用推挽或者开漏输出(输出低电平时,只有N-MOS是接通的))
- 当端口被设置为输入的时候,每个AHB总线时钟均会捕获端口上高低电平,并存放在GPIOx_IDR寄存器
- 所有的GPIO端口均可通过配置寄存器使能或不使能内部弱上拉/弱下拉
4 .I/O端口多路复用及映射
IO端口通过一个内部的多路选择器以允许在同一时刻只使用一种复用功能,这样使得多个外围电路共享同样的IO端口每个IO端口可以通过配置GPIOx_AFRL和GPIOx_AFRH设置所使能的复用功能(AF0~AF15)
- 复位之后,所有的IO连接到复用功能0(AF0)
- 外围电路的复用功能映射到AF1~AF14
- Cortex-M3 EVENTOUT映射到AF15
以下说明如何使用复用功能:
- System Function:配置IO端口使能的复用功能(JTAG/SWD,在复位之后对应端口会被调试器设置为调试功能下且不受GPIO寄存器的控制;RTC_50HZ,对应端口需要设置为输入+悬空;MCO,该端口必需配置在复用模式下)
- GPIO:根据需要配置GPIOx_MODER设置IO端口工作模式(输入、输入/模拟)
- Perpheral‘s Alternate Function:对于ADC/DAC,配置IO为模拟;对于其他外围功能,配置GPIOx_MODER、GPIOx_OTYPE、GPIOx_PUPDR、GPIOx_OSPEEDER
- EVENTOUT:配置IO端口复用功能AF15,用于输出Cortex-M3 EVENTOUT信号
![]()
5. 外部中断/唤醒
6. 输入模式配置所有的IO端口均有外部中断功能,使用外部中断功能时,IO端口必需设置为输入模式
当IO端口配置为输入模式时:
- 输出模式被禁用
- 施密特触发器被激活
- 根据GPIOx_PUPDR寄存器使能上拉/下拉电阻
- 每个AHB时钟均会采样IO端口上的值存放到输入数据寄存器中
- 通过读取输入数据寄存器可以检测IO状态
7. 输出模式配置
当IO端口配置为输出模式时:
- 输出模式使能
- 施密特出发器被激活
-- 开漏模式时:输出0时,N-MOS导通(P-MOS任何情况下不会导通)-- 推挽模式时:输出0时,N-MOS导通;输出1时,P-MOS导通
- 根据GPIOx_PUPDR寄存器使能弱上拉/下拉
- 每个AHB时钟均会采样IO端口上的值存放到输入数据寄存器中
- 通过读取输入数据寄存器可以检测IO状态
- 通过读取输出数据寄存器可以得到最后写入的值
8. 复用功能配置
当IO端口配置为复用功能时:
- 输出模式下可配置为开漏或推挽
- 复用功能的输出信号将驱动输出缓冲区
- 输入端的施密特触发器被激活
- 根据GPIOx_PUPDR寄存器使能弱上拉/下拉
- 每个AHB时钟均会采样IO端口上的值存放到输入数据寄存器中
- 通过读取输入数据寄存器可以检测IO状态
9. 模拟模式配置
当IO端口配置为模拟模式时:
- 输出模式被禁用
- 输入模式下的施密特触发器被激活(为每个IO口的模拟值提供零功耗,施密特触发器的输出端被强制输出为0)
- 弱上拉/下拉被禁用
- 读取输入寄存器获取到0
10. 外部时钟/外部晶振端口复用
- 没有使用LSE时,OSC32_IN和OSC32_OUT 可配置为一般用途的IO端口
- 没有使用HSE时,OSC_IN和OSC_OUT 可配置为一般用途的IO端口
11. 选择RTC_AF1复用功能
STM32L152XX拥有以下特性
- 两个GPIO端口可配置为唤醒源WKUP1和WKUP3
- 一个GPIO端口可配置为唤醒源WKUP2,可用于检测篡改、时间戳事件,输出RTC AFO_ALARM、AFO_CALIB
RTC_AF1端口(PC13)可配置为以下功能:
- 唤醒源(WKUP2):配置PWR_CSR寄存器中的EWUP2位
- RTC AFO_ALARM输出:根据RTC_CR寄存器中的OSEL[1:0]输出可配置为:RTC Alarm A、 RTC Alarm B、RTC Wakeup
- RTC AFO_CALIB输出:配置RTC_CR寄存器中的COE[23]位
- RTC AFI_TAMPER1 : 篡改事件检测
- 时间戳事件检测
12. 初始化GPIO端口例子
void Init_GPIOS(void){
GPIO_InitTypeDef GPIO_InitStructure; //定义初始化结构体
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,ENABLE); //使能对应AHB总线时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; //根据需求配置GPIO工作模式
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIO端口
}