文章目录
1. 所用硬件
正点原子Mini板,主控 STM32F103RCT6.
用到的外设:LED、按键。原理图:
2. 生成工程
2.1. 创建工程选择主控
2.2. 系统配置
配置时钟源
配置debug模式(如果需要ST-Link下载及调试可以勾选)
配置时钟树(可以直接在HCLK那里输入72,然后敲回车会自动配置)
2.3. 配置工程目录
勾选上会单独生成 c文件和头文件
2.4. 配置用到的外设
PA8:LED0。
PC5:KEY0,配置中断模式。
设置按键为上拉模式,下降沿触发。
2.5. 中断优先级配置
中断优先级简介:
NVIC在 ARM Conrtex-M 内核中,用一个 8 位的寄存器来配置,共有256级中断。但在 STM32 中,只使用该寄存器高 4 位来配置,也就是一共16 级中断。
实际上STM32中将其划分为5个分组。
优先级分组 抢占优先级占的位数 子优先级占的位数 NVIC_PriorityGroup_0 0 bit 4 bit NVIC_PriorityGroup_1 1 bit 3 bit NVIC_PriorityGroup_2 2 bit 2 bit NVIC_PriorityGroup_3 3 bit 1 bit NVIC_PriorityGroup_4 4 bit 0 bit 比如
设置为 NVIC_PriorityGroup_2 的话
- 抢占优先级占的位数 就只能设置 0 1 2 3
- 子优先级占的位数 也只能设置 0 1 2 3
这里比较简单,没必要用子优先级。因此设置分组为 NVIC_PriorityGroup_4,中断随便给个2吧。
2.6. 生成代码
配置完成之后,点击生成代码。
3. 目录结构
生成的工程目录如下图:
Core:软件生成的用到的外设的 源文件和头文件,main.c也在这。等价于MDK中的User + Hardware。
Drivers:HAL库驱动文件、芯片启动文件。
MDK-ARM:MDK工程文件。进入MDK-ARM目录,即可打开工程。
4. 运行原理及代码分析
打开工程,在stm32f1xx_it.h
中可以看到函数EXTI9_5_IRQHandler
,显然,这是中断处理函数,在中断处理函数中又调用了函数HAL_GPIO_EXTI_IRQHandler(KEY0_Pin);
然后我们去看看函数HAL_GPIO_EXTI_IRQHandler(KEY0_Pin);
都干了什么事。在stm32f1xx_hal_gpio.c
中可以看到此函数的定义。此函数读取寄存器判断是否发生了中断,然后把中断标志清楚,又调用了函数HAL_GPIO_EXTI_Callback(GPIO_Pin);
这个函数称为EXIT中断的回调函数,用来处理所有发生的EXIT中断事件。
然后,再去看看这个回调函数HAL_GPIO_EXTI_Callback(GPIO_Pin);
是干啥的。还是在这文件中,定义如下。
可以看到这个函数是个弱函数,用户可以再次定义该函数。也就是说,我们可以重新定义这个函数,并在函数中编写我们处理中断的逻辑。
注释写的也很清楚:
不应修改此函数,当需要回调时,可以在用户文件中实现HAL_GPIO_EXTI_callback
这段放在哪都行。大的工程可以创建一个文件放进去;这里直接放在main.c中了。
/* USER CODE BEGIN PFP */
/* USER CODE BEGIN 2 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);
}
/* USER CODE END PFP */
别的地方什么都不用写。
另外,不管是串口、DMA、ADC等 所有和中断相关的分析方法,都是和这里类似的,在
stm32f1xx_it.h
文件中查看入口,然后一步步往下找。
5. 效果验证
编译、烧录、查看结果。
效果:按下按键LED反转。
实际上,按键都会有个 HAL_delay(20) 用来防止抖动,但是在中断中不能使用这个延时,因为延时的优先级是最低的。因此,这里的按键其实不是很稳定。