STM32CubeMX串口USART中断发送接收数据

简介: 上一篇文章 详细介绍了 USART 串口 不使用中断 发送接收数据 ,这篇文章 将介绍如何 使用中断控制 USART 串口 发送接收数据。对于如何根据 CubeMX 生成 USART 的工程,可以参考我的上篇文章,也介绍了 关于生成 usart.c 代码的解析 : STM32Cube串口USART发送接收数据

前言


上一篇文章 详细介绍了 USART 串口 不使用中断 发送接收数据 ,这篇文章 将介绍如何 使用中断控制 USART 串口 发送接收数据。


对于如何根据 CubeMX 生成 USART 的工程,可以参考我的上篇文章,也介绍了 关于生成 usart.c 代码的解析 : STM32Cube串口USART发送接收数据


一、中断控制


991924059587ef7cb9e6a1624620df2.png


中断: 是一种特殊的处理程序,能够 临时中断 正在运行的程序,以 处理紧急 的事件,然后 恢复 正在运行的程序。当 外部事件发生 时,中断程序 会被 调用,以 处理这些事件。

USART 收发数据时,可以 在数据接收之后立即触发中断,以此提高数据传输效率。


中断优先级 :

抢占优先级 :抢占优先级可以实现中断嵌套,抢占 优先级级数低的可抢占级数高的。


子优先级 :子优先级无法实现中断嵌套,同一时刻 两个子 优先级不同 的 中断 来临,则 先处理优先级高的 即优先级级数低的中断。若 先后发生 则先处理 上一个中断,再 处理后面的中断。


一旦确定了优先级组别,抢占优先级和子优先级的范围就确定下来了且除非复位否则无法更改。


二、USART中断使用


1. 中断优先级设置 :

①使用 CubeMX 设置优先级。

3ae37136e7230c7a32cfd8d32301285.png


②也可以使用 HAL_NVIC_SetPriority() 设置优先级:


HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority)
1

比如将 USART1 的中断设置为次高级优先级: HAL_NVIC_SetPriority(USART1_IRQn, 0, 1);


2. 使能中断

①使用 CubeMX 使能中断:

45861d8bd2169e1dc6b530314aea816.png

②使用 HAL_NVIC_EnableIRQ() 使能中断。


HAL_NVIC_EnableIRQ(IRQn_Type IRQn)

1

3. 使能UART的发送、接收中断

__HAL_UART_ENABLE_IT(__HANDLE__, __INTERRUPT__)

1

例如:设置 USART1 为 传输完成中断,接收数据寄存器不为空中断。



__HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE | UART_IT_RXNE);

1

4. 中断收发函数

//中断发送
HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
//中断接收
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)


5. 中断处理函数

在中断回调函数 USART1_IRQHandler ( ) 中进行中断处理,可以调用 HAL_UART_IRQHandler ( )。

/*中断处理函数*/
void USART1_IRQHandler(void)
{
  HAL_UART_IRQHandler(&huart1);
}


6. 中断收发回调函数

重定向 HAL_UART_RxCpltCallback( ) 或 HAL_UART_TxCpltCallback( ) 函数进行进一步任务处理。


/* 中断接收回调函数 */
__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
/* 中断发送回调函数 */
__weak void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)


三、串口中断实验


串口中断发送数据点亮 led:

对 LED 代码不理解的可以参考我之前的文章,详细介绍了 LED:STM32f103 CubeMX封装 led程序


void Enable(void)  /*使能*/
{
  HAL_NVIC_SetPriority(USART1_IRQn, 0, 1); //中断优先级设置
  HAL_NVIC_EnableIRQ(USART1_IRQn);  //使能中断
  __HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE | UART_IT_RXNE);
}
void Disable(void)  /*失能*/
{
  __HAL_UART_DISABLE_IT(&huart1, UART_IT_RXNE | UART_IT_RXNE);
  HAL_NVIC_DisableIRQ(USART1_IRQn);
}
void USART1_IRQHandler(void)  /*中断处理函数*/
{
  HAL_UART_IRQHandler(&huart1);
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)  //中断接收
{
  if(huart->Instance == USART1)
  {
  re_data = 1;
  }
}
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)  //中断发送
{
  if(huart->Instance == USART1)
  {
  tr_data = 1;
  }
}


这里我就不介绍 printf 的重定向问题了,我之前的文章 已详细介绍了 printf 的内容:STM32Cube串口USART发送接收数据


a = getchar(); //获得一个字符
  switch(a)
  {
   case 'B':
   {
    GREEN_ON();  //点亮LED
  printf("Led is on!\r\n");  
   }
   break;
   case 'b':
   {
    GREEN_OFF();  //熄灭LED
  printf("Led is off!\r\n");  
   }
   break;
   default:
    break;
  }



实验现象:

实验现象 我放在了 B占,有兴趣的可以看看:


STM32 串口USART 发送数据控制led亮灭


总结

如果有不理解的可以 评论留言 也可以 私信我 ,大家一起讨论。


相关文章
|
6月前
|
传感器
【STM32】I2C练习,SHT3X温度传感器的数据读取
【STM32】I2C练习,SHT3X温度传感器的数据读取
105 0
|
4月前
stm32f407探索者开发板(十七)——串口寄存器库函数配置方法
stm32f407探索者开发板(十七)——串口寄存器库函数配置方法
712 0
|
4月前
STM32CubeMX 串口收发一帧数据
STM32CubeMX 串口收发一帧数据
56 9
|
4月前
|
芯片
STM32CubeMX 串口数据收发
STM32CubeMX 串口数据收发
144 2
|
4月前
|
监控
stm32f407探索者开发板(十八)——串口通信实验讲解(USART_RX_STA流程图详解)
stm32f407探索者开发板(十八)——串口通信实验讲解(USART_RX_STA流程图详解)
308 0
|
4月前
|
传感器 编解码 API
【STM32开发入门】温湿度监测系统实战:SPI LCD显示、HAL库应用、GPIO配置、UART中断接收、ADC采集与串口通信全解析
SPI(Serial Peripheral Interface)是一种同步串行通信接口,常用于微控制器与外围设备间的数据传输。SPI LCD是指使用SPI接口与微控制器通信的液晶显示屏。这类LCD通常具有较少的引脚(通常4个:MISO、MOSI、SCK和SS),因此在引脚资源有限的系统中非常有用。通过SPI协议,微控制器可以向LCD发送命令和数据,控制显示内容和模式。
161 0
|
5月前
使用STM32F103标准库实现定时器控制LED点亮和关闭
通过这篇博客,我们学习了如何使用STM32F103标准库,通过定时器来控制LED的点亮和关闭。我们配置了定时器中断,并在中断处理函数中实现了LED状态的切换。这是一个基础且实用的例子,适合初学者了解STM32定时器和中断的使用。 希望这篇博客对你有所帮助。如果有任何问题或建议,欢迎在评论区留言。
441 2
|
6月前
|
传感器
STM32标准库ADC和DMA知识点总结-1
STM32标准库ADC和DMA知识点总结
|
5月前
|
IDE 开发工具
使用STM32F103标准库实现自定义键盘
通过本文,我们学习了如何使用STM32F103标准库实现一个简单的自定义键盘。我们首先初始化了GPIO引脚,然后实现了一个扫描函数来检测按键状态。这个项目不仅能够帮助我们理解STM32的GPIO配置和按键扫描原理,还可以作为进一步学习中断处理和低功耗设计的基础。希望本文对你有所帮助,祝你在嵌入式开发的道路上不断进步!
508 4