当前位置: 首页 > 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云盘

相关文章:

  • linux中sigint和sigterm的区别
  • CSS:选择器-基本选择器
  • 虚实结合赋能嵌入式教育:基于嵌入式仿真实验教学平台的智能门禁系统实验深度解析
  • 通义灵码全面接入Qwen3:AI编程进入智能体时代,PAI云上部署实战解析
  • 文章记单词 | 第51篇(六级)
  • CKESC STONE 80A-L 电调专业测评
  • VARIAN安捷伦真空泵维修清洁保养操作SOP换油操作流程内部转子图文并茂内部培训手侧
  • 客户联络中心如何进行能力建设?
  • Elastic Security 8.18 和 9.0 中的新功能
  • 2025年Jetpack Compose集成网络请求库的完整实施方案
  • SQL Server数据库提权的几种方法——提权教程
  • Oracle 10g DG 状态检查和恢复同步
  • python安装和环境配置,开发方法简要步骤。
  • 慧星云支持 Qwen3:开启智算新生态,共筑高效 AI 未来
  • RPG4.设置角色输入
  • nginx 解决跨域问题
  • GCC-C语言“自定义段”
  • 近期汇报
  • Nginx 重写与重定向配置
  • Java架构师深度技术面试:从核心基础到分布式架构全解析
  • 庄语乐︱宋代历史是被“塑造”出来的吗?
  • 解放日报:中国大模型企业的发展机遇已经到来
  • 海量数据处于“原矿”状态,数据价值释放如何破局?
  • 顺利撤离空间站,神十九乘组踏上回家之旅
  • 打造沪派水乡的“湿意”,上海正在保护营造一批湿地空间
  • 发布亮眼一季度报后,东阿阿胶股价跌停:现金流隐忧引发争议