zoukankan      html  css  js  c++  java
  • 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库串口中断接收的理解,欢迎大家讨论。

  • 相关阅读:
    爱斯达M2C服装定制系统介绍—在线播放—优酷网,视频高清在线观看
    衣云网,依托深圳发达的服装产业,致力于整合服装上下游各个服装利益者,以自主研发的服装软件为核心,聚集服装设计师、纸样师和版师,这三类会员在衣云网开设工作室上传原创服装纸样,推荐相应纸样的面料吸引大批的面辅料商和服装企业。从而形成一个良性的服装生态圈。
    男士休闲装设计
    新郎胸花佩戴法则 小胸花也有大学问_新郎_婚礼时光-关注婚礼的一切,分享最美好的时光。
    上海游侠电动汽车团队招募。iOS,Android,产品经理以及 SEVER 端工程师
    沈晨:衣冠自成气场·都市周报
    寻访上海西服定制店_Enjoy·雅趣频道_财新网
    金错刀对话口袋购物王珂:找到痛点,确认卖点,制造爆点!
    Wish | IT桔子
    Tradesy | IT桔子
  • 原文地址:https://www.cnblogs.com/showtime20190824/p/11407923.html
Copyright © 2011-2022 走看看