STM32的HAL库开发系列 - 串口定长接收

简介: STM32的HAL库开发系列 - 串口定长接收

STM32的HAL库开发系列 - 串口定长接收

串口接收可以分为 定长接收 与 不定长接收 。

定长接收 就是要接收的数据量大小是事先知道的。

比如MCU与部分硬件外设的串口通信,外设会按通信协议间断地发送电机转速给MCU,这便是定长接收。

定长接收的实现非常简单。只需要处理好下面这三个函数。

 /* @brief  串口接收中断函数
  * @param   huart       串口句柄
  * @param   pData       用于接收数据的缓冲数组指针
  * @param   Size        缓冲数组字节数
  * @retval  HAL_Status   返回值 HAL_OK、HAL_ERROR、HAL_BUSY、HAL_TIMEOUT    
  * */
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
  
// 串口接收中断回调函数
__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(huart);
  /* NOTE: This function should not be modified, when the callback is needed,
           the HAL_UART_RxCpltCallback could be implemented in the user file
   */
}

关于中断,一号串口的中断服务函数USART1_IRQHandler是CubeMX自动生成的,函数位置在stm32f4xx_it.c中。中断服务函数会调用HAL_UART_IRQHandler(&huart1);函数,经过一些列调用后最终会调用HAL_UART_RxCpltCallback串口接收中断回调函数。

建议在中断回调函数内执行业务代码,即通过二次声明弱函数的方式。这样使得代码更易迁移。

// 串口中断服务函数
void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */
  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler(&huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */

  /* USER CODE END USART1_IRQn 1 */
}

举实际的例子

// 在main中开启接收中断,在数据接收完成后会进入接收回调函数
HAL_UART_Receive_IT(&huart1, data_buffer, 2);

/* Cube自动生成的串口一中断服务函数在(stm32f4xx_it.c)中加入中断接收,方便下一次数据的接收 */
/*每一个字节的接收完成都会产生中断,进入到串口中断服务函数当中*/
void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */
  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler(&huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */

  /* USER CODE END USART1_IRQn 1 */
}

uint8_t receive_data[2]; // 接收数组
// 串口中断接收回调函数,中断接收中指定的数据长度接收完成后会执行回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if (huart->Instance == USART1)
    {
        HAL_UART_Receive_IT(&huart1, &receive_data, 1);    // 将接收到的数据存入数组receive_data
    }
}

其中:

huart->Instance == USART1核心等价于huart1.Instance->SR & UART_FLAG_RXNE再加上额外的判断。是用来判断,读取数据寄存器不是空的。

HAL_UART_Receive_IT(&huart1, &receive_data, 1);核心等价于receive_data = huart1.Instance->DR;再加上额外的判断。

目录
相关文章
|
17天前
stm32f407探索者开发板(十七)——串口寄存器库函数配置方法
stm32f407探索者开发板(十七)——串口寄存器库函数配置方法
|
1月前
|
IDE 开发工具
使用STM32F103标准库实现自定义键盘
通过本文,我们学习了如何使用STM32F103标准库实现一个简单的自定义键盘。我们首先初始化了GPIO引脚,然后实现了一个扫描函数来检测按键状态。这个项目不仅能够帮助我们理解STM32的GPIO配置和按键扫描原理,还可以作为进一步学习中断处理和低功耗设计的基础。希望本文对你有所帮助,祝你在嵌入式开发的道路上不断进步!
175 4
|
22天前
|
传感器 编解码 API
【STM32开发入门】温湿度监测系统实战:SPI LCD显示、HAL库应用、GPIO配置、UART中断接收、ADC采集与串口通信全解析
SPI(Serial Peripheral Interface)是一种同步串行通信接口,常用于微控制器与外围设备间的数据传输。SPI LCD是指使用SPI接口与微控制器通信的液晶显示屏。这类LCD通常具有较少的引脚(通常4个:MISO、MOSI、SCK和SS),因此在引脚资源有限的系统中非常有用。通过SPI协议,微控制器可以向LCD发送命令和数据,控制显示内容和模式。
|
1月前
|
存储 数据采集 数据安全/隐私保护
使用STM32F103读取TF卡并模拟U盘:使用标准库实现
通过以上步骤,你可以实现用STM32F103将TF卡内容变成U盘进行读取。这种功能在数据采集、便携式存储设备等应用中非常有用。如果你有更多的需求,可以进一步扩展此项目,例如添加文件管理功能、加密存储等。希望这篇博客能帮到你,如果有任何问题,欢迎在评论区留言讨论!
42 1
|
1月前
使用STM32F103标准库实现定时器控制LED点亮和关闭
通过这篇博客,我们学习了如何使用STM32F103标准库,通过定时器来控制LED的点亮和关闭。我们配置了定时器中断,并在中断处理函数中实现了LED状态的切换。这是一个基础且实用的例子,适合初学者了解STM32定时器和中断的使用。 希望这篇博客对你有所帮助。如果有任何问题或建议,欢迎在评论区留言。
115 2
|
2月前
|
传感器
|
1月前
|
传感器
【经典案例】STM32F407使用HAL库配置I2C详解
STM32F407是一个强大的微控制器,广泛应用于嵌入式系统中。在许多应用中,我们需要使用I2C总线来与传感器、EEPROM、显示屏等外设进行通信。本文将详细介绍如何使用STM32 HAL库来配置和使用I2C接口。
96 2
|
1月前
|
开发者
【经典案例】使用HAL库配置STM32F407的SPI外设
在嵌入式系统开发中,STM32F407是一款广泛应用的微控制器,而SPI(Serial Peripheral Interface)是一种常用的通信接口。本文将详细介绍如何使用STM32的硬件抽象层(HAL)库配置STM32F407的SPI外设,并提供完整的代码示例。
92 1
|
2月前
|
传感器 存储 缓存