你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

HAL串口实战例程,调试通过!

[复制链接]
wjandsq 发布时间:2019-5-10 21:33
stm32f4xx_hal_uart.c 中的HAL_UART_IRQHandler 函数,增加如下代码

  /* UART Idle interrupt occurred   --------------------------------------------*/
  if (((isrflags & USART_SR_IDLE) != RESET) && ((cr1its & USART_CR1_IDLEIE) != RESET))
  {
    __HAL_UART_CLEAR_IDLEFLAG(huart);
    __HAL_UART_DISABLE_IT(huart, UART_IT_IDLE);
    HAL_UART_RxIdleCallback(huart);
    return;
  }

以下__weak 函数也在stm32f4xx_hal_uart.c 中定义
/**
  * @brief  Rx Idle callbacks.
  * @param  huart: Pointer to a UART_HandleTypeDef structure that contains
  *                the configuration information for the specified UART module.
  * @retval None
  */
__weak void HAL_UART_RxIdleCallback(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_RxIdleCallback can be implemented in the user file
   */
}
同时,stm32f4xx_hal_uart.h中增加如下函数声明,算是给最新的HAL库打补丁了。
void HAL_UART_RxIdleCallback(UART_HandleTypeDef *huart);

最后,在生成的代码中,增加如下实际函数。
/* USER CODE BEGIN 1 */
/**
  * @brief  Rx Transfer completed callbacks.
  * @param  huart  Pointer to a UART_HandleTypeDef structure that contains
  *                the configuration information for the specified UART module.
  * @retval None
  */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  if (huart->Instance == USART1) {
    USART1_Rx_Buf[USART1_Rx_Count] = USART1_Rx_temp;
    HAL_UART_Receive_IT(huart, (uint8_t *)&USART1_Rx_temp, 1);
    if (++USART1_Rx_Count >= USART1_Rx_Buf_Size) {
      USART1_Rx_Count = 0;
    }
    __HAL_UART_CLEAR_IDLEFLAG(&huart1);
    __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
  }
}

/**
  * @brief  Rx Idle callbacks.
  * @param  huart: Pointer to a UART_HandleTypeDef structure that contains
  *                the configuration information for the specified UART module.
  * @retval None
  */
void HAL_UART_RxIdleCallback(UART_HandleTypeDef *huart)
{
  if (huart->Instance == USART1) {
    __HAL_UART_CLEAR_IDLEFLAG(huart);
    __HAL_UART_ENABLE_IT(huart, UART_IT_IDLE);
    if(USART1_Rx_Buf[1] == 0x55){
      __NOP();
      __NOP();
      __NOP();
    } else if(USART1_Rx_Buf[1] == 0xA5){
      __NOP();
      __NOP();
      __NOP();
    }
    memset((uint8_t *)USART1_Rx_Buf, 0, 1024);
    USART1_Rx_Count = 0;
  }
}

/* USER CODE END 1 */

经测试,不管连发多少个字符,都会进空闲中断回调函数,这样应用程序就非常好处理了。

2019/05/10 wjandsq@163.com

收藏 2 评论6 发布时间:2019-5-10 21:33

举报

6个回答
wjandsq 回答时间:2019-5-10 21:41:43
HAL库版本: STM32Cube_FW_F4_V1.24.1
Kevin_G 回答时间:2019-5-12 22:56:29
收藏收藏,最近也在搞这个。
STMCU-管管 回答时间:2019-5-16 15:27:10
谢谢分享
289466080 回答时间:2019-5-24 10:32:05
谢谢分享,搞了好几天参考这个终于搞定而且不用DMA用F030 16k的正好可以减少使用空间
米兰的无线电 回答时间:2019-5-24 15:44:50
本帖最后由 role_2099 于 2019-5-24 16:15 编辑

很好用,多谢分享
liu1980108 回答时间:2020-12-15 10:50:41
感谢奉献  赶紧的收藏

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版