STM32CubeMX+Proteus+Vscode STM32外部中断控制LED仿真实验
STM32CubeMX+Proteus+Vscode STM32外部中断控制LED仿真实验
发布日期 2022年4月17日 |  更新日期 2022年4月19日 |  本文共计 2017  |  预计阅读 9  |  阅读次数 423

STM32CubeMX+Proteus+Vscode STM32外部中断控制LED仿真实验

STM32CubeMX+Proteus+Vscode STM32外部中断控制LED仿真实验

实验题目

通过外部中断实现K1按下,D1点亮;K2按下,D1、D2点亮;K1、K2不按下,D1、D2熄灭。

使用到的软件:

STM32CubeMX(生成32工程)、VScode(代码编辑器)、Proteus(仿真程序)。

外部中断介绍

中断介绍

  1. ARM Cortex M3内核支持256个中断,包括16个内核中断和240个外设中断,拥有256个中断优先级别
  2. STM32的中断通道可能会由多个中断源共用,即表明某个中断服务函数可能被多个中断源共用。所以在中断服务函数的入口,需要有一个判断机制,来辨别究竟是哪个中断源触发了中断
  3. STM32有两个优先级:抢占优先级响应优先级
  4. Cortex M3内核里有一个设备叫做嵌套向量中断控制器(NVIC),它对中断进行统一的协调和控制。最主要的工作就是控制中断使能确定中断优先级

STM32外部中断

  1. 外部中断(EXTI)是STM32芯片实时处理外部事件的一种机制,由于中断请求来自于GPIO端口的引脚,所以称之为外部中断
  2. STM32芯片有16个外部中断源EXTI0–EXTI15,分别对应7个中断服务函数,其中EXTI0–EXTI4是专用,其他为共用
  3. EXTI0的连接引脚是:PA0–PG0,即每个端口的0号引脚
    EXTI1的连接引脚是:PA1–PG1,即每个端口的1号引脚,其他以此类推
  4. 外部中断的触发条件包括上升沿触发下降沿触发

外部中断控制LED仿真设计思路

  1. 在STM32CubeMX中指定引脚
  2. 设置GPIO_EXTI
  3. 设置中断触发条件
  4. 使能NVIC通道
  5. 重写该I/O引脚对应的中断回调函数

基于STM32CubeMX的软件特性,可以很快的帮助我们配置工程文件的前四步。

STM32CubeMX配置步骤

1.选择芯片

由于Proteus支持STM32F103C6的芯片,因此我在STM32CubeMX软件中选择该芯片建立工程。

2.指定引脚及相关设置

由于题目中要求有两个灯,两个按钮,所以我们将要用到4个引脚。因此我将PA0、PA5设置为输出口连接。LED,PB0、PB1设置为外部中断口连接按钮。

点击相应的引脚就可以设置属性了,这里我们用到了“GPIO_Output”和“GPIO_EXITI0”

将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这个函数的定义。

可以看到这个函数if语句中又有两个函数
其中HAL_GPIO_EXTI_CLEAR_IT()的作用就是清除中断标志

而我们需要关注的则是回调函数HAL_GPIO_EXTI_Callback()
它被定义为一个虚函数 __weak void HAL_GPIO_EXTI_Callback(… )
我们作为用户只需要调用重写这个虚函数即可,复制粘贴到main.c文件中。

找到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口的电平
	
				
			

最后编译生成hex文件即可拿来仿真了。

Protues仿真:

以下为仿真原理图

点击左下角,仿真运行即可验证结果

总结

主要学习了STM32外部中断的原理,然后STM32外部中断来实现控制LED亮灭的仿真实验。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注