主要外设:
- GPIO:General Purpose I/O 一般用途IO
- EXIT:External Interrupt/Event Controller 外部中断/事件控制器
辅助外设:
- SYSCFG:System configuration controller系统配置控制器
IO引脚:
- 默认作为一般用途的引脚,连接GPIO
- 用代码设为专用功能引脚,连接特定外设
一、GPIO_input:输入模式(轮询)
主要功能:CPU读取引脚电平(轮询、CPU忙等、效率低)
数据通路:
CPU←...←APB外设总线←存储输入电平IDR←TTL施密特触发器←选择上下拉电阻PUPDR←保护二极管←引脚GPIO_input
GPIO寄存器 | 作用 | 数量x位宽 | 值 |
---|---|---|---|
MODER | 模式 | 16x2bit | 0-输入、1-通用输出、2-复用功能、3-模拟 |
PUPDR | 上下拉电阻 | 16x2bit | 0-无(浮空)、1-上拉、2-下拉 |
IDR | 输入数据 | 16x1bit | 0-低电平、1-高电平 |
辅助功能:
- 保护二极管:当输入电压过高或过低时,二极管导通,输入电压拉到VDD或GND,保护STM32 MCU
- 上下拉电阻 pull-up/pull-down:内部带有很弱的上下拉电阻绝大多数情况不使用
- TTL施密特触发器:信号进行数字采样
硬件设计
PC13外接上拉式按键(按键控制:按下为低电平)
CubeMX的配置
- Pinout View:搜索PC13 设置为GPIO_Input
- System Core-GPIO-引脚清单(单击)
PC13配置
- *用户标签=KEY1
- GPIO(工作)模式=input mode、GPIO上下拉电阻=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_Output:通用输出模式
主要功能:CPU控制引脚输出高低电平
数据通路:
CPU→...→[选择置位/复位BSSR]→选择输出电平ODR→选择输出速度OSPEEDR→选择推挽/开漏OTYPER→选择上下拉电阻PUPDR→保护二极管→引脚GPIO_Output
GPIO寄存器 | 作用 | 数量x位宽 | 值 |
---|---|---|---|
BSRR | 置位/复位 | 16x2bit | BitReset:0-无操作、1-复位 BitSet:0-无操作、1-置位 |
ODR | 输出数据 | 16x1bit | 0-低电平、1-高电平 |
OSPEEDR | 输出速度 | 16x2bit | 0-低速2MHz、1-中速25MHz、2-快速50MHz、3-高速80MHz~100MHz |
OTYPER | 输出类型 | 16x1bit | 0-输出推挽、1-输出开漏 |
输出类型分为推挽、开漏
- 推挽Push-Pull:绝大多数情况,可输出VDD或GND
- 开漏Open Drain:很少情况,可输出GND或浮空(输出高电平需要外接电源和上拉电阻,用于输出电平转换、多个OD输出并联实现“线与”、I2C)
输出速度:输出驱动电路的响应速度,跟应用相匹配,速度配置越高,噪声越大,功耗越大。
User Label(可选):用来给引脚起别名,提高代码可读性、移植性(更换引脚时只修改宏),对GPIO端口和引脚定义宏
//在main.h中
#define XXX_GPIO_Port GPIOx
#define XXX_Pin GPIO_PIN_y
硬件设计
PA5外接高电平驱动方式的指示灯电路(驱动指示灯:高电平)
CubeMX的配置
-
Pinout View:搜索PA5 设置为GPIO_Output
-
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_Analog:模拟模式
主要功能:引脚作为模拟IO引脚、功率最低(ADC或DAC↔“导线”↔引脚)
数据通路:
ADC或DAC↔选择上下拉电阻PUPDR↔保护二极管↔引脚GPIO_Analog
四、GPIO_AF:复用功能模式
主要功能:将引脚和片上外设相连、引脚作为其他片上外设的专用功能的数字IO引脚(其他片上外设↔“数字导线”↔引脚)
数据通路:
片上外设←TTL施密特触发器←选择上下拉电阻PUPDR←保护二极管←引脚GPIO_AF
片上外设→[选择输出速度OSPEEDR]→[选择推挽/开漏OTYPER]→选择上下拉电阻PUPDR→二极管保护电路→引脚GPIO_AF
寄存器 | 作用 | 数量x位宽 | 值 |
---|---|---|---|
AFR[2] | 复用功能 | 16x4bit | 引脚分配一个复用功能,连接到指定外设,作为(16选1的MUX) |
16-1的MUX
- 1根线端:GPIO引脚
- 16根线端:AF0为系统默认的GPIO功能、AF1~AF13作为其他外设的专用功能的数字IO引脚、AF15为EVENTOUT
- 选择端:AFR中的4bit
五、GPIO_Exit:外部中断模式
主要功能:External Interrupte 对引脚设置上升沿、下降沿、双边沿、软件触发中断到NVIC、并由NVIC决定是否发给CPU、并进行中断响应、调用中断函数
数据通路:
Exit输入线(0~15号)←SYSCFG_EXTICR←TTL施密特触发器←选择上下拉电阻PUPDR←保护二极管←引脚GPIO_Exit
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口 |
中断回调函数←...←CPU←...←NVIC←...←APB外设总线←挂起请求PR←中断屏蔽IMR←[软件触发SWIER]←边沿监测RTSR和FTSR←Exit输入线(0~15号)
EXIT寄存器 | 作用 | 数量x位宽 | 值 |
---|---|---|---|
RTSR | 上升沿触发选择 | 0-禁止、1-允许 | |
FTSR | 下降沿触发器选择 | 0-禁止、1-允许 | |
SWIER | 软件中断/事件 | 0-无操作、1-软件触发 | |
IMR | 输入线的中断请求(屏蔽) | 23x1 | 0-禁止、1-允许 |
PR | 挂起请求 | 0-没有触发、1-有触发 |
16个输入线→EXIT→NVIC(7个中断通道)
EXIT 0→EXTI0_IRQHandler
EXIT 1→EXTI1_IRQHandler
EXIT 2→EXTI2_IRQHandler
EXIT 3→EXTI3_IRQHandler
EXIT 4→EXTI4_IRQHandler
EXIT 5~9→EXTI9_5_IRQHandler
EXIT 10~15→EXTI15_10_IRQHandler
硬件设计
PC13外接上拉式按键(按键控制:按下为低电平)
在按下时产生下降沿,PC13的外部中断功能→外部中断线EXTI1
CubeMX的配置
- Pinout View:搜索PC13 设置为GPIO_EXTI13
- System Core-GPIO-引脚清单(单击)
PC13配置
- *用户标签=KEY1、GPIO(工作)模式=外部中断模式 with 下降沿触发
- GPIO上下拉电阻=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←TTL施密特触发器←选择上下拉电阻PUPDR←保护二极管←引脚GPIO_Exit
寄存器 | 作用 | 数量x位宽 | 值 |
---|---|---|---|
EMR | 输入线的事件请求(屏蔽) | 23x1 | 0-禁止、1-允许 |