IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32的USART编程 -> 正文阅读

[嵌入式]STM32的USART编程

数据的发送

TE标志位

  1. 要想使串口能够发送数据,必须置位TE标志位,并且在写入发送寄存器TDR之前置位。
  2. 当TE位置位,会产生一个空闲帧。
  3. 数据传输过程中,复位TE,会导致数据发送错误,波特率产生器会冻结。

TXE状态标志位

该位由硬件置位,它表示:

  1. 数据已从 USART_TDR 寄存器移至移位寄存器,并且数据传输已经开始。
  2. USART_TDR 寄存器为空。
  3. 下一个数据可以写入 USART_TDR 寄存器而无需覆盖以前的数据。

如果 TXEIE 置位,会产生一个中断
该标志位清除方法

  1. 写入新数据到USART_TDR
  2. USART_RQR中的TXFRQ置位刷新该标志位

TC标志位

该标准位代表发送结束,如图。
在这里插入图片描述

发送数据的配置顺序

  1. 配置CR1寄存器的M标志位,即配置数据长度;
  2. 配置波特率;
  3. 配置停止位长度;
  4. 通过置位CR1的UE标志位使能USART模块;
  5. 如果需要配置DMA可在CR3寄存器配置DMA;
  6. 置位CR1寄存器的TE标志位,发送一个空闲帧;
  7. 将要发送的数据写入TDR寄存器,如果在单数据传输模式,TXE会被清除;
  8. 最后一个数据被写入TDR寄存器后,等待TC标志位置位,表示最后一帧数据发送完成。

数据的读取

RXNE状态标志位

当该标志位置位,代表:

  1. 移位寄存器的内容被传送到TRD寄存器,可读;
  2. 如果使能RXNEIE标志位可产生中断

接收数据的配置顺序

  1. 配置CR1寄存器的M标志位,即配置数据长度;
  2. 配置波特率;
  3. 配置停止位长度;
  4. 通过置位CR1的UE标志位使能USART模块;
  5. 如果需要配置DMA可在CR3寄存器配置DMA;
  6. 置位CR1寄存器的RE标志位,RX开始寻找起始帧。

波特率

在这里插入图片描述
在这里插入图片描述
fCK在RCC_CGFR3寄存器中配置
在这里插入图片描述

例: SYSCLK频率为72MHz,想要得到19200的波特率,则:
将USARTSW配置为01,即SYSCLK

19200 = 72000000 / USARTDIV

OVER8不置位 则BBR = 3750十六进制为0x0EA6。

注意:

  1. 如果调试过程中,单片机读不到数据,但是能发送数据,可能是外部没有上拉,此时可以配置引脚内部上拉进行调试,有了上拉以后,串口才能读到数据。
  2. Modbus的地址为1,实际发出的地址是0;CAN的地址为1,实际发送的也是1。两种协议的区别。
  3. 不清除中断标志位会导致一直进入中断,可在中断中关闭中断使能从而避免一直进入中断。

附录

寄存器|初始化

void USART1_Init(void)
{
/*
在RCC_CFGR寄存器中配置USART时钟源fCK
当前配置为SYSCLK 72MHz
*/
	//步骤1  配置CR1寄存器的M标志位,即配置数据长度
	USART1->CR1 = (USART1->CR1 & 0xe000000)
	// |0x10000000					//bit28:【00|1起始位,8数据位】【01|1起始位,9数据位】【10|1起始位,7数据位】
	// |USART_CR1_EOBIE			//bit27:【1|EOBF标志位中断使能】
	// |USART_CR1_RTOIE			//bit26:【1|RTOF标志位中断使能】
	// |USART_CR1_DEAT				//bit[25:21]:DE时间
	// |USART_CR1_DEDT				//bit[20:16]:DE时间
	// |USART_CR1_OVER8			//bit15:【0|过采样/16】【1|过采样/8】
	// |USART_CR1_CMIE				//bit14:字符匹配中断使能(CMF标志位)
	// |USART_CR1_MME				//bit13:静音模式使能【0|一直活动】【1|静音模式】配合WAKE唤醒
	// |USART_CR1_M				//bit12:【00|1起始位,8数据位】【01|1起始位,9数据位】【10|1起始位,7数据位】
	// |USART_CR1_WAKE				//bit11:唤醒方法配置【0|空闲总线唤醒】【1|地址唤醒】
	// |USART_CR1_PCE				//bit10:奇偶校验使能
	// |USART_CR1_PS				//bit09:【0|偶校验】【1|奇校验】
	// |USART_CR1_PEIE				//bit08:PE中断使能位
	// |USART_CR1_TXEIE			//bit07:TXE中断使能位
	// |USART_CR1_TCIE				//bit06:TC中断使能位
	// |USART_CR1_RXNEIE			//bit05:RXNE/ORE中断使能位
	// |USART_CR1_IDLEIE			//bit04:IDLE中断使能位
	// |USART_CR1_TE				//bit03:发送使能
	// |USART_CR1_RE				//bit02:接收使能
	// |USART_CR1_UESM				//bit01:【0|USART不能在停止模式唤醒】【1|当配置USART的RCC时钟,可以在停止模式被唤醒】
	// |USART_CR1_UE				//bit00:使能USART模块
	;
	
	//步骤2 设置波特率
	// USART1->BRR = 0x0EA6;			//bit[15:4]:USARTDIV[15:4]//72000000/19200 = 3750
	USART1->BRR = 1250;			//bit[15:4]:USARTDIV[15:4]//72000000/57600 = 1250
								//bit[3:0]:【OVER8=0| USARTDIV[3:0]】【OVER8=1| USARTDIV[3:0]右移1位,此时BIT3必须为0】
	
	//步骤3 配置停止位长度
	USART1->CR2 = (USART1->CR2 & 0x0000008f)
	// |USART_CR2_ADD				//bit[31:24]:地址匹配或者数据匹配的数据
	// |USART_CR2_RTOEN			//bit23:接收超时使能
	// |USART_CR2_ABRMODE_1		//bit[22:21]:【00|起始位检测】【01|start->10检测】
	// |USART_CR2_ABRMODE_0		//自动波特率检测	【10|0x7f检测】【11|0x55检测】
	// |USART_CR2_ABREN			//bit20:自动波特率检测使能【0|禁止】【1|使能】
	// |USART_CR2_MSBFIRST			//bit19:【0|先发送低位】【1|先发送高位】
	// |USART_CR2_DATAINV			//bit18:【0|正常】【1|二进制取反(1对应低电平)】
	// |USART_CR2_TXINV			//bit17:【0|正常(VDD为空闲)】【1|TX引脚认为VDD为忙,GND为空闲】
	// |USART_CR2_RXINV			//bit16:【0|正常(VDD为空闲)】【1|RX引脚认为VDD为忙,GND为空闲】
	// |USART_CR2_SWAP				//bit15:【0|正常】【1|TX和RX引脚功能调换】
	// |USART_CR2_LINEN			//bit14:LIN总线使能
	// |USART_CR2_STOP_1			//bit[13:12]:【00|1停止位】【01|0.5停止位】
	// |USART_CR2_STOP_0			//停止位选择	【10|2停止位】【11|1.5停止位】
	// |USART_CR2_CLKEN			//bit11:CK引脚使能标志位
	// |USART_CR2_CPOL				//bit10:【0|低值稳定】【1|高值稳定】
	// |USART_CR2_CPHA 			//bit09:【第一个时钟沿发送或接受数据】【第二个时钟沿发送或接受数据】
	// |USART_CR2_LBCL				//bit08:【0|最后一个数据位的时钟脉冲不输出到CK引脚】【1|最后一个数据位的时钟脉冲输出到CK引脚】
	// |USART_CR2_LBDIE			//bit06:LBDF标志位中断使能
	// |USART_CR2_LBDL				//bit05:该位用于在 11 位或 10 位中断检测之间进行选择。【0|10位断点检测】【1|11位断点检测】
	// |USART_CR2_ADDM7			//bit04:【0|4位地址检测】【1|7位地址检测】
	;


	//步骤5 配置DMA
	USART1->CR3 = 0
	// |USART_CR3_WUFIE			//bit22:WUF标志位中断使能(停止模式唤醒)
	// |USART_CR3_WUS_1			//bit[21:20]:【00|当地址相同置位】【01|Reserve】
	// |USART_CR3_WUS_0			//唤醒停止中断标志位选择【WUF在起始位置位】【WUF在RXNE置位】
	// |USART_CR3_SCARCNT			//bit[19:17]:智能卡自动重复计数
	// |USART_CR3_DEP				//bit15:【0|DE信号高电平有效】【1|DE信号低电平有效】Driver Enable -> DE
	// |USART_CR3_DEM				//bit14:【0|DE信号禁止】【1|DE信号使能】
	// |USART_CR3_DDRE				//bit13:接收错误时禁止DMA【0|接收错误后仅置位标志位,不禁止DMA】【1|接收错误后禁止DMA】
	// |USART_CR3_OVRDIS			//bit12:【0|溢出后,置位ORE】【1|溢出后不置位ORE】
	// |USART_CR3_ONEBIT			//bit11:【0|3bit采样法】【1|1bit采样法】
	// |USART_CR3_CTSIE			//bit10:CTS中断使能
	// |USART_CR3_CTSE				//bit09:CTS使能
	// |USART_CR3_RTSE				//bit08:RTS使能
	// |USART_CR3_DMAT				//bit07:DMA使能发送
	// |USART_CR3_DMAR				//bit06:DMA使能接收
	// |USART_CR3_SCEN				//bit05:智能卡模式使能【1|使能】
	// |USART_CR3_NACK				//bit04:【0|就校验错误NACK不传输】【1|奇偶校验错误NACK传输】
	// |USART_CR3_HDSEL			//bit03:单线半双工模式选择【1|半双工模式】
	// |USART_CR3_IRLP				//bit02:【1|IrDA低功耗模式】
	// |USART_CR3_IREN				//bit01:【1|IrDA模式使能】
	// |USART_CR3_EIE				//bit00:错误中断使能标志位
	;

	//步骤6 置位CR1寄存器的RE标志位,RX开始寻找起始帧。
	USART1->CR1 |= USART_CR1_RXNEIE | USART_CR1_RE;

	//步骤4 通过置位CR1的UE标志位使能USART模块
	USART1->CR1 |= USART_CR1_UE;
	USART1->GTPR = 0x0000
	// |(0 << 8)					//bit[15:8]:Guard Time 守护时间	GT[7:0]
	// |0x00						//bit[7:0]:分频值(page946)		PSC[7:0]
	;

	USART1->RTOR = 0x00000000
	// |(0 << 24)					//bit[31:24]:块长度
	// |0x000000					//bit[23:0]:接收超时值
	;

	USART1->RQR = (USART1->RQR & 0xffffffe0)
	// |USART_RQR_TXFRQ			//bit04:发送数据刷新请求,置位TXE
	// |USART_RQR_RXFRQ			//bit03:接收数据刷新请求,清除RXNE
	// |USART_RQR_MMRQ				//bit02:静音模式刷新请求,置位RWU,同时USART进入静音模式
	// |USART_RQR_SBKRQ			//bit01:截止请求,置位SBKF
	// |USART_RQR_ABRRQ			//bit00:自动模特率请求,置位ABRF标志位
	;

	// USART1->ISR = 
	// USART_ISR_REACK				//bit22:接收标志
	// |USART_ISR_TEACK			//bit21:发送标志
	// |USART_ISR_WUF				//bit20:停止模式唤醒标志
	// |USART_ISR_RWU				//bit19:静音模式唤醒标志
	// |USART_ISR_SBKF				//bit18:发送截止标志
	// |USART_ISR_CMF				//bit17:ADD字符匹配标志
	// |USART_ISR_BUSY				//bit16:忙标志
	// |USART_ISR_ABRF				//bit15:自动波特率错误标志
	// |USART_ISR_ABRE				//bit14:自动波特率状态错误标志你,,,,

	// |USART_ISR_EOBF				//bit12:块结束标志
	// |USART_ISR_RTOF				//bit11:接收超时标志
	// |USART_ISR_CTS				//bit10:CTS标志
	// |USART_ISR_CTSIF			//bit09:CTS中断标志
	// |USART_ISR_LBD				//bit08:LIN截止侦查标志
	// |USART_ISR_TXE				//bit07:发送数据寄存器空标志
	// |USART_ISR_TC				//bit06:发送完成标志
	// |USART_ISR_RXNE				//bit05:读数据寄存器不空标志
	// |USART_ISR_IDLE				//bit04:总线空标志
	// |USART_ISR_ORE				//bit03:溢出标志
	// |USART_ISR_NE				//bit02:起始位检测标志
	// |USART_ISR_FE				//bit01:帧错误标志
	// |USART_ISR_PE				//bit00:校验错误标志

	USART1->ICR = (USART1->ICR & 0xffede4a0)
	// |USART_ICR_WUCF					//bit20:写1清除标志位
	// |USART_ICR_CMCF					//bit17:写1清除标志位
	// |USART_ICR_EOBCF				//bit12:写1清除标志位
	// |USART_ICR_RTOCF				//bit11:写1清除标志位
	// |USART_ICR_CTSCF				//bit09:写1清除标志位
	// |USART_ICR_LBDCF				//bit08:写1清除标志位
	// |USART_ICR_TCCF					//bit06:写1清除标志位
	// |USART_ICR_ORECF				//bit04:写1清除标志位
	// |USART_ICR_IDLECF				//bit03:写1清除标志位
	// |USART_ICR_NCF					//bit02:写1清除标志位
	// |USART_ICR_FECF					//bit01:写1清除标志位
	// |USART_ICR_PECF					//bit00:写1清除标志位
	;

	// USART1->RDR
	// USART1->TDR

}
  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章           查看所有文章
加:2021-07-04 19:59:12  更:2021-07-04 20:00:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/3 12:23:43-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码