当前位置: 首页 > news >正文

嵌入式软件--stm32 DAY 5 USART串口通讯(上)

前边我们学的都是通用的功能,例如GPIO、中断,现在我们要学习的是某一个特定的功能。典型的就是通讯功能。其中,最简单的通讯协议就是串口了。

一、串口_通讯基础知识

1.1 串行与并行

按数据传送的方式分类的。

串行通信一位一位传输,并行则是8位(16、32位)同行。(按位传输)

频率越高,电流产生电磁场,干扰越大。

早期用的硬盘ATA,后来有了SATA硬盘(S是串行的意思)

传输接口基本上都是串行。

1.2 单工、半双工、全双工

单工传输:数据单向传输,只能A-->B

半双工传输:数据双向传输,但同一时刻只能传一个方向,不可同时。如对讲机!

全双工传输:至少2条线,同时双向传输。

1.3 同步和异步

同步和异步区别:有无时钟!

同步至少两根线:一个传输时钟信号,一个传输数据信号

异步只有一根线,单工或半双工

二、串口通讯:

两根线实现全双工

串口通讯协议:

波特率:

奇偶校验位:

奇校验:所有1加起来是一个奇数

偶校验:所有1加起来是一个偶数

空闲位:

分数波特率的产生

小数部分:DIV_Fraction

整数部分:DIV_Mantissa

状态寄存器SR

IDEA:0没有检测到空闲 ,1检测到空闲总线

TXE:

TC:

RXNE:

控制寄存器1USART_CR1

控制寄存器2USART_CR2

三、USART外设

同步异步收发器,串行通信设备,全双工数据交换。

UART与USART相比去掉了同步通讯功能

USART1通讯速率最高,可以达到4.5Mbps。2,3,4,5最高只有USART1的一半。

我们在stm32中,调试口用USART1.

以前台式电脑,就是以上的Bj9接口. 

UART是异步收发器。UART,有时指设备,有时指协议。

RS485两根线,作差分传输,半双工。

四、波特率设置

分数波特率的产生

接收器和发送器的波特率在USARTDIV的整数和小数寄存器中的值应设置成相同。

fck=72MHZ

如果DIV_Mantissa=27,整数是27,DIV_Fraction=12(USART_BRR=0x1BC),小数是12.

例二是我们要常用的,可以配波特率。

五、串口所用寄存器

TDR

RDR

检测到空闲帧,IDLE置1.

六、寄存器实现

目前很多电脑没有串口接口,为了使用串口,我们自制的下载器STLink2.1拥有USB转串口的功能。

所用引脚:

上位机,串口调试工具:

文末给大家分享的资料包里有。我们能通过串口工具向stm32发信息。当然stm32要想收到,必须有相应的接收程序。

2.1 创建工程

 

创建新的外设代码文件USART

 

有了新的文件,KEIL里面必须配置上。

 

之后便是通过VSCODE打开。

2.2 代码编写 

将usart.c和usart.h,预处理编码做好。声明需要编写的函数。

我们用的usart1在APB2系统总线上。

我们也要开启GPIO的时钟,因为有输入输出。

usart.h

#ifndef __USART_H
#define __USART_H#include "stm32f10x.h"
//初始化
void USART_Init(void);//发送一个字符
void USART_SendChar(uint8_t ch);//接收一个字符
uint8_t USART_ReceiveChar(void);#endif

usart.c 

#include "usart.h"//初始化
void USART_Init(void)
{//开启时钟RCC->APB2ENR |= RCC_APB2ENR_USART1EN;RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;//GPIO工作模式// PA9:TX 复用推挽输出,CNF=10,MODE=11GPIOA->CRH |= GPIO_CRH_MODE9;GPIOA->CRH |= GPIO_CRH_CNF9_1;GPIOA->CRH &= ~GPIO_CRH_CNF9_0;// PA10:RX 浮空输入,CNF=01,MODE=00GPIOA->CRH &= ~GPIO_CRH_MODE10;GPIOA->CRH &= ~GPIO_CRH_CNF10_1;GPIOA->CRH |= GPIO_CRH_CNF10_0;//串口模块设置//设置波特率 115200USART1->BRR = 0x271;//使能串口和收发模块USART1->CR1 |= USART_CR1_UE;USART1->CR1 |= (USART_CR1_TE|USART_CR1_RE);//配置数据帧格式USART1->CR1 &=~ USART_CR1_M;   //长度为8位的数据,没有校验位USART1->CR1 &=~ USART_CR1_PCE;  //无校验,不使用校验位USART1->CR2 &=~ USART_CR2_STOP;  //1位停止位}//发送一个字符
void USART_SendChar(uint8_t ch)
{//判断TDR是否为空,必须等待TDR为空才能写入数据,也就是继续发送while((USART1->SR & USART_SR_TXE)==0){}//将要发送的数据写入TDRUSART1->DR = ch;
}//接收一个字符
uint8_t USART_ReceiveChar(void)
{//判断RDR是否非空。必须有数据才能读取数据while((USART1->SR & USART_SR_RXNE)==0){}//读取接收到的数据,返回return USART1->DR;
}

main.c

#include "usart.h"
#include "delay.h"int main(void)
{//1.初始化USART_Init();//发送单个字符USART_SendChar('A');USART_SendChar('B');USART_SendChar('C');USART_SendChar('\n');while(1){//不停发送字符USART_SendChar('D');USART_SendChar('\n');//延时Delay_ms(500);}}

 

还可以看看接收,接收到我们在软件中发送的,再次发到软件。

这样可能不太明显,如果我们在软件上位机发给stm32一个小写字母,我们32端收到后,将其转化为大写字母,再次发到上位机。因为小写字母与大写字母在ASCII值相差32,所以只要做差即可

 

七、资料

stm32开发官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘

http://www.xdnf.cn/news/228439.html

相关文章:

  • java瘦身、升级graalvm
  • QT6 源(63)篇六:阅读与注释 QString 这个类,包含了 QString 类的 完整源码,也附上 QLatin1String 类的
  • Redis的简单介绍
  • k8s术语之Replication Controller
  • mmdeploy 转换torch为onnx
  • 2025磐石行动第八周WP
  • JavaScript性能优化实战之代码层面性能优化
  • 贪心算法求解边界最大数
  • 精益数据分析(34/126):深挖电商运营关键要点与指标
  • SAP-ABAP:在SAP系统中,COEP表(成本控制对象行项目表)详解
  • AI 生成UI交互效果
  • 基于C++的IOT网关和平台6:github项目ctGateway后台服务和数据模型
  • C++负载均衡远程调用学习之自定义内存池管理
  • SVTAV1源码-set_all_ref_frame_type
  • 专家访谈:从文本到视频,GEO多模态优化的实战法则
  • IDEA git配置[通俗易懂]
  • halcon打开图形窗口
  • 模型部署技巧(一)
  • Python爬虫实战:获取彼岸网高清素材图片
  • Windows 10 环境二进制方式安装 MySQL 8.0.41
  • Locate 3D:Meta出品自监督学习3D定位方法
  • 大模型——使用 StarRocks 作为向量数据库
  • Go 写一个简单的Get和Post请求服务
  • 03_spring配置优先级
  • 回归分析丨基于R语言复杂数据回归与混合效应模型【多水平/分层/嵌套】技术与代码
  • 数智化招标采购系统针对供应商管理解决方案(采购如何管控供应商)
  • Qt/C++面试【速通笔记六】—Qt 中的线程同步
  • 合并两个有序数组
  • DataWorks Copilot 集成 Qwen3-235B-A22B混合推理模型,AI 效能再升级!
  • uniapp 实现时分秒 分别倒计时