STM32中断实现按键LED灯、串口通信(HAL库)

一、中断介绍

中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。

1、中断处理过程

如图1所示。
在这里插入图片描述
图1 中断过程

2、中断优先级

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

NVIC中有一个8位中断优先级寄存器NVIC_IPR,理论上可以配置0~255共256级中断。
STM32只使用了其中的高4位,并分成抢占优先级和子优先级两组。多个中断同时提出中断申请时:先比较抢占优先级,抢占优先级高的中断先执行,如果抢占优先级相同,则比较子优先级。而二者都相同时,比较中断编号。编号越小,优先级越高。

在这里插入图片描述
图3 中断优先分组
HAL库初始化函数HAL_lnit将优先级分组设置为第4组,即有0~15,共16级抢占优先级,没有子优先级。编号越小的优先级越高:0号为最高,15号为最低。

3、中断作用

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

4、外部中断

  • 管理23个外部中断线(EXTI LIne)
  • 0~15号外部中断线用于由GPIO引脚触发的外部中断
  • 16~22号外部中断线用于RTC闹钟事件、以太网唤醒事件和USB唤醒事件等
  • 当对应GPIO引脚与外部中断线连接后,GPIO引脚才具有外部中断的功能,可以设置外部中断的触发方式
    在这里插入图片描述
    图4 外部中断/事件控制器框图

二、中断实例1:LED灯

1、CubeMX中断配置

本实验主要采用下降沿触发的方式。
(1)、引脚分配
将PA6设置为GPIO_Output模式,将PB13作为按键的引脚设置为外部中断模式GPIO_EXTI,如图5所示。
在这里插入图片描述
图5 引脚分配

引脚分组:①尾号相同的引脚一组,接入1个外部中断线
②同组引脚只能有一个设置为外部中断功能
中断功能:①EXTI0~EXTI4分别具有独立的中断通道
②EXTI5~EXTI9共享同一个中断通道
③EXTI10~EXTI15共享同一个中断通道
如图6所示
图6 中断通道
图6 中断通道

(2)、外设配置
本实验主要是上升沿触发,PB13的引脚设置为下拉电阻,选择上升沿触发,如图7、8所示。
在这里插入图片描述

图7 PB13外设设置
在这里插入图片描述
图8 PA6外设设置

使能对应的外部中断线
如图9所示
在这里插入图片描述
点击NVIC选择Enabled
图9 使能对应的外部中断线
(3)、中断优先级配置
点击NVIC,如图10所示。
在这里插入图片描述
图10 配置中断优先级
注:大多数情况不必设置中断优先级,而直接使用由中断编号设置的默认中断优先级。抢占优先级为15。

2、编写代码

/* USER CODE BEGIN 4 *//* USER CODE END 4 */中添加代码:

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
   
	if( GPIO_Pin ==B1_EXTI_Pin)
	{
   
		HAL_GPIO_TogglePin(LD2_GPIO_Port,LD2_Pin);
	}
}
  • 7
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以通过使用STM32HAL库来控制串口LED。首先,确保已经在项目中包含了`stm32fxxx_hal.h`头文件(其中"xxx"是您使用的具体芯片型号)。然后,按照以下步骤进行操作: 1. 初始化串口:通过调用`HAL_UART_Init()`函数来初始化串口。您需要指定UART的引脚配置、波特率等参数。 2. 配置GPIO:使用`HAL_GPIO_Init()`函数来配置LED的GPIO引脚,并将其设置为输出模式。 3. 发送数据:在主循环中,您可以使用`HAL_UART_Transmit()`函数来发送数据到串口。例如,您可以发送一个特定的命令或字符以控制LED的状态。 4. 控制LED:根据接收到的数据,您可以使用`HAL_GPIO_WritePin()`函数来控制LED的状态。通过改变引脚的电平,您可以打开或关闭LED。 下面是一个简单的示例代码,展示了如何使用STM32HAL库控制串口LED: ```c #include "stm32fxxx_hal.h" UART_HandleTypeDef huart; GPIO_InitTypeDef GPIO_InitStruct; void UART_Init() { huart.Instance = USART1; huart.Init.BaudRate = 9600; huart.Init.WordLength = UART_WORDLENGTH_8B; huart.Init.StopBits = UART_STOPBITS_1; huart.Init.Parity = UART_PARITY_NONE; huart.Init.Mode = UART_MODE_TX_RX; huart.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart.Init.OverSampling = UART_OVERSAMPLING_16; HAL_UART_Init(&huart); } void GPIO_Init() { __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } int main() { HAL_Init(); UART_Init(); GPIO_Init(); while (1) { // 从串口接收数据 uint8_t data; HAL_UART_Receive(&huart, &data, 1, HAL_MAX_DELAY); // 根据接收到的数据控制LED if (data == '1') { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET); // 打开LED } else if (data == '0') { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET); // 关闭LED } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值