0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

嵌入式单片机MCU开发 来源:嵌入式单片机MCU开发 作者:嵌入式单片机MC 2022-11-14 16:31 次阅读

概述

本文利用中断实现串口不定长接收(非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直接发送。

在这里插入图片描述

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 定时器
    +关注

    关注

    23

    文章

    3237

    浏览量

    114432
  • USART
    +关注

    关注

    1

    文章

    195

    浏览量

    30786
  • stm32cubemx
    +关注

    关注

    5

    文章

    280

    浏览量

    14746
收藏 人收藏

    评论

    相关推荐

    STM32CubeMx入门教程(3):定时器的使用

    导语“ 使用STM32CubeMx 生成初始化定时器代码,实现定时器特定定时
    发表于 07-11 15:22 3840次阅读
    <b class='flag-5'>STM32CubeMx</b>入门教程(3):<b class='flag-5'>定时器</b>的使用

    CW32L083串口中断+定时器实现不定长数据接收

    CW32L083 用串口中断定时器中断实现串口的不定长数据接收,特别适用于AT指令的
    的头像 发表于 07-12 09:00 1870次阅读
    CW32L083串口<b class='flag-5'>中断</b>+<b class='flag-5'>定时器</b>实现<b class='flag-5'>不定长</b><b class='flag-5'>数据</b><b class='flag-5'>接收</b>

    STM32CUBEMX(2)--USART通过DMA方式接收不定长数据

    ;stm32f0xx_it.c\"文件中断外部变量引用: /* USER CODE BEGIN 0 */ #define BUFFERSIZE 255 //可接收的最大数据量 exte
    发表于 09-04 11:48

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

    概述 本文利用中断实现串口不定长接收(非DMA),使用HAL库,将接收数据打印出去。 DMA接收
    发表于 09-06 16:48

    STM32CubeMX串口+DMA接收不定长数据的函数分享

    STM32CubeMX串口+DMA接收不定长数据的函数分享
    发表于 12-07 07:23

    利用STM32单片机的IDLE空闲中断接收不定长数据

    定长数据,无法稳定接收不定长数据,本章介绍利用STM32单片机的IDLE空闲
    发表于 12-13 06:46

    【MCU】基于STM32CubeMX定时器中断实现LED闪烁

    基于STM32CubeMX定时器中断实现 LED 闪烁本实验基于STM32CubeMX实现对STM32开发板的配置,
    发表于 10-29 11:06 20次下载
    【MCU】基于<b class='flag-5'>STM32CubeMX</b><b class='flag-5'>定时器</b><b class='flag-5'>中断</b>实现LED闪烁

    STM32CUBEMX(2)--USART通过DMA方式接收不定长数据

    STM32CUBEME--2USART通过DMA方式接收不定长数据概述硬件准备选择芯片型号配置时
    发表于 12-01 15:06 0次下载
    <b class='flag-5'>STM32CUBEMX</b>(2)--<b class='flag-5'>USART</b><b class='flag-5'>通过</b>DMA<b class='flag-5'>方式</b><b class='flag-5'>接收</b><b class='flag-5'>不定长</b><b class='flag-5'>数据</b>

    STM32 HAL库中串口空闲中断+DMA 实现串口数据不定长接收

    Package for STM32F0 Series)本文内容:不定长数据接收的原理串口接收中断
    发表于 12-06 18:36 26次下载
    <b class='flag-5'>STM32</b> HAL库中串口空闲<b class='flag-5'>中断</b>+DMA 实现串口<b class='flag-5'>数据</b>的<b class='flag-5'>不定长</b><b class='flag-5'>接收</b>

    STM32CubeMX HAL库串口+DMA+IDLE空闲中断不定长度数据接收和发送

    Cube_FW_F1_V1.8.0(STM32Cube MCU Package for STM32F1xx Series)本文内容:不定长数据接收
    发表于 12-07 11:36 24次下载
    <b class='flag-5'>STM32CubeMX</b> HAL库串口+DMA+IDLE空闲<b class='flag-5'>中断</b><b class='flag-5'>不定长度数据</b><b class='flag-5'>接收</b>和发送

    STM32+串口空闲中断实现不定长数据接收

    常见的数据帧断帧方式有两种,一种是通过固定的协议格式断帧,另外一个是通过两帧数据的时间断帧,下面介绍最后一种,利用
    发表于 12-20 19:34 7次下载
    <b class='flag-5'>STM32</b>+串口空闲<b class='flag-5'>中断</b>实现<b class='flag-5'>不定长</b><b class='flag-5'>数据</b><b class='flag-5'>接收</b>

    瑞萨e2studio(12)----USRT通过定时器中断方式接收不定长数据

    本篇文章主要介绍如何使用e2studio对瑞萨单片机进行USRT通过定时器中断方式接收不定长
    的头像 发表于 11-15 11:19 1145次阅读
    瑞萨e2studio(12)----USRT<b class='flag-5'>通过</b><b class='flag-5'>定时器</b><b class='flag-5'>中断</b><b class='flag-5'>方式</b><b class='flag-5'>接收</b><b class='flag-5'>不定长</b><b class='flag-5'>数据</b>

    瑞萨e2studio----USRT通过定时器中断方式接收不定长数据

    本篇文章主要介绍如何使用e2studio对瑞萨单片机进行USRT通过定时器中断方式接收不定长
    的头像 发表于 11-02 17:21 1471次阅读
    瑞萨e2studio----USRT<b class='flag-5'>通过</b><b class='flag-5'>定时器</b><b class='flag-5'>中断</b><b class='flag-5'>方式</b><b class='flag-5'>接收</b><b class='flag-5'>不定长</b><b class='flag-5'>数据</b>

    STM32CubeMX之串口接收不定长数据

    基本串口通信通常只能接收定长数据,无法稳定接收不定长数据,本章介绍利用
    的头像 发表于 05-11 09:59 3249次阅读
    <b class='flag-5'>STM32CubeMX</b>之串口<b class='flag-5'>接收</b><b class='flag-5'>不定长</b><b class='flag-5'>数据</b>

    使用UART IDLE中断接收不定长数据

    使用UART IDLE中断接收不定长数据
    的头像 发表于 09-18 15:41 1024次阅读
    使用UART IDLE<b class='flag-5'>中断</b><b class='flag-5'>接收</b><b class='flag-5'>不定长</b><b class='flag-5'>数据</b>