STM32CubeMX串口接收中断

原创 2016年06月01日 23:23:19
昨天才接触到cube,目前只实现了固定长度的接收。配置好后,在while(1)前加入配置接收中断。我也是跟踪代码慢慢找到这句的,目前对于cube的库函数一点都不了解。
if(HAL_UART_Receive_IT(&huart1,usart1_rxBuf,5)!=HAL_OK)Error_Handler();
打开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 */
}
跟踪进中断函数。找到接收中断处。
tmp_flag = __HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE);
  tmp_it_source = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_RXNE);
  /* UART in mode Receiver ---------------------------------------------------*/
  if((tmp_flag != RESET) && (tmp_it_source != RESET))
  { 
    UART_Receive_IT(huart);
  }

再次跟踪金UART_Receive_IT()

if(huart->Init.Parity == UART_PARITY_NONE)
      {
        *huart->pRxBuffPtr++ = (uint8_t)(huart->Instance->DR & (uint8_t)0x00FF);
      }
      else
      {
        *huart->pRxBuffPtr++ = (uint8_t)(huart->Instance->DR & (uint8_t)0x007F);
      }
这里是直接把接收数据装入pRxBuffPtr指向的buf里了。

然后就是下面这个if里的

if(--huart->RxXferCount == 0)
    {
      __HAL_UART_DISABLE_IT(huart, UART_IT_RXNE);

      /* Check if a transmit process is ongoing or not */
      if(huart->State == HAL_UART_STATE_BUSY_TX_RX) 
      {
        huart->State = HAL_UART_STATE_BUSY_TX;
      }
      else
      {
        /* Disable the UART Parity Error Interrupt */
        __HAL_UART_DISABLE_IT(huart, UART_IT_PE);

        /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */
        __HAL_UART_DISABLE_IT(huart, UART_IT_ERR);

        huart->State = HAL_UART_STATE_READY;
      }
      HAL_UART_RxCpltCallback(huart);

      return HAL_OK;
    }
这里看到,第一句话就把接收终端给关闭了。然后就是处理各种标记,我一个都看不懂。。。。。。然后就调用回调函数了。终于找到需要的东西了。跟踪进去,说这个函数不能更改,你要用的话自己重新定义实现就好了。

于是我就重新定义了该函数

void HAL_UART_RxCpltCallback(UART_HandleTypeDef*UartHandle)
{
	if(UartHandle->Instance == USART1)
	{
		HAL_UART_Transmit_IT(&huart1, huart1.pRxBuffPtr-huart1.RxXferSize, huart1.RxXferSize); 
		HAL_UART_Receive_IT(&huart1,usart1_rxBuf,5);//开启下一次接收中断
//		__HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);
	}
}
解释下,首先判断是否为自己用的那个USART。然后打印测试的数据出来。发送中断函数第二个参数为buf地址,因为在接收的时候pRxBuffPtr一直在不断累加了,所以这里需要减RxXferSize,就到了接收buf的头了。第三个参数就是长度了。

打印之后,重新加载一次接收中断。里边我主要就看了这几句话,其他没仔细研究。

huart->pRxBuffPtr = pData;
huart->RxXferSize = Size;
huart->RxXferCount = Size;

这里是赋值接收的ptr,Size,Couont。之所以要赋值Count,是因为没接收到一个字节,Count自减一次,直到为0了,就可以调用回调函数。

别漏了,最后它还调用了

/* Enable the UART Data Register not empty Interrupt */
    __HAL_UART_ENABLE_IT(huart, UART_IT_RXNE);
因为在UART_Receive_IT()里似乎关闭了接收中断的,所以必须要打开。

现在还不知道怎么接收不定长度的数据,期待哪位大哥给讲解一下,不胜感激。


相关文章推荐

STM32F746 利用HAL库编写串口驱动程序

之前用hal库的时候都是用一些简单的,例如初始化一个IO用作LED指示,今天写的代码需要串口的例子,说真的看了官方的demo也没看出啥名堂,反而觉得用hal写串口驱动太麻烦了. 回顾下之前常见的串口写...

STM32F207Cube库函数USART中断接收

USART初始化部分就不介绍了,直接看官方给的例程就能知道,现在主要将自己在学习过程中遇到的问题以及解决方法记录一下。首先,如果使用了串口接收中断,就需要在初始化中打开中断以及设定中断优先级等常规操作...

基于HAL库处理UART中断并接收串口传入的数据

研究了下HAL库,在百度上面找发现很多UART串口接收,串口中断处理是从USART那边直接抄过来的,使用的是标准库一类的,在用HAL库配置的工程中完全没法使用,另辟蹊径,通过在文档中翻找HAL打头的函...

STM32CubeMX:UART操作

UART共有三种操作方式,轮询方式、中断方式以及DMA方式。 芯片:STM32F103C8T6 应用管脚: 输出:PA0、PA1 USART1 配置界面 添加中断配置 添加D...

使用stm32cubemx开发四:串口标准化输出

使用STM32CubeMX配置串口参数,用查询和中断两种方式实现输出重定向

STM32CubeMX软件工程描述_USART配置过程

Ⅰ、写在前面 学习本文之前可以查看我前面的文章: STM32CubeMX介绍、下载与安装 STM32CubeMX使用方法及功能介绍 STM32CubeMX新建工程+基本IO配置过程   本...

STM32CubeMX 串口空闲中断加DMA 实现不定长度收发数据

STM32CubeMX串口空闲中断+DMA实现不定长度收发数据,实现过程
  • mjfmjj
  • mjfmjj
  • 2016年06月24日 11:03
  • 8494

STM 32 串口接收配置

串口接收流程: 串口接收的一部分流程与发送时的配置很类似,具体如下所示: 其中第六步使能的是接收器,第七步是接收中断的使能位,接收中断即在接收到数据后通过产生中断来进行相应的处理。具体配置过程: ...

使用STM32CubeMX开发三:按键中断实验

使用STM32CubeMX完成按键中断的实验。

spi HAL库改之

{     while((hspi->TxXferCount > 0) || (hspi->RxXferCount > 0))     {       /* check TXE flag */ ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:STM32CubeMX串口接收中断
举报原因:
原因补充:

(最多只允许输入30个字)