STM32外设:通用输入输出 GPIO、EXIT

时间:2024-02-16 15:43:49

主要外设:

  • GPIO:General Purpose I/O 一般用途IO
  • EXIT:External Interrupt/Event Controller 外部中断/事件控制器(STM32)

辅助外设:

  • SYSCFG:System configuration controller系统配置控制器(STM32)
  • NVIC:Nested Vectored Interrupt Controller嵌套向量中断控制器(ARM)
  • SCB:System Control Block系统控制块(ARM)

IO引脚

  • 默认作为一般用途的引脚,引脚↔GPIO↔CPU
  • 用代码设为专用功能引脚,引脚↔GPIO↔片上外设的某个外部引脚(复用)(利用GPIO的输入电路、输出电路、增加少量控制单元)

GPIO中的基本电路

输出电路

选择输出速度OSPEEDR→选择推挽/开漏OTYPER→选择上下拉电阻PUPDR→保护二极管→引脚

  • 保护二极管:当输入电压过高或过低时,二极管导通,输入电压拉到VDD或GND,保护STM32 MCU
  • 上下拉电阻 pull-up/pull-down:内部带有很弱的上下拉电阻绝大多数情况不使用
  • 输出类型-推挽Push-Pull:绝大多数情况,可输出VDD或GND
  • 输出类型-开漏Open Drain:很少情况,可输出GND或浮空(输出高电平需要外接电源和上拉电阻,用于输出电平转换、多个OD输出并联实现“线与”、I2C)
  • 输出速度:输出驱动电路的响应速度,跟应用相匹配,速度配置越高,噪声越大,功耗越大。
GPIO寄存器 作用 数量x位宽
OSPEEDR 输出速度 16x2bit 0-低速2MHz、1-中速25MHz、2-快速50MHz、3-高速80MHz~100MHz
OTYPER 输出类型 16x1bit 0-输出推挽、1-输出开漏
PUPDR 上下拉电阻 16x2bit 0-无(浮空)、1-上拉、2-下拉

输入电路

TTL施密特触发器←选择上下拉电阻PUPDR←保护二极管←引脚

GPIO寄存器 作用 数量x位宽
PUPDR 上下拉电阻 16x2bit 0-无(浮空)、1-上拉、2-下拉
  • TTL施密特触发器:信号进行数字采样

一、GPIO_Output:通用输出模式

主要功能:CPU写入BSRR或ODR寄存器,控制引脚输出高低电平

数据通路:
CPU→...→[选择置位/复位BSSR]→选择输出电平ODR→输出电路→引脚GPIO_Output

GPIO寄存器 作用 数量x位宽
MODER 模式 16x2bit 0-输入、1-通用输出、2-复用功能、3-模拟
BSRR 置位/复位 16x2bit BitReset:0-无操作、1-复位
BitSet:0-无操作、1-置位
ODR 输出数据 16x1bit 0-低电平、1-高电平

User Label(可选):用来给引脚起别名,提高代码可读性、移植性(更换引脚时只修改宏),对GPIO端口和引脚定义宏

//在main.h中
#define XXX_GPIO_Port    GPIOx
#define XXX_Pin          GPIO_PIN_y

硬件设计

PA5外接高电平驱动方式的指示灯电路(驱动指示灯:高电平)

CubeMX的配置

  1. 引脚分配Pinout View
  • 搜索PA5 设置为GPIO_Output
  1. 外设配置
  • System Core-GPIO-引脚清单(单击) → PA5配置 → 用户标签=LED2、(工作)模式=Output Push Pull、(初始)输出电平=low、最大输出(翻转)速度=low、上下拉电阻=No

用户代码

//USER CODE3:后台程序(无限循环)
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);//输出高电平
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);//输出低电平
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);//输出电平翻转
HAL_Delay(1000);

二、GPIO_input:输入模式(轮询)

主要功能:CPU读取IDR寄存器,读取引脚电平

  • 轮询、CPU忙等、效率低
  • 作为复位后的默认工作模式

数据通路:
CPU←...←APB外设总线←存储输入电平IDR←输入电路←引脚GPIO_input

GPIO寄存器 作用 数量x位宽
MODER 模式 16x2bit 0-输入、1-通用输出、2-复用功能、3-模拟
IDR 输入数据 16x1bit 0-低电平、1-高电平

硬件设计

PC13外接上拉式按键(按键控制:按下为低电平)

CubeMX的配置

  1. 引脚分配Pinout View
  • 搜索PC13 设置为GPIO_Input
  1. 外设配置
  • System Core-GPIO-引脚清单(单击) → PC13配置 →用户标签=KEY1、(工作)模式=input mode、上下拉电阻=No

用户代码

//USER CODE3:后台程序(无限循环)
if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13)==GPIO_PIN_RESET){//按键按下
    HAL_Delay(10);//延迟去抖动
    if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13)==GPIO_PIN_RESET){//按键仍然按下
     //TODO 执行按键按下后的操作
    }
}
//等待释放:知道引脚变为高电平
while(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13)==GPIO_PIN_RESET);

三、GPIO_Exit:输入模式(中断)

主要功能:先将GPIO和EXIT建立连接,再由EXIT、NVIC的配置,决定CPU何时调用中断回调函数(外部中断External Interrupte)

数据通路:
中断回调函数←...←CPU←...←NVIC←...←APB外设总线←挂起请求PR←中断屏蔽IMR←[软件触发SWIER]←边沿监测RTSR和FTSR←Exit输入线(0~15号)←SYSCFG_EXTICR(引脚分组)←输入电路←引脚GPIO_Exit

  • GPIO在GPIO_Input模式下:接收外部输入
  • SYSCFG的EXTICR位:负责将GPIO的输入电路和EXIT的输入线连接
  • EXIT:设置触发条件(上升沿RTSR、下降沿FTSR、双边沿、软件触发SWIER)、中断屏蔽IMR、保存中断标记PR(是否触发的状态)、发送给NVIC
  • PR寄存器的注意事项:软件写1清0,方便对其他bit写0不变 (若写0清0的话,会导致其他状态位的挂起状态也被清空)
GPIO寄存器 作用 数量x位宽
MODER 模式 16x2bit 0-输入、1-通用输出、2-复用功能、3-模拟
SYSCFG寄存器 作用 数量x位宽
EXTICR1~4 外部中断配置 16x4bit IO引脚→(9-1 MUX)→EXIT输入线
0-PA口 1-PB口 2-PC口 3-PD口 4-PE口 5-PF口 6-PG口 7-PH口 8-PI口
EXIT寄存器 作用 数量x位宽
RTSR 上升沿触发选择(中断触发条件) 0-禁止、1-允许
FTSR 下降沿触发器选择(中断触发条件) 0-禁止、1-允许
SWIER 软件中断/事件(中断触发条件) 0-无操作、1-软件触发
IMR 输入线的中断请求(中断屏蔽) 23x1 0-禁止、1-允许
PR 挂起请求(中断标志位) 0-没有触发或有触发且被CPU处理、1-有触发且尚未被CPU处理(挂起状态)、
软件写1清0或更改RTSR、FTSR时清0

16个输入线→EXIT→NVIC(7个中断通道)

EXIT 0~4分别具有独立的中断通道

  • EXIT 0→EXTI0_IRQHandler
  • EXIT 1→EXTI1_IRQHandler
  • EXIT 2→EXTI2_IRQHandler
  • EXIT 3→EXTI3_IRQHandler
  • EXIT 4→EXTI4_IRQHandler

EXTI5~EXIT9共享同一个中断通道

  • EXIT 5~9→EXTI9_5_IRQHandler

EXTI10~EXIT15共享同一个中断通道

  • EXIT 10~15→EXTI15_10_IRQHandler

  • NVIC:中断优先级分组、中断优先级设置、中断使能(判定优先级、中断屏蔽、决定是否发给CPU)

  • CPU:并进行中断响应、调用中断函数

  • CPU调用中断服务程序:先判断EXIT的PR是否有挂起中断,若有挂起中断、则先清中断(EXIT的PR写1清0)、再调用用户自定义的中断回调函数

  • EXTIx_IRQHandler:重写了汇编启动文件中EXTIx_IRQHandler(在stm32f4xx_it.c中CubeMX自动生成)

  • HAL_GPIO_EXTI_IRQHandler(GPIO_Pin):定义中断回调函数的统一入口,包含EXIT中断的不同外设相同处理的部分(在stm32f4xx_hal_gpio.c中HAL库定义)

    • __HAL_GPIO_EXTI_GET_IT(GPIO_Pin):获取EXIT的PR状态(在stm32f4xx_hal_gpio.h中HAL库定义)
    • __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin):清中断(EXIT的PR写1清0)(在stm32f4xx_hal_gpio.h中HAL库定义)
  • HAL_GPIO_EXTI_Callback(GPIO_Pin):EXIT中断的不同外设不同处理的部分,中断回调函数的业务逻辑(在main.c中用户自定义)

硬件设计

PC13外接上拉式按键(按键控制:按下为低电平)
在按下时产生下降沿,PC13的外部中断功能→外部中断线EXTI1

CubeMX的配置

  1. 引脚分配Pinout View:搜索PC13 设置为GPIO_EXTI13
  2. 外设配置
  • System Core-GPIO-引脚清单(单击) → PC13配置 → 用户标签=KEY1、(工作)模式=外部中断模式 with 下降沿触发、上下拉电阻=No
  • System Core-NVIC-NVIC中断表 → EXTI Line[15:10] interrupts → 勾选使能、抢占优先级=15,子优先级=0

用户代码

//USER CODE4:定义中断回调函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { 
    if( GPIO_Pin == GPIO_PIN_13 ){ // 判断外部中断源
        //TODO 执行按键按下后的操作
    }
}

四、GPIO_Exit:输入模式(事件)

主要功能:使用事件屏蔽,产生事件脉冲,发送给片上外设的某个外部引脚 (外部事件External Event)

数据通路:
片上外设的某个外部引脚←产生事件脉冲←事件屏蔽EMR←[软件触发SWIER]←边沿监测RTSR和FTSR←Exit输入线(0~15号)←SYSCFG_EXTICR(引脚分组)←输入电路←引脚GPIO_Exit

EXIT寄存器 作用 数量x位宽
EMR 输入线的事件请求(屏蔽) 23x1 0-禁止、1-允许

五、GPIO_Analog:模拟模式

主要功能:引脚作为模拟IO引脚、功率最低(ADC或DAC↔“导线”↔引脚)

数据通路:
ADC或DAC↔上下拉电阻(无)↔保护二极管↔引脚GPIO_Analog

GPIO寄存器 作用 数量x位宽
MODER 模式 16x2bit 0-输入、1-通用输出、2-复用功能、3-模拟
  • 模拟IO引脚无须上下拉电阻

六、GPIO_AF:复用功能模式

主要功能:将引脚设为某个外设的专用功能引脚

数据通路:
片上外设的某个外部引脚↔16选1的复用器AF↔输入电路/输出电路↔引脚GPIO_AF

GPIO寄存器 作用 数量x位宽
MODER 模式 16x2bit 0-输入、1-通用输出、2-复用功能、3-模拟
AFR[2] 复用功能 16x4bit 引脚分配一个复用功能,连接到指定外设,作为(16选1的MUX)

16选1的复用器:负责将GPIO和外设的某个外部引脚连接

  • 1根线端:GPIO引脚
  • 16根线端:AF0为系统默认的GPIO功能、AF1~AF13作为其他外设的专用功能的数字IO引脚、AF15为EVENTOUT
  • 选择端:AFR中的4bit

七、HAL库

GPIO_InitTypeDef

  • GPIO_init->Pin:用于在寄存器内部定位bit
  • GPIO_Init->Mode:是否为GPIO_input的中断模式(SYSGFG:外部中断映射配置、EXIT:中断屏蔽、事件屏蔽、是否上升沿触发、是否下降沿触发)、GPIO模式(GPIO:工作模式、输出模式)
  • GPIO_Init->Speed 设置GPIO的输出速度
  • GPIO_Init->Pull 设置GPIO的上下拉电阻
  • GPIO_Init->Alternate 设置GPIO的AFR

HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init):外设初始化函数

  • 检查参数
  • 遍历GPIO所有引脚:根据GPIO_init->Pin定位,是否进行配置
  • 若GPIO工作模式为输出模式或复用功能模式:根据GPIO_Init->Mode、Speed,设置GPIO的OSPEEDR、OTYPE
  • 若GPIO工作模式非模拟模式:根据GPIO_Init->Pull,设置GPIO的PUPDR
  • 若GPIO工作模式为复用模式:根据GPIO_Init->Alternate,设置GPIO的AFR
  • 设置GPIO的MODER
  • 若为GPIO_input的中断模式:清理EXIT的IMR、EMR、RTSR、FTSR的配置、根据GPIO_Init->Mode,设置SYSGFG的EXITCR、设置EXIT的IMR、EMR、RTSR、FTSR