目录
一.作者小课堂
(一) EXTI的 HAL库接口函数
EXTI的HAL库接口函数的源码定义在stm32f1xx_hal_exti.c源文件中,其对应的头文件stm32f1xx_hal_exti.h声明了EXTI所有的库函数
(二)EXTI的HAL库应用实例
1.功能
采用基于HAL库设计方式,通过两个按键分别控制两个LED灯状态翻转。
2.硬件设计
按键WAKE_UP连接在STM32F103的PA0引脚上,按下时PA0为高电平,按键S2连接在STM32F103的PE3引脚上。
3.软件设计流程
(1)新建STM32CubeMX工程,选择MCU
在D盘或其他盘符目录下新建一个文件夹,用来存放后面建立的STM32CubeMX工程。需要注意的是:所建工程文件名最好是英文名称,且最好是英文路径。 这里采用STM32F103ZET6芯片。
(2)RCC配置
HSE选择“Crystal/Ceramic Resonator”(晶振/陶瓷谐振器),LSE选择“Disable”
(3)MCU引脚选择
LED2连接在PE5引脚上,LED3连接在PB5引脚上,设置为GPIO_Output;
设置PA0为GPIO_EXTI0外部中断线作为WAKE_UP按键使用,用于控制LED3灯闪烁;
设置PE3为GPIO_EXTI3作为按键S2使用,用于控制LED2灯闪烁。
(4)GPIO引脚参数配置
在“GPIO”参数配置中设置PA0为上升沿触发;
PE3的“GPIO mode”设置为下降沿触发,添加用户标签S2;
PB5和PE5两个LED灯设置为推挽输出,分别添加用户标签为LED2和LED3。
(5) 时钟配置
通过图形化方式直观对系统时钟进行配置,系统时钟采用外部高速时钟,配置STM32F103系列芯片最大时钟为72MHz,配置APB2为72MHz,配置APB1为36MHz。
(6)配置外部中断参数
在“NVIC”选项页中,设置“Priority Group”进行优先级分组;
勾选“EXIT_Line0 interrupt”使能PA0外部中断线;
类似地,勾选“EXTI_Line3 interrupt”使能PE3外部中断线。
(7)配置keil工程名称和存放位置
定义“Project Name”为“MyProject_EXTI”,“Toolchain/IDE”选择“MDK-ARM V5”;
(8)生成工程代码
通过STM32CubeMX的菜单栏中的“Generate Code”生成工程代码,生成代码后,会提示是否打开该工程窗口
二.实践出真知
(一)代码
在keil 中单击编译按钮,对生成的工程进行编译; 在stm32f1xx_it.c文件中可以找到所定义的中断函数; 外部的两个按键中断触发后,首先会调用GPIO相应引脚的外部中断处理函数。
当中断发生时,会调用HAL_GPIO_EXTI_Callback()函数,但程序中只给出了一个虚函数,需要用户添加应用程序代码来实现相关功能。 在main.c文件中的/*USER CODE BEGIN 4*/和/*USER CODE END 4*/之间添加中断回调函数相应的程序代码。
/* USER CODE BEGIN 4 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == GPIO_PIN_3)
{
HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_5);
}
if(GPIO_Pin == GPIO_PIN_0)
{
HAL_GPIO_TogglePin(LED3_GPIO_Port,LED3_Pin);
}
}
/* USER CODE END 4 */
(二)仿真波形图
观察的引脚分别为