项目功能
实现一个按键控制两个LED灯在两个状态下的自由切换
一个状态是跑马灯,另一个状态是双闪
相关软件使用说明
STM32CubeMX+Keil+Proteus相关的安装、使用、配置等基础操作不再赘述,有关内容的详细介绍如下
.
前4步在STM32CubeMX里面点一点就可以配置,简单了好多!!!
1.指定引脚
选择PA1,PA2引脚做为LED灯的输出引脚
选择PB0引脚做为按键输入的引脚
2.将GPIO设置为GPIO_EXTI功能
右键PB0引脚,选择GPIO_EXTI0(PB0对应的连接引脚)
4.使能NVIC通道
在NVIC(内嵌向量中断控制器)中勾选"EXTI line0 interrupt",使能中断
而我们需要关注的则是回调函数HAL_GPIO_EXTI_Callback()
它被定义为一个虚函数 __weak void HAL_GPIO_EXTI_Callback(… )
我们作为用户只需要调用重写这个虚函数即可
找到main.c文件,粘贴我们的外部中断处理函数
注意要在主函数体外的"Private user code"下的
/* USER CODE BEGIN 0 /
/ USER CODE END 0 */
内写我们的代码,如下图所示
int EXTI_SIGN = 0; //外部中断标志
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) //外部中断回调函数
{
EXTI_SIGN++;
}
然后我们通过判断变量EXTI_SIGN的奇偶性来切换LED灯的状态
具体代码写在主函数内的循环体while(1)内,代码如下
while (1)
{
//程序功能:利用外部中断来实现按键控制LED灯在两个状态(跑马灯和双闪)之间的切换
if(EXTI_SIGN%2 == 0)
{
HAL_GPIO_WritePin(GPIOA,LED1_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA,LED2_Pin,GPIO_PIN_RESET);
HAL_Delay(100);
HAL_GPIO_WritePin(GPIOA,LED1_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA,LED2_Pin,GPIO_PIN_SET);
HAL_Delay(100);
}
else if(EXTI_SIGN%2 == 1)
{
HAL_GPIO_WritePin(GPIOA,LED1_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA,LED2_Pin,GPIO_PIN_RESET);
HAL_Delay(100);
HAL_GPIO_WritePin(GPIOA,LED1_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA,LED2_Pin,GPIO_PIN_SET);
HAL_Delay(100);
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
最后编译生成hex文件即可拿来仿真了
原理图如下
别忘记点击芯片选择hex文件,同时配置主频72MHz
主要学习了外部中断的原理,然后用一个具体项目来实现外部中断
我是爱学习的诸葛铁锤,觉得有用的话点个赞哈,啾咪
因篇幅问题不能全部显示,请点此查看更多更全内容