【STM32F103实验(四)】串口实验

STM32F030学习之串口收发程序 使用USART最简单的情况是只使用3根线:Tx用于 数据发送,Rx用于数据接收,GND是信号地线,提供通信双方的参考电平。 实现的功能: 1、通过串口发送数据;                2、中断方式接收数据,并将接收到的数据回送。   首先,第一步:配置引脚,将串口映射到PA9(Tx),PA10(Rx)。 void GPIO_Configuration(void)  { GPIO 阅读详情

一、目的

在正点原子的精英版STM32F1上通过串口1和上位机的对话,STM32F1在收到上位机发过来的字符串后,原原本本的返回给上位机。

二、程序设计

1. 串口设置一般步骤

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

(2)串口复位;

(3)GPIO端口初始化;

(4)开启中断并且初始化NVIC;(若要开启中断才需要此步骤)

(5)使能串口;

(6)编写中断处理函数。

void UART_Init_Person(void) 
{
    GPIO_InitTypeDef GPIO_InitSturct;
    NVIC_InitTypeDef NVIC_InitSturct;
    USART_InitTypeDef USART_InitSturct;

    /***************************时钟使能****************************/
    //串口1时钟使能
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
    //GPIOA端口使能(PA9-USART_TX,PA10-USART_RX)
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    
    /************************GPIO端口初始化************************/
    //PA9-USART_TX
    GPIO_InitSturct.GPIO_Mode = GPIO_Mode_AF_PP;    //推挽复用输出
    GPIO_InitSturct.GPIO_Pin =  GPIO_Pin_9;
    GPIO_InitSturct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitSturct);  //初始化串口
    
    //PA10-USART_RX
    GPIO_InitSturct.GPIO_Mode = GPIO_Mode_IN_FLOATING;    //浮空输入
    GPIO_InitSturct.GPIO_Pin =  GPIO_Pin_10;
    GPIO_InitSturct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitSturct);  //初始化串口
    
    /***************************USART1参数初始化配置***************************/
    USART_InitSturct.USART_BaudRate = 115200;   //波特率设置为115200
    USART_InitSturct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;    //无硬件数据流控制
    USART_InitSturct.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;  //收发
    USART_InitSturct.USART_Parity = USART_Parity_No;    //无奇偶校验位 
    USART_InitSturct.USART_StopBits = USART_StopBits_1; //一个停止位
    USART_InitSturct.USART_WordLength = USART_WordLength_8b;    //字长为8位
    USART_Init(USART1,&USART_InitSturct);   //初始化串口
    
    /***********************USART1 NVIC中断配置*************************/
    NVIC_InitSturct.NVIC_IRQChannel = USART1_IRQn;
    NVIC_InitSturct.NVIC_IRQChannelCmd = ENABLE;    //IRQn通道使能
    NVIC_InitSturct.NVIC_IRQChannelPreemptionPriority = 3;  //抢占优先级
    NVIC_InitSturct.NVIC_IRQChannelSubPriority = 3; //子优先级3
    NVIC_Init(&NVIC_InitSturct);
    
    USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);    //开启接收数据中断
    USART_Cmd(USART1,ENABLE);   //使能串口
}

2. 串口1中断响应函数

当串口1接受到中断,则读取串口接受到的数据并对读取到的数据进行分析。此处设计了一个接收协议(注:该接收协议不是自己写的,是参考的正点原子写法):通过串口中断服务函数,配合一个数组USART_RX_BUF[]和一个一个接收状态寄存器USART_RX_STA(该寄存器是一个全局变量,可以自己定义,此处起类似寄存器的功能)实现对串口数据的接收管理。数组USART_RX_BUF[]的大小由USART_REC_LEN 定义,即一次接收数据最大不能超过USART_REC_LEN 个字节。如下图是USART_RX_STA接收寄存器各位的定义。

 设计思路如下:

当接收到从电脑发送过来的数据,把接收的数据保存在USART_RX_BUF[]中,同时在接收状态寄存器(USART_RX_STA)中设数接收到的有效数据个数,当收到回车(回车的标识由2个字节组成:0x0d和0x0a0)的第一个字节0x0d时,计数器将不再增加,等待0x0a的到来,如果0x0a没有来到,则认为此次接收失败,重新开始下一次接收。如果顺利接收到0x0a,则标记USART_RX_STA的第15位,这样完成一次接收,并等待其他位被其他程序清除,从而开始下一次的接收,如果迟迟没有收到0x0d,当在接收数据超过USART_REC_LEN时,则会丢弃前面的数据,重新开始接收。


#define USART_REC_LEN   200 //定义最大接收字节数 200
#define EN_USART1_RX    1   //使能(1)/禁止(0)串口1接收

u8 USART_RX_BUF[USART_REC_LEN]; //接收缓冲区,最大USART_REC_LEN个字节
u16 USART_RX_STA = 0;   //接收状态寄存器,全局变量(可以自行定义),起到类似寄存器的功能,实现对串口数据的接收管理


void USART1_IRQHandler(void)    //串口1中断服务函数
{
    u8 res;
    if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET)    //串口接收到中断,即读取串口接受的数据
    {
        res = USART_ReceiveData(USART1);    //读取接收到的数据
        
        /***********对接收的数据进行分析处理***********/
        if((USART_RX_STA & 0x8000) == 0)    //最高位没有接收到0x0A,接收未完成
        {
            if(USART_RX_STA & 0x4000)   //接收到了0x0D
            {
                if(res != 0x0a)
                    USART_RX_STA = 0;   //接收错误
                else
                    USART_RX_STA |= 0x8000;    //将最高位置1,表示接收完成
            }
            else    //还没有接收到0x0D
            {
                if(res == 0x0d)
                    USART_RX_STA |= 0x4000;
                else
                {
                    USART_RX_BUF[USART_RX_STA & 0x3FFF] = res;
                    USART_RX_STA++;
                    if(USART_RX_STA > (USART_REC_LEN - 1))  //接收数据长度大于最大接收字长
                        USART_RX_STA = 0;   //接收错误,重新开始接收
                }
                
            }
        }
        
    }
}

3. 主函数

int main(void)
{
    u8 t,len;
    u16 times = 0;
    delay_init();
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2
    UART_Init_Person();
    LED_init();
    while(1)
    {
        if(USART_RX_STA & 0x8000)
        {
            len = USART_RX_STA & 0x3f;  //得到此次接收到的数据长度
            printf("\r\n 您发送的消息为:\r\n\r\n");
            for(t = 0;t < len;t++)
            {
                USART_SendData(USART1,USART_RX_BUF[t]);   //将USART_RX_BUF缓存区中的数据向串口1发送
                while(USART_GetFlagStatus(USART1,USART_FLAG_TC) != SET);  //等待发送结束
            }
            printf("\r\n\r\n"); //插入换行
            USART_RX_STA = 0;   //接收寄存器清零,进行下一次数据接收
        }
        else
        {
            times++;
            if(times % 5000 == 0)
            {
                printf("\r\n精英STM32开发板 串口实现\r\n");
            }
            if(times % 200 == 0)
                printf("请输入数据,以回车结束\r\n");
            if(times % 30 == 0)
                LED0 = !LED0;
            delay_ms(10);
        }
    }
    
}

STM32F103学习笔记三 串口通信 本文参照正点原子STM32F1xx官方资料:《STM32中文参考手册V10》-第25章通用同步异步收发器(USART) 及 【STM32】串口通信基本原理(超基础、详细版) 单片机入门学习十 STM32单片机学习七 串口通讯 - 风水月的专栏](https://blog.youkuaiyun.com/fengshuiyue/article/details/79095389) 1、串口通信背景知识 1.1、 ... 阅读详情

相关推荐

Python与STM32F103串口通讯

文章目录准备工作Python 上位机程序STM32下位机程序效果展示 准备工作 要想用python与stm32通讯,首先就要安装python的相关库—pyserial。 其次准备一块32芯片烧录好串口收发程序准备测试,如果手头没有32的话,下载安装虚拟串口进行调试吧。具体安装方法自行百度。废话就不多说了直接上我的案例程序吧。 Python 上位机程序 以下功能具体封装成函数了,在实际开发中,接收...

Funny 8196

基于STM32F103的串口配置

串口作为 MCU 的重要外部接口,同时也是软件开发重要的调试手段,其重要性不言而喻。 现在基本上所有的 MCU 都会带有串口,STM32 自然也不例外.这里我们直接讲配置过程:串口设置的一般步骤可以总结为如下几个步骤:1.串口是挂载在 APB2 下面的外设,所以使能函数为: RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1);2.串口1使用的IO口为A9,A10//USART1_TX GPIOA.9GPIO_InitStructure.GPIO_Pin = GPI

qq_57290347的博客 2208

STM32F103 串口 +DMA中断实现数据收发

01 STM32F103 串口DMA + 空闲中断 实现不定长数据收发 02 文章目录1. 代码讲解1.1 uart_dma.c1.2 uart_dma.h1.3 main.c1.4 stm32f10x_it.c1.5 效果演示     上一篇串口DMA + 空闲中断 实现不定长数据收发      讲了 串口 + DMA空闲中断实现不定长数据收发的功能,除了利用空闲中断实现数据收发,还可以利用DMA的中断实现数据的收发,不同之处

夏夜晚风_的博客 2万+

STM32F103XX的USART串口配置

STM32F103XX的USART串口配置,先从数据手册中查找同步/异步串口在对应的那个数据总线上(APB1和APB2)查看原理图,引脚分别对应串口的数据收发功能。设置IO口,配置对应的八种模式。

qq_48081913的博客 1236

DHT11通过串口打印数值实验【基于stm32f103RCT6】

1.硬件:正点原子mini stm32f103RCT6开发板,DHT11温湿度传感器,j-link仿真器,T口USB线。 2.参数:DHT11技术参数   供电电压: 3.3~5.5V DC  输 出: 单总线数字信号   测量范围: 湿度20-90%RH, 温度0~50℃   测量精度: 湿度+-5%RH, 温度+-2℃   分 辨 率: 湿度1%RH, 温度1℃ 3.连接:DHT11...

qq_38341992的博客 9459

STM32F103 实验 输入捕获

目录 本文,在上一章的基础上,将介绍如下内容 输入捕获 上一篇:STM32F103 实验 PWM输出 https://blog.youkuaiyun.com/qq_40318498/article/details/96475438 参考 STM32F103实验定时器 https://blog.youkuaiyun.com/qq_40318498/article/details/96436994 STM32F10...

qq_40318498的博客 4593

STM32F103学习笔记(四)——串口实验

实验四 串口实验 知识点:端口复用、端口重映射、中断、串行通信 端口复用: GPIO端口时钟使能 复用外设时钟使能 端口模式配置(参考《STM32中文参考手册V10》P110的表格”8.1.11外设的GPIO的配置“) 端口重映射: 使能GPIO时钟(重映射之后的IO) 使能功能外设时钟(例如串口1) 使能AFIO时钟。重映射必须使能AFIO时钟 中断的步骤: UART通信: 串口中断简单收发测试代码: #include "stm32f10x.h" #include "led.h"

qq_29174429的博客 632

【STM32单片机】STM32F103 串口1 串口2 串口3 串口4 串口5 初始化,标准库 ,支持printf

STM32F103RCT6是一款主流性能系列的单片机,采用Arm Cortex-M3内核,具有256K字节的Flash存储器,72 MHz的CPU频率,支持电机控制、USB和CAN等功能。该产品已经批量生产,10kU的单价为4.0035美元,采用LQFP 64封装,尺寸为10x10x1.4mm。STM32F103xC、STM32F103xD和STM32F103xE性能系列产品采用高性能的ARM Cortex-M3 32位RISC内核,工作频率为72 MHz。

q742971636的博客 1万+

STM32F103学习笔记(四) 串口实验

串口通信,首先进行串口的设置:  串口设置的一般步骤可以总结为如下几个步骤: 1) 串口时钟使能, GPIO 时钟使能 2) 串口复位 3) GPIO 端口模式设置 4) 串口参数初始化 5) 开启中断并且初始化 NVIC(如果需要开启中断才需要这个步骤) 6) 使能串口 7) 编写中断处理函数 串口设置原子已经写在usart.c里边了,会拉进来用就行了//初始化 IO 串口 1

mvp_dong的专栏 5548

STM32F103串口例程

STM32F103系列单片机, 串口间通信

stm32f030f4串口例程_STM32F030F4_stm32f030f4p6串口1使用例程_

使用USART1,复用PA9,PA10作为TX和RX引脚,功能测试正常,波特率115200

STM32之USART-串口通信(含串口实验详细解析)

STM32之串口通信 - USART(含串口实验详细解析) 开发环境:Window 10 开发工具:Keil uVision5 MDK 硬件:STM32F103 资料参考: 【正点原子】STM32F103开发板资料(A盘); STM32F1开发指南(精英版)-库函数版本.pdf STM32固件库使用手册的中文翻译版.pdf STM32中文参考手册.pdf 注意:本文主要介绍 USART 异步串行模式下的收发器。 文章目录STM32之串口通信 - USART(含串口实验详细解析)STM32F103Z

小朱.小猪的博客 18万+

BSL编程语言 —— 系统化程序设计

BSL编程语言简介 文章目录0. 选择编程语言1. 写简单的表达式(Expression) 0. 选择编程语言 如果你第一次使用DrRacket,打开后需要选择Beginning Student Language (BSL) Language -> Choose Language (或直接按Ctrl + L),看到如下洁面后选择Beginning Student,点击OK 定义区【De...

CSDoneRight的博客 6450

STM32F103RCT6 两个串口通讯程序

STM32F103RCT6 两个串口通讯程序 此程序为STM32F103RCT6单片机UART1 与UART3两个个串口通讯实验,UART1与UART3互相收发信息。两个串口需要同时与电脑相连接。串口1利用STM32自身串口,串口3通过CH340模块与电脑USB通讯。 串口1给串口3发送数据,串口3接收后打印“串口1给串口3发送数据” 串口3给串口1发送数据,串口1接收后打印“串口1给串口3发送数...

qq_42258981的博客 1万+

python文件转为可执行文件(.exe)的详细步骤

本文详细介绍了如何从零开始把python文件打包成为可执行文件(.exe)。

m0_67093160的博客 3万+

labview设置工业摄像头外部触发

使用labview对海康MV-CA013-GM相机设置外部触发。 一、硬件部分 1、硬件引脚定义 2、触发模式设置 相机的触发模式分为两种,一种是内触发模式、另外一种是外触发模式。 3、接线图 信号线的地要跟给信号的设备共地。信号线给高电平时触发拍照。 二、软件部分 1、创建vision acquisition 2、选择使用的摄像头。 3、选择模式。 4、在Acquisition Control中设置这些选项。 5、设置保存图片路径 设置保存路径和保存图片的格式。点击完成即可 参考:https:/

qq_43493715的博客 5665

STM32F103 实验按键输入与串口实验

目录 本文,在上一章的基础上,将介绍如下内容 按键输入 串口实验 上一篇:STM32F103实验跑马灯与蜂鸣器 https://blog.youkuaiyun.com/qq_40318498/article/details/95940254 正文 要进入按键输入,我们必须先明确,按键连在哪一个GPIO口,通过开发手册,如下 因此,我们可以在蜂鸣器和跑马灯的基础上,完成该实验。 按键输入 #i...

qq_40318498的博客 9692

利用腾讯云轻量服务器快速搭建网站CDN

腾讯云的轻量最近在主机和站长中间可谓是占尽来风头,优秀的线路,低廉的价格使得越来越多的人开始使用腾讯云的轻量级服务器来部署应用。由于腾讯云轻量服务器的海外服务器电信走的是CN2GIA线路带宽30m挺适合做CDN的,我就记录一下如何利用腾讯云香港的轻量服务器搭建一个CDN。 购买服务器 首先选购服务器,最近腾讯云在做活动,力度很大国内备案用户可以选用国内的服务器最低128元/年,未备案的可以选用香港或者新加坡的服务器。 购买链接 服务器系统选Debian、Ubuntu、centos都可以 一键脚

demo_top的博客 2565

STM32F103串口实验

STM32F103串口实验

qq_45822903的博客 1964

108、AWB 时间滤波器:帧间白平衡平滑,防止色彩跳变与过冲

摘要: 文章探讨了AWB(自动白平衡)时间滤波器的设计与优化,以解决帧间白平衡跳变和过冲问题。通过自适应状态机(STABLE/TRANSITION/JUMP)动态调整平滑系数alpha,结合帧率归一化和过冲保护(方向检测+限幅),实现场景切换快速响应与静态稳定性的平衡。作者分享了工程经验:避免固定阈值、联动AE/AF、真实场景验证,并推荐简化卡尔曼滤波替代IIR。最终方案在旗舰机前置摄像头中成功消除“闪白”现象,强调参数需动态适应光照与色温变化。

sundong_81的博客 63

NPC 三电平逆变器中点电位平衡算法详解

最常用:零序电压注入(简单、计算量小)最可靠:虚拟空间矢量调制(VSVPWM)及其改进形式(全范围平衡)趋势:结合模型预测控制(MPC)或智能算法(模糊、神经网络)进一步提升动态性能和鲁棒性。NPC 三电平逆变器中点电位平衡算法的 C# 实现示例(零序电压注入法 + 闭环补偿)在 NPC(Neutral Point Clamped)三电平逆变器中,中点电位平衡最常用且易于软件实现的方案是零序电压注入法。

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 325

STM32F103 USB实现虚拟串口

STM32F103 USB实现虚拟串口。

qq_23313467的博客 9163

Eclipse邂逅Deepseek:本地化部署全攻略

通过前面一系列的步骤,我们成功地在 Eclipse 中完成了 Deepseek 的本地化部署,并且对部署后的功能进行了测试和优化,还解决了可能遇到的一些常见问题。这一过程不仅让我们体验到了将强大的大语言模型与高效的开发环境相结合的魅力,也为我们在软件开发过程中带来了诸多便利。本地化部署 Deepseek 到 Eclipse,使得我们在代码编写过程中能够获得智能的代码补全和精准的问答支持,大大提高了开发效率。同时,本地化部署保障了数据的安全性和隐私性,避免了数据在传输过程中可能面临的风险。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 4516

STM32F103串口通信USART小试牛刀

本文主要叙述了STM32F103芯片实现USART串口通信简介,通过库函数实现STM32F103芯片给电脑发送"Hello,world!" 实验环境:keil μVision、xCOM 文章目录一、串口通信简介二、创建工程1.实验原理2.代码实现三、实验结果四、总结五、参考文献 一、串口通信简介 串口通信指串口按位(bit)发送和接收字节。尽管比特字节(byte)的串行通信慢,但串口可以在使用一根发送数据的同时用另一根线接收数据。常用协议包括RS-232(ANSI/EIA-232标准),一种IBM-PC.

江南烟浓雨的博客 1万+

SAP Integration Suite 与 SAP Cloud Integration 的关系解析

SAP Cloud Integration是SAP Integration Suite套件的核心组件,专注于消息与流程集成。两者关系可概括为:Integration Suite是SAP BTP上的集成平台套件(iPaaS),而Cloud Integration是其中负责应用与B2B集成的关键能力。日常所说的"CPI"实际指代的是Integration Suite中的Cloud Integration功能。该套件还包含API管理、事件网格等其他集成能力,共同构成企业集成解决方案。理解这一层

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 592

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

STM32F103 串口通信

在偶校验中,校验位被设置为确保数据位中的1的总数为偶数。在串口通信里,接好线并配置好串口的初始化之后就可以直接发送数据了,但是为了通信的可靠传输,通信双方往往会采用约定好的通信协议,这个协议可以自定义,也可以直接套用一些经过实践检验的、广为使用的通信协议,比如工业里常用的modbus协议、RS232协议…串口通信是嵌入式里非常常见的通信,不论是STM32还是其它的什么单片机或者任何其它支持串口通信的设备通信时只需要把通信一方的RX与通信另一方的TX,以及一方的TX与另一方的RX相连接就可以进行双向通信。

one_kun的博客 3288

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

上一篇: 串行通信简介
下一篇: 【STM32F103实验(五)】外部中断
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

单片机学习之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值