STM32使用CubeMAX配置的串口中断接收方法

STM32使用CubeMAX配置的串口中断接收方法

目录

1.定位串口中断发生的地方

2.处理串口中断接收的流程是:

(1)初始化串口

(2)在main中第一次调用接收中断函数(这个也是比较关键的)

(3)重写HAL_UART_RxCpltCallback回调,在回调中处理接收的数据,重点是回调函数中也要调用一次HAL_UART_Receive_IT函数。


STM32使用cubeMAX可以快速建立工程模板,但是默认使用的是Hal库构成的工程,对于习惯使用了ST标准库的同学来说,灵活调用HAL库可能会比较生疏,我也是这么觉得的,但是还是要逐步去接触学习它,毕竟这个hal库的封装还是相当好的,有好多先进的思想和用法。

在学习过程中,我遇到了一个问题,之前也遇到过,但是没时间去研究,就是串口在CUBUMAX上配置好后,如何实现串口中断接收,接下来就来记录一下我学习到的知识:

1.定位串口中断发生的地方

HAL库的中断处理还是和标准库一样的,在stm32xxxx_it.c中定义我们定位到如下函数:

HAL_UART_IRQHandler(&huart1);

再往下定位,我们找到

  /* UART in mode Receiver ---------------------------------------------------*/
  if((tmp_flag != RESET) && (tmp_it_source != RESET))
  { 
    UART_Receive_IT(huart);
  }

最后在UART_Receive_IT()函数中能找到串口中断接收的回调函数HAL_UART_RxCpltCallback(huart);

往里面搜索,发现这个回调函数是这样的:

/**
  * @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
  */
__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 can be implemented in the user file
   */
}

你会发现这个回调函数啥也没干;后面我搜索资料知道,这个函数需要用户自己重写的,这个比较关键;

2.处理串口中断接收的流程是:

(1)初始化串口

(2)在main中第一次调用接收中断函数(这个也是比较关键的)

  • (3)重写HAL_UART_RxCpltCallback回调,在回调中处理接收的数据,重点是回调函数中也要调用一次HAL_UART_Receive_IT函数。

下面贴一下我的回调函数的代码:

uint8_t aRxBuffer1;//一个字节的缓冲

int main(void)
{
    ...

    HAL_UART_Receive_IT(&huart1,&aRxBuffer1,1);	// Enable the USART1 
    ...


    while(1)
    {
        ...
    }
}

/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

{
    if(huart->Instance == USART1)   

    {
        HAL_UART_Receive_IT(&huart1,&aRxBuffer1,1);    
			
	// save char from uart receive
	QueueIn(CLI_RX_Buff, aRxBuffer1);//将接收到的数据放到自己的fifo中去
		
        //这里打印显示,建议关闭,不然会影响中断接收,可以考虑用中断发送	
	//printf("%c",aRxBuffer1);				
    }
}
/* USER CODE END 4 */

这些就是所有需要添加的东西了,实现了串口中断接收的功能。

至于如何cubeMAX中配置串口,可以参考如下链接,也非常感谢其他博主的详细解释。

参考链接:

http://www.eeworld.com.cn/mcu/article_2018061939840.html

https://www.cnblogs.com/wt88/p/9624115.html

猜你喜欢

转载自blog.csdn.net/qq_28643619/article/details/92741997