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

发布者:RadiantRiver最新更新时间:2024-06-06 来源: elecfans关键字:STM32CUBEMX  USART  定时器中断  不定长数据 手机看文章 扫描二维码
随时随地手机看文章

概述

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

在这里插入图片描述


关键字:STM32CUBEMX  USART  定时器中断  不定长数据 引用地址:STM32CUBEMX(8)--USART通过定时器中断方式接收不定长数据

上一篇:STM32CUBEMX(14)--SPI,TLC5947外部PWM移植
下一篇:如何用一个ESP8266加上STM32单片机做一个小产品?

推荐阅读最新更新时间:2024-11-03 04:41

STM32CubeMX stm32F4 CAN 使用步骤
STM32CubeMX版本: 固件库版本: 第一步分:CubeMX软件配置。 0、工程配置以及芯片选择这里就不再赘述了。 1、打开CAN外设。 2、配置芯片时钟树。这里我使用了芯片内部HSI RC。 3、CAN配置。 3.1配置波特率为1Mb/s。计算方法:42M/2/(14+6+1)==1M 3.2、使能接收中断。 到这里配置已经完成了,这里我们只配置了部分选项,其余大部分都是采用的默认配置。点击工具栏中齿轮图标,生成代码。 第二部分:代码修改。 1、打开工程,打开can.c文件,在/* USER CODE BEGIN 0 */ 和 /* U
[单片机]
<font color='red'>STM32CubeMX</font> stm32F4 CAN 使用步骤
STM32串口通讯USART
三种方式:查询,中断,DMA 通用同步异步收发器(USART)提供了一种灵活的方法来与使用工业标准NR 异步串行数据格式的外部设备之间进行全双工数据交换。 USART利用分数波特率发生器提供宽范围的波特率选择。 它支持同步单向通信和半双工单线通信。它也支持LIN(局部互连网),智能卡协议和IrDA(红外数据组织)SIR ENDEC规范,以及调制解调器(CTS/RTS)操作。它还允许多处理器通信。用于多缓冲器配置的DMA方式,可以实现高速数据通信。 主要特性: 全双工的,异步通信 NR 标准格式 分数波特率发生器系统 -发送和接收共用的可编程波特率,最高到4.5Mbits/s 可编程数据字长度(8位或9位) 可配置的停
[单片机]
STM32学习笔记(7):USART串口的使用
1. 串口的基本概念 在STM32的参考手册中,串口被描述成通用同步异步收发器(USART),它提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换。USART利用分数波特率发生器提供宽范围的波特率选择。它支持同步单向通信和半双工单线通信,也支持LIN(局部互联网),智能卡协议和IrDA(红外数据组织)SIR ENDEC规范,以及调制解调器(CTS/RTS)操作。它还允许多处理器通信。还可以使用DMA方式,实现高速数据通信。 USART通过3个引脚与其他设备连接在一起,任何USART双向通信至少需要2个引脚:接受数据输入(RX)和发送数据输出(TX)。 RX: 接受数据串行输入
[单片机]
STM32F103学习笔记(七) 定时器中断 (更新中断
STM32的定时器功能十分强大,有TIME1和TIME8高级定时器,TIME2~TIME5通用定时器,TIME6 和 TIME7 基本定时器。 STM32的通用 TIMx (TIM2、 TIM3、 TIM4 和 TIM5)定时器功能包括: 1)16 位向上、向下、向上/向下自动装载计数器( TIMx_CNT)。 2)16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数为 1~ 65535 之间的任意数值。 3) 4 个独立通道( TIMx_CH1~4),这些通道可以用来作为: A.输入捕获 B.输出比较 C. PWM 生成(边缘或中间对齐模式) D. 单脉冲模式输出 4)可使用外部信号( TIM
[单片机]
STM32F407 上手-USART 收发数据
研究了一下KEIL的MDK以及它的文档 一般习惯性的都从串口开始做 hello world! 总结一下,KEIL的入门要比arduino要复杂的多,arduino是为硬件小白及非专业人士准备的。但是它的功能并不弱。 KEIL入门请一定要认真花点时间看一下它的文档,我是用这份文档入门的(http://www2.keil.com/docs/default-source/default-document-library/mdk5-getting-started.pdf?sfvrsn=0) 原以为找个hello world例子就可以轻松入门,后来发现错了。所以认认真真去看完了上面的文档。 不多说了,上面的
[单片机]
STM32F407 上手-<font color='red'>USART</font> 收发<font color='red'>数据</font>
STM32F0xx_DMA收发USART数据配置详细过程
前言 关于DMA(Direct Memory Access)的功能,前面关注我微信的人应该知道,其实我已经在F1芯片上简单讲了一下。有网友要求在F0讲解一下使用DMA收发串口数据。今天就应网友要求总结一下在F0芯片上,使用DMA方式传输(收发)USART数据的功能。 在多种芯片上(F0、F1、F2、F3、F4)了解过DMA模块功能的朋友可能会发现一个特点,就是DMA的功能有很多相似的地方,甚至是一样。其实,每一个模块在不同系列芯片(甚至不同厂商)基本上是大同小异,这就是所谓的触类旁通。对于软件开发也是一样的,当你学会某一项语言的开发,接触其他语言的开发就很容易了。这里我想说,其实我对ST大部分芯片(全系列芯片STM8、STM3
[单片机]
STM32F0xx_DMA收发<font color='red'>USART</font><font color='red'>数据</font>配置详细过程
STM32F030 Nucleo-开发调试的经验USART的重要性
先声明一点,我自己不是高手,也不是大神,只是积累了一点点,想分享一下罢了! 还记得那会我在初学51单片机时,当得知P89V51系列单片机支持在线仿真、跟踪代码时,那是一个兴奋啊,无论如何都要弄一个来玩玩,进行代码跟踪! 当在开始接触和学习STM32是,那时候知道了J-Link的存在,它出了烧录,也能代码跟踪,单步执行。最后有知道了St-Link的存在,它针对意法半导体的MCU作调试和烧录!当然了,还有ST-Link和J-Link的各种针对于STM32的兼容用法。但知道当我开始使用别人的代码进行开发的时候,无可想象,使用J-link或者ST-Link进行在线仿真调试(代码跟踪)显得矫情了! 对于最底层的硬件驱动调试来说,
[单片机]
STM32F030 Nucleo-开发调试的经验<font color='red'>USART</font>的重要性
STC10F10XE定时器中断输出10KHz的方波程序
//咱做硬件的也动手做点测试程序,为了测试新做的电机驱动板,找了个51的板子当10K信号发生器测试IGBT开关延时时间。 #include STC_NEW_8051.H #include intrins.h #define uchar unsigned char //这个T0定时器中断程序网上找的,改了下定义和计数器值,移植到STC10F10XE上。 sbit OUT=P2^7; //定义OUT输出端口 /*------------------------------------------------ 定时器初始化子程序 ------------------------------------------------*/ voi
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved