STM32CubeMX系列03——外部中断

文章目录

  • 1. 所用硬件
  • 2. 生成工程
    • 2.1. 创建工程选择主控
    • 2.2. 系统配置
    • 2.3. 配置工程目录
    • 2.4. 配置用到的外设
    • 2.5. 中断优先级配置
    • 2.6. 生成代码
  • 3. 目录结构
  • 4. 运行原理及代码分析
  • 5. 效果验证

====>>> 文章汇总(有代码汇总) <<<====

1. 所用硬件

正点原子Mini板,主控 STM32F103RCT6.

用到的外设:LED、按键。原理图:
STM32CubeMX系列03——外部中断_第1张图片

2. 生成工程

2.1. 创建工程选择主控

STM32CubeMX系列03——外部中断_第2张图片

2.2. 系统配置

配置时钟源
STM32CubeMX系列03——外部中断_第3张图片
配置debug模式(如果需要ST-Link下载及调试可以勾选)
STM32CubeMX系列03——外部中断_第4张图片
配置时钟树(可以直接在HCLK那里输入72,然后敲回车会自动配置)
STM32CubeMX系列03——外部中断_第5张图片

2.3. 配置工程目录

STM32CubeMX系列03——外部中断_第6张图片
勾选上会单独生成 c文件和头文件
STM32CubeMX系列03——外部中断_第7张图片

2.4. 配置用到的外设

PA8:LED0。
STM32CubeMX系列03——外部中断_第8张图片
PC5:KEY0,配置中断模式。
STM32CubeMX系列03——外部中断_第9张图片
设置按键为上拉模式,下降沿触发。
STM32CubeMX系列03——外部中断_第10张图片

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吧。
STM32CubeMX系列03——外部中断_第11张图片

2.6. 生成代码

配置完成之后,点击生成代码。
STM32CubeMX系列03——外部中断_第12张图片

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);
STM32CubeMX系列03——外部中断_第13张图片
然后我们去看看函数HAL_GPIO_EXTI_IRQHandler(KEY0_Pin);都干了什么事。在stm32f1xx_hal_gpio.c中可以看到此函数的定义。此函数读取寄存器判断是否发生了中断,然后把中断标志清楚,又调用了函数HAL_GPIO_EXTI_Callback(GPIO_Pin); 这个函数称为EXIT中断的回调函数,用来处理所有发生的EXIT中断事件。
STM32CubeMX系列03——外部中断_第14张图片
然后,再去看看这个回调函数HAL_GPIO_EXTI_Callback(GPIO_Pin);是干啥的。还是在这文件中,定义如下。
STM32CubeMX系列03——外部中断_第15张图片
可以看到这个函数是个弱函数,用户可以再次定义该函数。也就是说,我们可以重新定义这个函数,并在函数中编写我们处理中断的逻辑。

注释写的也很清楚:
不应修改此函数,当需要回调时,可以在用户文件中实现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) 用来防止抖动,但是在中断中不能使用这个延时,因为延时的优先级是最低的。因此,这里的按键其实不是很稳定。

你可能感兴趣的:(CubeMX,stm32,单片机,arm)