STM32之中断的使用

本文内容:本文主要介绍STM32中的中断系统,并用中断进行点灯和串口通信。

一、何为中断

中断是当CPU在处理某一事件A时,发生了另一事件B,请求CPU迅速去处理,CPU暂停当前的工作,转去处理事件B,当CPU将事件B处理完毕后,再回到事件A中被暂停的地方继续处理事件A。
类比一下,可以想象成在做饭时突然来了一个电话,你去接电话停止做饭,打完电话后,回来接着做。
在这里插入图片描述

二、NVIC介绍

NVIC 是嵌套向量中断控制器,控制着整个芯片中断相关的功能,它跟内核紧密耦合,是内核里面的一个外设。但是各个芯片厂商在设计芯片的时候会对Cortex-M3内核里面的NVIC进行裁剪,把不需要的部分去掉,所以说 STM32的 NVIC是 Cortex-M3 的 NVIC 的一个子集。
优先级:在 NVIC 有一个专门的寄存器:中断优先级寄存器 NVIC_IPRx,用来配置外部中断的。
优先级
在这里插入图片描述
在这里插入图片描述

三、STM32CUBEMX生成中断点灯代码

首先打开STM32CUBEMX,新建一个工程
选择新片型号,这里我根据我的选择STM32F103RC
在这里插入图片描述
点击RCC中的Crystal
在这里插入图片描述
点击SYS选择Serial Wire
在这里插入图片描述
点击GPIO,选择自己用到的管脚,这里我的LED是连在PB9管脚,按键是连在PB8管脚
连接LED的管脚选择GPIO_Output
在这里插入图片描述
在这里插入图片描述
按键所连的管脚选择GPIO_EXIT
在这里插入图片描述
我这里让默认输入为0,选择pull down,选择上升沿触发
在这里插入图片描述
使能这个中断口

在这里插入图片描述
调整时钟如图
在这里插入图片描述
给工程命名,选择IDE型号
在这里插入图片描述
打开工程,在图示位置加入中断代码
在这里插入图片描述
代码如下:

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
		for(long i = 1;i<72000;i++){}; //消除抖动
		if(HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin)==1)
		{
			HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
		}
	__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
}

硬件连接如下
在这里插入图片描述
LED短脚接地,长脚接PB9,按键一端接3.3V,一端接PB8
烧录程序
在这里插入图片描述
运行效果如图

在这里插入图片描述
看了看芯片的原理图,发现芯片有自带的led和按键,按键为PA0,led为PA8,决定尝试一下用这两个
在这里插入图片描述
其他不变,只改管脚
在这里插入图片描述
运行效果如图
在这里插入图片描述

四、STM32CUBEMX生成中断通信代码

新建一个STM32CUBEMX工程,因为大部分配置与上面相同,下面只列举不同意的地方
USART1中的Mode选择Asynchronous
在这里插入图片描述
使能中断
在这里插入图片描述
打开生成的代码
添加存放数据的数组

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!
在这里插入图片描述

五、总结

这次用了中断,对于点个灯来说,可能感觉不到用了中断与以前有多大的区别,但是对于大工程来说,应该是会有显著的效果,它解放了CPU,不能老是让它去做一些没什么用的是,中断的使用使效率得到大大的提高。

六、参考文章

https://blog.csdn.net/qq_44918248/article/details/114579472?ops_request_misc=&request_id=&biz_id=102&utm_term=stm32cubemx%E4%B8%AD%E6%96%AD%E5%AE%9E%E7%8E%B0%E7%82%B9%E4%BA%AELED&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-1-114579472.first_rank_v2_pc_rank_v29&spm=1018.2226.3001.4187

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小张从未入门

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值