STM32和HAL库函数通过中断控制LED灯

一、中断

1.1 中断的理解

中断包括三个过程:中断发生,中断处理,中断返回这整个工程叫中断。
中断发生:CPU在处理某一事件时,另一事件发生了,请求CPU迅速去处理。
中断处理:CPU暂停工作转去处理另一个事件。
中断返回:CPU将另一个事件处理完成后,再回到事件一没处理完的地方继续处理。
在这里插入图片描述
在这里插入图片描述

1.2 中断的作用

速度匹配:可以解决快速的CPU与慢速的外部设备之间的传送数据的矛盾。
分时操作:CPU可以分时为多个外部设备服务,提高计算机的利用率。
实时响应:CPU能够及时处理应用系统的随机事件,增强系统的实时性。
可靠性高:CPU可以处理设备故障及掉电等突发事件,提高系统的可靠性。

1.3 终端的优先级

处理器根据不同中断的重要程度设置不同的优先等级。不同的优先级中断的处理原则是:高级终端可以打断低级中断;低级中断不能打断高级中断。
在这里插入图片描述

二、外部中断处理流程

在这里插入图片描述
中断跳转:跳转到中断所对应的中断服务程序
执行中断服务程序:执行在stm32f4xx_it.c中对应的中断服务程序。
在这里插入图片描述

外部中断通用处理函数:判断中断标志并清除,调用外部中断回调函数。
在这里插入图片描述

执行用户编写的回调函数:完成具体的中断任务处理。

在这里插入图片描述
在这里插入图片描述
中体流程图:
在这里插入图片描述

三、中断模式使LED亮灭

3.1 新建工程

  • 进入STM32CubeMX,新建一个工程项目

在这里插入图片描述

  • 根据自己的需要选择芯片型号,这里我选的是STM32F103C8,开始项目。

在这里插入图片描述

  • Rcc里的HSE选择Crystal/Ceramic Resonator
    在这里插入图片描述

  • 点击sys,将debug选项改为Serial Wire
    在这里插入图片描述

  • PA1控制led灯 ,将其选择为GPIO_Output,并且GPIO_Output level勾选为high 高电平。

在这里插入图片描述

  • PB0为外部中断触发器,将其选择为GPIO_EXT10,GPIO mode 勾选为 External Interrupt Mode with Rising/Falling edge trigger detection

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 选择PLLCLK,然后将后面的晶振频率最大值改为72M赫兹。

在这里插入图片描述

  • project里把toolchain那里改为MDK-ARM,版本选择最新的就行了,项目名和项目路径自己选择。

在这里插入图片描述

  • 选择生成初始化文件,然后选择生成代码就好了。
    在这里插入图片描述
    在这里插入图片描述

3.2 代码编写

通过edit->find in files,搜索HAL_GPIO_EXTI_Callback函数。
在这里插入图片描述

在这里插入图片描述
该函数为外部中断回调函数,__weak意为弱函数,即我们重写一个相同的函数则调用重写的函数:
在这里插入图片描述
在main.c中编写回调函数:

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
	GPIO_PinState b0_pin = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0);  // 读取b0的状态
	switch (GPIO_Pin){
		case GPIO_PIN_0:
			HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, b0_pin);  // 将a1写入与b0相同的电位
			break;
	}
	
}

在这里插入图片描述
最后编译并烧录。

编译无误:
在这里插入图片描述
烧录成功:
在这里插入图片描述

3.3 显示效果

在这里插入图片描述

四、中断实现串口通信

前面的设置基本与上面一致,不同的地方有如下几个:

  • 选择UASRT1,将mode改为异步通信,选择下面的NVIC Setting,将enabled选上。
    在这里插入图片描述

  • 使能中断
    在这里插入图片描述

  • 打开生成的代码,添加存放数据的数组

uint8_t a[]="Hello world!\n";

在这里插入图片描述

  • 添加回转函数
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
		HAL_UART_Transmit_IT(&huart1, a, sizeof(a));
}

在这里插入图片描述

  • 在主函数中添加中断调用
HAL_UART_Transmit_IT(&huart1, a, sizeof(a));

在这里插入图片描述
编译烧录运行,输出hello world!
在这里插入图片描述

五、总结

中断给我们带来了许多便利,我们生活中很多事情都需要中断,这让我们离生活更贴近了一步。

六、参考资料

https://blog.csdn.net/junseven164/article/details/121066120?spm=1001.2014.3001.5501

https://blog.csdn.net/as480133937/article/details/99073783

猜你喜欢

转载自blog.csdn.net/m0_46275263/article/details/121156502