STM32CubeMX+Proteus+Vscode STM32外部中断控制LED仿真实验
实验题目
通过外部中断实现K1按下,D1点亮;K2按下,D1、D2点亮;K1、K2不按下,D1、D2熄灭。
使用到的软件:
STM32CubeMX(生成32工程)、VScode(代码编辑器)、Proteus(仿真程序)。
外部中断介绍
中断介绍
- ARM Cortex M3内核支持256个中断,包括16个内核中断和240个外设中断,拥有256个中断优先级别
- STM32的中断通道可能会由多个中断源共用,即表明某个中断服务函数可能被多个中断源共用。所以在中断服务函数的入口,需要有一个判断机制,来辨别究竟是哪个中断源触发了中断
- STM32有两个优先级:抢占优先级和响应优先级
- Cortex M3内核里有一个设备叫做嵌套向量中断控制器(NVIC),它对中断进行统一的协调和控制。最主要的工作就是控制中断使能和确定中断优先级
STM32外部中断
- 外部中断(EXTI)是STM32芯片实时处理外部事件的一种机制,由于中断请求来自于GPIO端口的引脚,所以称之为外部中断
- STM32芯片有16个外部中断源EXTI0–EXTI15,分别对应7个中断服务函数,其中EXTI0–EXTI4是专用,其他为共用
- EXTI0的连接引脚是:PA0–PG0,即每个端口的0号引脚
EXTI1的连接引脚是:PA1–PG1,即每个端口的1号引脚,其他以此类推 - 外部中断的触发条件包括上升沿触发和下降沿触发
外部中断控制LED仿真设计思路
- 在STM32CubeMX中指定引脚
- 设置GPIO_EXTI
- 设置中断触发条件
- 使能NVIC通道
- 重写该I/O引脚对应的中断回调函数
基于STM32CubeMX的软件特性,可以很快的帮助我们配置工程文件的前四步。
STM32CubeMX配置步骤
1.选择芯片
由于Proteus支持STM32F103C6的芯片,因此我在STM32CubeMX软件中选择该芯片建立工程。
2.指定引脚及相关设置
由于题目中要求有两个灯,两个按钮,所以我们将要用到4个引脚。因此我将PA0、PA5设置为输出口连接。LED,PB0、PB1设置为外部中断口连接按钮。
将PB0与PB1的中断触发条件设置为外部中断且下降沿触发检测,同时设置上拉。
3.时钟RCC设置
将HSE选为外部晶振模式。
4.sys配置
点击右侧“SYS”,在Debug调试界面下选择Serial Wire模式。
5.NVIC配置
点击左侧NVIC,因为需要用到两个中断,所以下方勾选EXTI line* interrupts,表示能够中断。
6.时钟树配置
点击标记1切换到时钟树设置页面,然后在标志2处设置时钟频率,输入完毕回车即可
7.工程导出
点击Project Manager,首先设置工程名和路径以及导出方式。
然后点击右侧Code Generator,进行工程文件设置,具体勾选如下:
进行完上述步骤后,就可以进行上图的第四步生成工程了,生成后打开vscode,通过eide打开之前设置的工程目录导入工程即可。
代码功能完善
打开工程,我们看一下用户代码目录,打开stm32f1xx_it.c文件,然后转到HAL_GPIO_EXTI_IRQHandler这个函数的定义。
找到main.c文件,粘贴之前外部中断处理函数
注意要把自定义函数在主函数体外的"Private user code"下的
/* USER CODE BEGIN 0 /
/ USER CODE END 0 */
然后按照题目要求稍作修改,如下图所示:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if( GPIO_Pin == B0_EXIT_Pin) //判断中断源
{
HAL_GPIO_TogglePin(GPIOA, A0_LED_Pin); //翻转led管脚 A0口的电平
}
if( GPIO_Pin == B1_EXIT_Pin) //判断中断源
{
HAL_GPIO_TogglePin(GPIOA, A0_LED_Pin); //翻转led管脚 A0口的电平
HAL_GPIO_TogglePin(GPIOA, A5_LED_Pin); //翻转led管脚 A5口的电平
Protues仿真:
点击左下角,仿真运行即可验证结果
总结
主要学习了STM32外部中断的原理,然后STM32外部中断来实现控制LED亮灭的仿真实验。