HAL库中断方式进行串口通信

HAL库中断方式进行串口通信

文章目录

  • HAL库中断方式进行串口通信
  • 版本:
  • 1. 通过CubeMX配置项目
  • 1.1 设置SYS
  • 1.2 设置RCC
  • 1.3 设置USART
  • 1.4 设置NVIC
  • 1.5 设置时钟
  • 1.6 创建项目
  • 2. keil配置代码
  • 2.1 **printf函数设置**
  • 2.2 设置两个字符型数组和FLAG
  • 2.2在main函数中设置接收中断
  • 2.2.1 函数原型
  • 2.2.2 功能
  • 2.2.3 参数
  • 2.2.4 在while前添加
  • 2.3 main函数里while循环里面添加传输代码
  • 2.4 在main函数下面重写中断处理函数
  • 3. 编译
  • 4.烧录
  • 5.运行
  • 6.总结
  • 7. 参考文章
  • 版本:

    软件:

    STM32CubeMX:6.6.0
    KEIl:5.37.0.0
    FlyMcu:0.188
    硬件:
    STM32F103ZET6

    1. 通过CubeMX配置项目

    1.1 设置SYS

    image-20221019190425614

    1.2 设置RCC

    image-20221019191732518

    1.3 设置USART

    image-20221019191844584

    1.4 设置NVIC

    image-20221019191953929

    1.5 设置时钟

    image-20221022090327014

    1.6 创建项目

    image-20221019192059091

    image-20221019192106506

    2. keil配置代码

    2.1 printf函数设置

    main.cusart.c中添加头文件#include "stdio.h"之后,勾选Target中的use MicroLIB,在mian.c文件中,添加如下代码,进行重定义

    int fputc(int ch, FILE *f)
     
    {
     
      HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
     
      return ch;
     
    }
    
    

    2.2 设置两个字符型数组和FLAG

    main.c中设置两个字符型数组,用来存放需要判别的字符串(记得添加头文件#include "string.h")。同时设置FLAG标志变量,来判断电脑向stm32发送了哪一个字符串。

    uint8_t aRxBuffer;		//接收中断
    uint8_t Uart1_RxBuff[256]; //接收缓冲
    uint8_t str1[1] = "g";
    uint8_t str2[1] = "s";
    uint8_t go[20] = "go stm32!";
    uint8_t stop[20] = "stop stm32!";
    uint8_t Uart1_Rx_Cnt = 0;	//接收缓冲计算
    uint8_t cAlmStr[] = "数据溢出\r\n";
    unsigned int flag = 1;
    

    2.2在main函数中设置接收中断

    2.2.1 函数原型

    HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

    2.2.2 功能

    串口中断接收,以中断方式接收指定长度数据。

    1. 大致过程是,设置数据存放位置,接收数据长度,然后使能串口接收中断。

    2. 接收到数据时,会触发串口中断。

    3. 再然后,串口中断函数处理,直到接收到指定长度数据

    4. 而后关闭中断,进入中断接收回调函数,不再触发接收中断。(只触发一次中断)

    2.2.3 参数

    UART_HandleTypeDef *huart UATR的别名
    huart1 *pData 接收到的数据存放地址
    Size 接收的字节数

    2.2.4 在while前添加

    HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);
    

    image-20221022103155132

    2.3 main函数里while循环里面添加传输代码

    while (1)
    {
    	if(flag == 1){		
    	  		printf("Hello windows!\r\n");
    		}
    	HAL_Delay(1000);
    }
    

    2.4 在main函数下面重写中断处理函数

    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
    {
    	if(strcmp(Uart1_RxBuff, str1) == 0)
    	{
    			flag = 1;
    			printf("start....\r\n");
    		
    	}
    	if(strcmp(Uart1_RxBuff, str2) == 0)
    	{
    			flag = 0;
    			printf("stop....\r\n");
    		
    	}
    	if (strcmp(Uart1_RxBuff, go) == 0){
    			flag = 1;
    			printf("start....\r\n");
    		
    	}
    	if (strcmp(Uart1_RxBuff, stop) == 0){
    			flag = 0;
    			printf("stop....\r\n");
    		
    	}
    	if(Uart1_Rx_Cnt >= 255)  //溢出判断
    	{
    		Uart1_Rx_Cnt = 0;
    		memset(Uart1_RxBuff,0x00,sizeof(Uart1_RxBuff));
    		HAL_UART_Transmit(&huart1, (uint8_t *)&cAlmStr, sizeof(cAlmStr),0xFFFF);	
    	}
    	else
    	{
    		Uart1_RxBuff[Uart1_Rx_Cnt++] = aRxBuffer;   //接收数据转存
    	
    		if((Uart1_RxBuff[Uart1_Rx_Cnt-1] == 0x0A)&&(Uart1_RxBuff[Uart1_Rx_Cnt-2] == 0x0D)) //判断结束位
    		{
    			Uart1_Rx_Cnt = 0;
    			memset(Uart1_RxBuff,0x00,sizeof(Uart1_RxBuff)); //清空数组
    		}
    	}
    	
    	HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);   //再开启接收中断
    
    }
    

    image-20221022104531824

    3. 编译

    image-20221019194643767

    4.烧录

    image-20221019194911851

    5.运行

    image-20221022102725046

    image-20221022102739902

    6.总结

    使用HAL库配置好相关引脚后,在生成的代码里可以很容易的实现中断控制串口通信,但是大量的函数需要自己查找,需要大量练习。

    7. 参考文章

    STM32利用中断实现LED亮灭和串口通信的收发_xxbiubiu的博客-CSDN博客

    物联沃分享整理
    物联沃-IOTWORD物联网 » HAL库中断方式进行串口通信

    发表回复