如何采用STM32单片机串口接收数据

发布者:温柔微笑最新更新时间:2024-03-27 来源: elecfans关键字:STM32  单片机  串口  接收数据 手机看文章 扫描二维码
随时随地手机看文章

0目标1STM32串口简介

2硬件设计3软件设计


4下载验证

0.目标

利用串口1不停的打印信息到电脑上,同时接收从串口发过来的数据,把发送过来的数据直接送回给电脑。

如何采用STM32单片机串口接收数据

1.STM32串口简介

串口设置的一般步骤可以总结为如下几个步骤:

1)串口时钟使能,GPIO时钟使能

2)串口复位

3) GPIO端口模式设置

4)串口参数初始化

5)开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤)

6)使能串口

7)编写中断处理函数

注:对于复用功能的IO,我们首先要使能GPIO时钟,然后使能复用功能时钟,同时要把GPIO模式设置为复用功能对应的模式。

查看手册《STM32 中文参考手册 V10》P110 的表格“8.1.11 外设的 GPIO 配置:

如何采用STM32单片机串口接收数据

2硬件设计

(1)LED0接PA0

(2)串口1

3.软件设计

新建工程:


其中SYSTEM下放置原子哥提供的三个文件夹delay、sys、uart(及其文件),HARDWARE下建LED文件夹,及其内建LED.C与LED.H文件。

uart中串口函数:

voiduart_init(u32bound){

//GPIO端口设置

GPIO_InitTypeDefGPIO_InitStructure;

USART_InitTypeDefUSART_InitStructure;

NVIC_InitTypeDefNVIC_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);//使能USART1,GPIOA时钟

//USART1_TXPA.9

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//PA.9

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出

GPIO_Init(GPIOA,&GPIO_InitStructure);

//USART1_RXPA.10

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空输入

GPIO_Init(GPIOA,&GPIO_InitStructure);

//Usart1NVIC配置

NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级3

NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;//子优先级3

NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//IRQ通道使能

NVIC_Init(&NVIC_InitStructure);//根据指定的参数初始化VIC寄存器

//USART初始化设置

USART_InitStructure.USART_BaudRate=bound;//一般设置为9600;

USART_InitStructure.USART_WordLength=USART_WordLength_8b;//字长为8位数据格式

USART_InitStructure.USART_StopBits=USART_StopBits_1;//一个停止位

USART_InitStructure.USART_Parity=USART_Parity_No;//无奇偶校验位

USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//无硬件数据流控制

USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//收发模式

USART_Init(USART1,&USART_InitStructure);//初始化串口

USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//开启中断

USART_Cmd(USART1,ENABLE);//使能串口

}

LED.c内容:

#include“led.h”

//初始化PA0为输出口。并使能这个口的时钟

//LEDIO初始化

voidLED_Init(void)

{

GPIO_InitTypeDefGPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能PA端口时钟

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;//LED0--》PA0端口配置

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//IO口速度为50MHz

GPIO_Init(GPIOA,&GPIO_InitStructure);//根据设定参数初始化GPIOA0

GPIO_SetBits(GPIOA,GPIO_Pin_0);//PA0输出高

}

led.h:

#ifndef__LED_H

#define__LED_H

#include“sys.h”

#defineLED0PAout(0)//PA0

voidLED_Init(void);//初始化

#endif

主函数:

#include“led.h”

#include“delay.h”

#include“sys.h”

#include“usart.h”

intmain(void)

{

u8t;

u8len;

u16times=0;

delay_init();//延时函数初始化

NVIC_Configuration();//设置NVIC中断分组2:2位抢占优先级,2位响应优先级

uart_init(9600);//串口初始化为9600

LED_Init();//LED端口初始化

while(1)

{

if(USART_RX_STA&0x8000)

{

len=USART_RX_STA&0x3f;//得到此次接收到的数据长度

printf(“ 您发送的消息为: ”);

for(t=0;t

{

USART_SendData(USART1,USART_RX_BUF[t]);//向串口1发送数据

while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束

}

printf(“ ”);//插入换行

USART_RX_STA=0;

}else

{

times++;

if(times%5000==0)

{

printf(“ 口袋里的超超 串口实验 ”


关键字:STM32  单片机  串口  接收数据 引用地址:如何采用STM32单片机串口接收数据

上一篇:STM32时钟要先倍频N倍再分频的原因是什么?
下一篇:STM32单片机的can总线的配置

推荐阅读最新更新时间:2026-03-20 12:29

如何采用STM32单片机串口接收数据
0目标1STM32串口简介 2硬件设计3软件设计 4下载验证 0.目标 利用串口1不停的打印信息到电脑上,同时接收从串口发过来的数据,把发送过来的数据直接送回给电脑。 1.STM32串口简介 串口设置的一般步骤可以总结为如下几个步骤: 1)串口时钟使能,GPIO时钟使能 2)串口复位 3) GPIO端口模式设置 4)串口参数初始化 5)开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤) 6)使能串口 7)编写中断处理函数 注:对于复用功能的IO,我们首先要使能GPIO时钟,然后使能复用功能时钟,同时要把GPIO模式设置为复用功能对应的模式。 查看手册《STM32 中文参考手册 V10》P110 的表格“8.1.1
[单片机]
如何采用<font color='red'>STM32</font><font color='red'>单片机</font><font color='red'>串口</font><font color='red'>接收</font><font color='red'>数据</font>
【菜鸟必看】STM32 串口接收不定长数据中断检测相关问题
今天给大家介绍STM32串口接受不定长数据中断检测的相关问题。能够推测,在UART收到最后一帧数据后,假如随后的一个数据帧的时长内未收到新的数据,则IDLE信号有效.假如数据包之间间隔大于一个数据帧,就能够用IDLE信号作为检测数据包完毕的标志. 运用DMA接管UART-Rx数据,当检测到DMA数据满,或DMA数据半满,或UART的IDLE时,读取DMA数据.假如DMA缓存空间足够大(大于最大的数据包长度),也能够只以IDLE信号为标志. 运用类似的思维,能够用3种方式达到. 启用UART的RXNE中断,运用RXNE中断检测第一数据帧,并读取第一个数据,其次启动DMA接管(DMA设置为Normal模式)和IDLE中断,并关闭RXN
[单片机]
STM32如何高效接收串口数据
硬件:stm32f103cbt6 软件:STM32F10x_StdPeriph_Lib_V3.5.0 DMA,直接内存存取,可以用它的双手释放CPU的灵魂,所以,本文通过USART3进行串口收发,接受使用DMA的方式,无需CPU进行干预,当接受完成之后,数据可以直接从内存的缓冲区读取,从而减少了CPU的压力。 具体的代码实现如下: usart_driver.h 封装了接口,数据接收回调函数类型,基本数据结构等; usart_driver.c 函数原型实现,中断服务函数实现等; 拷贝这两个文件即可,可以根据目录下的参考用例,进行初始化。 头文件usart_driver.h已经声明了外部函数可能用到的接口; USART3_DR的
[单片机]
<font color='red'>STM32</font>如何高效<font color='red'>接收</font><font color='red'>串口</font><font color='red'>数据</font>
利用STM32串口来发送和接收数据实验
0.目标 利用串口 1 不停的打印信息到电脑上,同时接收从串口发过来的数据,把发送过来的数据直接送回给电脑。 1.STM32 串口简介 串口设置的一般步骤可以总结为如下几个步骤: 1) 串口时钟使能, GPIO 时钟使能 2) 串口复位 3) GPIO 端口模式设置 4) 串口参数初始化 5) 开启中断并且初始化 NVIC(如果需要开启中断才需要这个步骤) 6) 使能串口 7) 编写中断处理函数 注:对于复用功能的 IO,我们首先要使能 GPIO 时钟,然后使能复用功能时钟,同时要把 GPIO 模式设置为复用功能对应的模式。 查看手册《STM32 中文参考手册 V10》P110 的表格“8.1.11 外设的 GPIO
[单片机]
利用<font color='red'>STM32</font> 的<font color='red'>串口</font>来发送和<font color='red'>接收</font><font color='red'>数据</font>实验
STM32串口采用DMA方式接收数据测试
环境: 主机:WINXP 开发环境:MDK4.23 MCU:STM32F103CBT6 说明: 串口可以配置成用DMA的方式接收数据,不过DMA需要定长才能产生接收中断,如何接收可变长度的数据呢? 方法有以下3种: 1.将RX脚与一路时钟外部引脚相连,当串口一帧发完,即可利用此定时器产生超时中断.这个实时性较高,可以做到1个字节实时监测. 2.不改变硬件,开启一个定时器监控DMA接收,如果超时则产生中断.这个实时性不高,因为超时时间必须要大于需要接收帧的时间,精度不好控制. 3.STM32单片机有的串口可以监测总线是否处于空闲,如果空闲则产生中断.可以用它来监测DMA接收是否完毕.这种方式
[单片机]
STM32串口接收数据卡死问题解决办法
在使用STM32串口时,有时候串口接受一段时间数据之后便会卡死不在进入中断接收数据。原因是串口中断标志没有清除,导致终端锁死,此时需要判断对应的标志位,重新启动中断。 if((huart1.Instance- CR1 & 0x20)==0) { HAL_UART_Receive_IT(&huart1,bsp_uart1.rx_tmp,1); }
[单片机]
STM32 HAL库学习系列第10篇---串口空闲中断接收不定长数据
串口重定向配置: 可以直接复制使用 /************************************************* * 函数功能: 重定向c库函数printf到DEBUG_USARTx * 输入参数: 无 * 返 回 值: 无 * 说 明:无 */ int fputc(int ch, FILE *f) { HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff); return ch; } /** * 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx * 输入参数: 无 * 返 回 值: 无 *
[单片机]
STM32串口空闲中断接收不定长数据
最近想尝试STM32 通过DMA收发数据,网上找了不少参考文章,最后参考https://blog.csdn.net/youmeichifan/article/details/51750435?utm_source=dlogxgwz2 博文中的方法。 按照此文的方法实现了串口的收发,但是实际使用中发现: 接收空闲中断的产生是在数据接收停止一个字节时产生的,但是有时由于上位机编写问题或硬件问题(本人用到的USB转串口的硬件有问题)上位机发送数据不连续,中间有时间间隔大于一个字节,从而造成无法完整接收数据。通过对空闲中断接收数据方法的分析,重新修改代码,实现规定数据格式的不定长数据的接收。 主要实现方法: 1、定义通讯协
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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