• STM32F429基于CUBEMX的串口中断接收


    今天要来介绍一下HAL库的串口中断使用方法

    首先打开CUBEMX,新建一个STM32工程,博主建立的是F429工程,然后在图形界面中打开一个USART,这里我们使用USART1。

    然后进入配置configguration

    基本的参数都不用修改,在NVIC中,大概中断使能

    然后生成工程即可,打开工程文件。这里要解释一下串口中断接收:

    关于串口接收中断

    用CUBEMX生成的工程文件中,先开启接收中断使能

    __HAL_UART_ENABLE_IT(uartHandle, UART_IT_RXNE);
    并且利用HAL_UART_Receive_IT(uartHandle, &TempChar, 1);

    这个函数中,第二个和第三个参数可以修改,分别代表预处字符串和字符串大小。
    我们可以定义个初始化函数,在进入while(1)之前执行,比如我自定义了一个ITEnable(void);我们再来看一下这个函数的定义和使用位置:

    void ITEnable(void) {
    	HAL_TIM_Base_Start_IT(&htim6);
    	HAL_TIM_Base_Start_IT(&htim7);
    	__HAL_UART_ENABLE_IT(&huart3, UART_IT_RXNE);
    	HAL_UART_Receive_IT(&huart3, &TempChar, 1);
    	__HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);
    	HAL_UART_Receive_IT(&huart1, &TempChar, 1);
    }
    

      可以看到,在这里我们开启了中断使能以及说明了接收到的信息存放位置&TempChar, TempChar是我们声明的一个全局变量,存放临时字符。

    /* USER CODE BEGIN 2 */
    delay_init(180);
    LED_Init();
    SDRAM_Init();
    LCD_Init();
    ESP8266_Init();
    ITEnable();
    PeriphInit();
    LCD_ShowString(30,0,200,24,24,"ShowTimeWalker");
    /* USER CODE END 2 */
    

      

     (上面是我从自己的工程里面挑选的代码,大家只需要关注部分代码)

    设置完后,每次接受完一个字符,都会进入中断服务函数,官方申明的服务函数为
    void USART1_IRQHandler(void)
    该函数中只有一个目的,即进入
    HAL_UART_IRQHandler(&huart1);
    在这个函数中,函数会清除中断标志位,禁止使能中断!!!

    并且进入函数UART_Receive_IT(huart);

    在这里,把接收到的那个字符存放在之前HAL_UART_Receive_IT()设定的位置&TempChar,并计数
    当计数达到设定值1后,转入回调函数
    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
    最终的操作就可以在回调函数中完成了,博主的处理代码如下:

    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
    	if (huart->Instance == USART1) {
    		if(!END_STA) {
    			if (TempChar!=0x0d) {
    				Usart_ReceiveBuffer[USART_COUNTER++] = TempChar;
    			}
    			else {
    				Usart_ReceiveBuffer[USART_COUNTER++] = TempChar;
    				if (Usart_ReceiveBuffer[USART_COUNTER + 1] == 0)
    					END_STA = 1;
    			}
    		}
    		else {
    			Usart_ReceiveBuffer[USART_COUNTER++] = TempChar;
    			END_STA = 0;
    			USART_COUNTER = 0;
    			LCD_Fill(0, 120, 479, 149, WHITE);
    			memcpy(USART1MESSAGE, Usart_ReceiveBuffer, RX_Length);
    			for (int i = 0; i < RX_Length; i++)
    				Usart_ReceiveBuffer[i] = 0;
    			POINT_COLOR = BLACK;
    			LCD_ShowString(30,120,800,24,24,(char*)USART1MESSAGE);
    		}
    	}
    }
    

      在这之前还要声明一些全局变量

    u8 Usart_ReceiveBuffer[RX_Length] = {0};
    u8 USART1MESSAGE[RX_Length] = {0};
    u8 USART3MESSAGE[RX_Length] = {0};
    u16 USART_COUNTER = 0;
    u8 END_STA = 0;
    uint8_t TempChar = 0;
    

    由于已经禁能中断,所以还要开启中断,每完成一次中断处理后,我们还要再USART1_IRQHandler中补充一行

    HAL_UART_Receive_IT(uartHandle, &TempChar, 1);

    在stm32f4xx_it.c里面找到这个函数,修改为:

    void USART1_IRQHandler(void)
    {
      HAL_UART_IRQHandler(&huart1);
      HAL_UART_Receive_IT(&huart1, &TempChar, 1);
    }

     博主把接收到的信息存放在USART1MESSAGE的字符数组中,并且打印到了RGB显示屏上,

    红字不用理他,博主是把发送的信息作为执行命令,比如发送了一个清屏函数LCD_Clear(),STM32会调用USMART组件完成相应的功能,如果不是正确格式,就会提示红字。

    以上便是我对HAL库串口中断接收的理解,欢迎大家讨论。

  • 相关阅读:
    一维,二维差分 (P3397 地毯)
    P3406 海底高铁
    P2004 领地选择
    priority_queue 大顶堆与小顶堆的用法 & 常见数据结构时间复杂度
    AcWing 电影
    P2678 跳石头
    HDU2041超级楼梯
    HDU2087剪花布条
    n条线分平面问题解决方法总结
    HDU2034 人见人爱A-B(C++)
  • 原文地址:https://www.cnblogs.com/showtime20190824/p/11407923.html
Copyright © 2020-2023  润新知