STM32CUBEMX(8)--USART通过定时器中断方式接收不定长数据

发布时间:2024-06-06  

概述

本文利用中断实现串口不定长接收(非DMA),使用HAL库,将接收的数据打印出去。

DMA接收请查看:https://blog.csdn.net/qq_24312945/article/details/106557538


硬件准备

首先需要准备一个开发板,这里我准备的是NUCLEO-F030R8的开发板:

在这里插入图片描述

选择芯片型号

使用STM32CUBEMX选择芯片stm32f030r8,如下所示:

在这里插入图片描述

配置时钟源

HSE与LSE分别为外部高速时钟和低速时钟,在本文中使用内置的时钟源,故都选择Disable选项,如下所示:

在这里插入图片描述

配置时钟树

STM32F0的最高主频到48M,所以配置48即可:

在这里插入图片描述

串口配置

本次实验使用的串口1进行串口通信,波特率配置为115200。

在这里插入图片描述

中断

在这里插入图片描述

GPIO配置

板子上led为PA5端口,故设置PA5闪烁来验证是否正确。

在这里插入图片描述

定时器配置

本次实验使用的是TIM3来进行计数。

在这里插入图片描述

PWM频率计算如下所示

在这里插入图片描述

在上面配置TIM3参数,预分频系数设置为480-1, 自动重载值设置为10000-1,那么PWM频率为48,000,000/((480-1+1)*(10000-1+1))=10Hz,即 100ms一个周期。

生成工程设置

注意在生成工程设置中不能出现中文,不然会报错。

在这里插入图片描述

代码生成设置

最后设置生成独立的初始化文件:

在这里插入图片描述

生成代码

在这里插入图片描述

配置keil

在这里插入图片描述

代码

在main.c中,先加入头文件。


/* USER CODE BEGIN Includes */

#include "stdio.h"//printf头文件

#include "string.h"//memset头文件

/* USER CODE END Includes */

定义变量存储。


/* USER CODE BEGIN PV */

uint8_t RxBuff[1];      //进入中断接收数据的数组

uint8_t DataBuff[5000]; //保存接收到的数据的数组

int RxLine=0;           //接收到的数据长度

int Rx_flag=0;                    //接受到数据标志

/* USER CODE END PV */

定义printf的重定向函数fputc。


/* USER CODE BEGIN 0 */

void printf_usart(void);//输出内容

int fputc(int ch, FILE* file)//定义printf的重定向函数fputc,满足串口调试打印

{

    return HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 100);

}

/* USER CODE END 0 */

打开串口和定时器。


/* USER CODE BEGIN 2 */

    HAL_UART_Receive_IT(&huart1, (uint8_t *)RxBuff, 1); //打开串口中断接收

    HAL_TIM_Base_Start_IT(&htim3);//开启定时器

  /* USER CODE END 2 */

串口接受代码,当接受到最后数据为FF时候,直接打印,否则等待100ms打印。


复制

/* USER CODE BEGIN 4 */

void printf_usart(void)

{

    printf("数据长度=%d

",RxLine); 

    for(int i=0;iprintf("数据:[%d] = 0x%x

",i,DataBuff[i]);                            

    memset(DataBuff,0,sizeof(DataBuff));  //清空缓存数组

    //memset()作用:可以方便的清空一个结构类型的变量或数组。

    //例句:memset(aTxbuffer,0,sizeof(aTxbuffer))  用memset清空aTxbuffer。

    RxLine=0;  //清空接收长度

}



void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

{

    if (htim->Instance == htim3.Instance)

    {

            HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);

        /* Toggle LED */

            if(Rx_flag==1)

            {

                printf_usart();

                Rx_flag=0;

            }

        }   

}




// 捕获中断回调函数,每次捕获到信号就会进入这个回调函数

void HAL_UART_RxCpltCallback(UART_HandleTypeDef*UartHandle)

{

    RxLine++;                      //每接收到一个数据,进入回调数据长度加1

    DataBuff[RxLine-1]=RxBuff[0];  //把每次接收到的数据保存到缓存数组

        Rx_flag=1;

    if(RxBuff[0]==0xff)            //接收结束标志位,这个数据可以自定义,根据实际需求,这里只做示例使用,不一定是0xff

    {

            printf_usart();

    }   

    RxBuff[0]=0;

    HAL_UART_Receive_IT(&huart1, (uint8_t *)RxBuff, 1); //每接收一个数据,就打开一次串口中断接收,否则只会接收一个数据就停止接收

        __HAL_TIM_SET_COUNTER(&htim3, 1); // 计数清零,从头开始计

}

/* USER CODE END 4 */

演示效果

可以看到 发送11 12 13需要等待100ms左右才能发送,如果最后加上ff直接发送。

在这里插入图片描述


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>