完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
1、串口通信过程 其中STM32的通信管脚(TXD和RXD)->CH340->CH340的D+和D-管脚->转USB(MiniA/B)->电脑 2、串口的通信方式分为并行通信和串行通信。
4、串口的基本概念
波特率,又叫做比特率,每秒钟传输的位数。常用的波特率:9600bit/s,115200bit/s. 4.3、串口控制器框图
输入时:复用功能+上下拉
输入时:复用功能+上下拉 4.4、复用功能 打开stm32F407ZGT6的数据手册 PA9的复用功能7:串口1的TX功能 PA10的复用功能7:串口1的RX功能 4.5、相关寄存器
举例: PA9的选择为复用功能7,即AF7,对应的代码如下:GPIOA->AFRH |= 7<<4 ; PA10的选择为复用功能7,即AF7,对应的代码如下:GPIOA->AFRH |= 7<<8; 注意:STM32底层没有AFRH和AFRL寄存器,底层是封装成一个数组AFR[2],ARF[0]代表AFRL寄存器,AFR[1]代码AFRH寄存器,所以上面的代码应该写成:GPIOA->AFR[1] |= 7<<4 ; GPIOA->AFR[1] |= 7<<8 ; 控制寄存器1(USART_CR1) 其中: 我的总结:16倍过采样,出错率更低。可通过编程 USART_CR1 寄存器中的 OVER8 位来选择采样方法,且采样时钟可以是波特率 时钟的 16 倍或 8 倍 根据应用: ● 选择 8 倍过采样 (OVER8=1) 以获得更高的速度(高达 fPCLK/8)。这种情况下接收器对时钟偏差的最大容差将会降低 ● 选择 16 倍过采样 (OVER8=0) 以增加接收器对时钟偏差的容差。这种情况下,最大速度限制为最高 fPCLK/16 配置好串口的所有功能,在使能串口前,必须使能串口。 举例:使能串口1 USART1->CR1 |= 1<<13; 设置数据帧 举例:将串口1的数据帧设置为“1 起始位, 8 数据位, n 停止位 ” USART1->CR1 &=~(1<<12)。 奇偶校验使能。 举例:禁止串口1的奇偶校验 USART1->CR1 &=~(1<<10); 就校验选择位 举例:串口1的校验方法选择位偶校验 USART1->CR1 &=~(1<<9); 串口是全双工,内部有发送 器和接收器,发送器的使能是通过该位 来进行设置的 举例:使能串口1的发送器USART1->CR1 |= 1<<3; 串口是全双工,内部有发送器和接收器,接收器的使能是通过该位来进行设置的 举例:使能串口1的接收器 USART1->CR1 |= 1<<2; 数据寄存器(USART_DR) 因为数据寄存器包含两个寄存器,一个用于发送 (TDR),一个用于接收 (RDR),因此它具有双重功能(读和写)。 举例: ①串口1发送一个字节0x5A USART1->DR = 0x5A; ②串口1接收一个字节数据 u8 data;Data = USART1->DR; 控制寄存器 2 (USART_CR2) 状态寄存器 (USART_SR) 位 7 TXE:发送数据寄存器为空 (Transmit data register empty) 0:数据未传输到移位寄存器 1:数据传输到移位寄存器 (并不意味着发送完成) 位 6 TC:发送完成 (Transmission complete) 0:传送未完成 1:传送已完成 硬件置1 软件清零,清零方法: ①先读取 USART_SR 寄存器,然后写入USART_DR 寄存器,可以清零 ②也可以通过向该位写入‘0’来清零。 用法如下: 判断TC为1则串口接收到一个字节的数据 ①串口1发送一个字节0x5A USART1->DR = 0x5A; While(!(USART1->SR&(1<<6))); //SR寄存器的位6为1则表明成功发送一个字节数据,跳出循环 USART1->SR &=~(1<<6); //清零 位 5 RXNE:接收数据寄存器不为空 (Read data register not empty) 0:未接收到数据 1:已收到的数据 该 位 由 硬 件 置 1 软件清零,清零方法: ①通过对 USART_DR 寄存器执行读取操作将该位清零。 ② RXNE 标志也可以通过向该位写入零来清零。 用法如下: 判断RXNE为1则表明数据接收成功 串口1接收一个字节数据 u8 data; While(!(USART1->SR&(1<<5))); data = USART1->DR; RCC APB2 外设时钟使能寄存器 (RCC_APB2ENR) 位4 置1使能串口1的84MHZ时钟 波特率寄存器 (USART_BRR) 位 15:4 DIV_Mantissa[11:0]: USARTDIV 的整数 这 12 个位用于定义 USART 除数 (USARTDIV) 的尾数 位 3:0 DIV_Fraction[3:0]: USARTDIV 的小数 这 4 个位用于定义 USART 除数 (USARTDIV) 的小数。 当 OVER8 = 1 时,不考虑 DIV_Fraction3位,且必须将该位保持清零 举例:设置串口1波特率115200的 Tx/Rx 波特率 = fCK/(8*(2- OVER8 )* USARTDIV) USARTDIV = fCK/8*(2- OVER8 )/TxRx 波特率 假如OVER8为1 115200 = fCK/(8* USARTDIV) USARTDIV = fCK/115200/8 USARTDIV = 84000000/115200/8 等于91.1458 91写入USART1->BRR寄存器的位 15:4 DIV_Mantissa[11:0] 小数0.1458需要乘以16,强制转换为整数后,写入位 位 3:0 DIV_Fraction[3:0] 其中fcK=84MKZ是已知值 5·软件设计 其中PA9->RXD,PA10->TXD 软件设计步骤:
#include "stm32f4xx.h" void usart1_Init() { u16 integer ; u16 fraction; float USARTDIV; u32 baudRate = 115200; RCC->AHB1ENR |= 1<<0;//使能GPIOA的时钟 RCC_AHB1ENR GPIOA->MODER &= ~(3<<18);//清零 GPIOA->MODER |= 2<<18;//设置PA9为复用功能模式MODER GPIOA->MODER &= ~(3<<20);//清零 GPIOA->MODER |= 2<<20;//设置PA10为复用功能模式MODER GPIOA->AFR[1]&= ~(0XF<<4);//清零 GPIOA->AFR[1]|= (7<<4);//设置PA9的复用功能为第7复用功能 RXD, AFRH GPIOA->AFR[1]&= ~(0XF<<8);//清零 GPIOA->AFR[1]|= (7<<8);//设置PA10的复用功能为第7复用功能 TXD, AFRH RCC->APB2ENR |= 1<<4;//使能串口1模块时钟 RCC_APB2ENR USART1->CR1 |= 1<<15;//设置串口OVER8为1 USART1->CR1 &= ~(1<<12);//设置串口数据位长度 :1 起始位, 8 数据位 USART1->CR2 &=~(3<<12);//设置串口停止位长度 :1 个停止位 USART1->CR1 &= ~(1<<10);//无校验 USART1->CR1 |= 1<<3;//发送使能 USART1->CR1 |= 1<<2;//接收使能 USARTDIV = 84000000/8/baudRate;//串口波特率设置:USARTDIV = fCK/(8*(2-OVER8) /波特率 integer = (u16)USARTDIV; fraction = ((u16)(USARTDIV-integer))<<4; USART1->BRR |= integer<<4 | fraction; USART1->CR1 |= 1<<13;//使能串口 } int main(void) { u8 res; usart1_Init(); while(1) { if(USART1->SR&(1<<5))//接收到数据 { res=USART1->DR; if(res == 0x0D || res == 0x0A) continue; USART1->DR = res+1;//将接受的+1返回 while(!(USART1->SR&(1<<6))); //SR寄存器的位6为1则表明成功发送一个字节数据,跳出循环 USART1->SR &=~(1<<6); //清零 } } } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1122 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1148 浏览 1 评论
580 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
435 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1038 浏览 2 评论
1623浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
285浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
295浏览 3评论
281浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
260浏览 3评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-21 20:25 , Processed in 0.578796 second(s), Total 75, Slave 59 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号