关于STM32的USART串口通信——异步全双工(1)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

作为一个嵌入式初学者,初来驾到,记录一些自己学习的粗浅理解,供自身知识回顾,也希望能供各位参考一二,若有错误还望各位谅解。
个人精力有限,且理解还粗浅,故分段讲解。

一、通信接口USART/UART介绍

STM32F10X芯片,包含3个USART(USART1、USART2、USART3)和2个UART(UART4、UART5)。
其中USART是通用同步/异步收发器,而UART是通用异步收发器。
在以下运用中,只介绍USART作为异步全双工串口通信使用,即UART模式,在此以USART1具体。

二、UART异步通信方式引脚连接

在这里插入图片描述
-RXD:数据输入引脚。数据接受。USART1的RXD引脚为PA10。
-TXD:数据发送引脚。数据发送。USART1的TXD引脚为PA9。

三、串口异步通信传输数据帧所需参数

根据函数USART_Init,可知传输的数据帧所需参数
1.起始位。(无需设置)
2.数据位:8位或9位。
3.奇偶校验位:奇偶校验一旦使能,在发送数据的 MSB 位插入经计算的奇偶位(字长 9 位时的第 9 位,字长 8 位)。
4.停止位:在帧结尾传输0.5或1或1.5或2个停止位
5.串口波特率:传输速率
6.收发模式:指定了使能或者失能发送和接收模式
7.硬件流控制:此处还未深入理解,故采用硬件流控制失能(USART_HardwareFlowControl_None)

四、USART串口通信底层寄存器控制流程

现在我们看下USART串口通信到底是如何运转的。(个人拙见)
在这里插入图片描述

1.对于数据输入:数据从RX接口进入,到接收移位寄存器,一位一位移位寄存后,写入接收数据寄存器(RDR),内核通过读操作进行读取接收数据寄存器(数据缓冲器)中数据。
2.对于数据输出:内核通过写操作写入发送数据寄存器(TDR),将数据一次性发送给发送移位寄存器,由发送移位寄存器一位一位从TX接口输出。
3.接收器控制和发送器控制分别通过接收器时钟和发送器时钟,来控制接收移位寄存器和发送移位寄存器。接收器时钟和发送器时钟同源,故接收器控制和发送器控制共用波特率发送器。(其中接收器控制还对中断控制USART进行控制)
4.由于APB2外设采用的是PCLK2时钟,而APB1外设采用的是PCLK1时钟。
在这里插入图片描述
由图可知USART1是挂在APB2上的,故PCLK2。
fPCLK2/USARTDIV(USARTDIV由USART_BRR进行配置),然后再/16,从而产生发送器时钟和接收器时钟,即产生波特率。
5.USART_SR寄存器为状态寄存器:是很多标志位,CR1寄存器为控制寄存器:包含很多使能位,其中也包含中断使能。

后续“USART串口通信——异步全双工”部分在下一节进行讲解。

  • 22
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
STM32F103ZDET6是一款基于ARM Cortex-M3内核的微控制器,它具有多个串口接口可以实现全双工通信。 该芯片的串口通信模块被称为USART(Universal Synchronous/Asynchronous Receiver/Transmitter),它可以配置为全双工模式。USART可以同时接收和发送数据,支持同步和异步通信,并具有硬件流控制功能。 要实现串口全双工通信,首先需要配置STM32F103ZDET6的USART模块。以下是一个简单的示例代码,演示如何配置和使用USART1作为全双工串口: ```c #include "stm32f10x.h" void USART1_Init(void) { // 使能USART1时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); USART_InitTypeDef USART_InitStructure; // 配置USART1参数 USART_InitStructure.USART_BaudRate = 115200; // 波特率 USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 数据位长度 USART_InitStructure.USART_StopBits = USART_StopBits_1; // 停止位 USART_InitStructure.USART_Parity = USART_Parity_No; // 校验位 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; // 接收和发送模式 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // 硬件流控制 // 初始化USART1 USART_Init(USART1, &USART_InitStructure); // 使能USART1 USART_Cmd(USART1, ENABLE); } int main(void) { // 初始化USART1 USART1_Init(); while(1) { // 发送数据 USART_SendData(USART1, 'A'); // 等待发送完成 while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); // 接收数据 uint16_t receivedData = USART_ReceiveData(USART1); } } ``` 以上代码通过配置USART1为全双工模式,并实现了发送和接收数据的功能。你可以根据需要修改波特率、数据位长度等参数。注意,该代码只是演示了基本的配置和使用方法,实际应用中可能需要根据具体需求进行进一步的配置和处理。 希望以上信息对你有帮助!如果你有任何其他问题,请随时提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值