STM32学习笔记---USART篇

目录

一、什么是串口

1、介绍        

2、USART的通信方式

3、USART的数据帧格式

4、USART通信原理图

5、串口通信的四要素

6、USART和UART的区别

二、如何配置串口

1、串口控制器框图

1.1 数据传输框图部分

①发送部分框图

②接收部分框图

1.2 波特率部分框图

1.3 通信协议控制部分

2、串口寄存器描述

2.1 状态寄存器 (USART_SR)

2.2 数据寄存器 (USART_DR)

2.3 波特率寄存器 (USART_BRR)

2.4 控制寄存器 1 (USART_CR1)

2.5 控制寄存器 2 (USART_CR2)

3、程序设计思路

①总体思路

②详细思路

三、具体使用串口

需求1:MCU与PC之间互相进行通信

需求2:PC发送字符控制LED

需求3:PC端上位机显示按键键值

需求4:  串口发送一个字符串,封装成函数

需求5:  串口接收一个字符串,封装成函数

需求6:PC控制开发板的灯、流水灯

需求7:板A按键控制板B的LED灯

四、补充内容

1、printf重定向函数

1.1 printf函数添加方法

1.2 怎么用

1.3 什么时候用

1.4 有什么用

1.5 说明

2、复用与重映射

2.1 复用与重映射的区别

2.2 复用功能怎么配置

3、STM32F103与GD32F407串口的配置


一、什么是串口

1、介绍        

                USART:(Universal Synchronous/Asynchronous Receiver/Transmitter)  通用同步/异步串行接收/发送器

                UART:(Universal Asynchronous Receiver/Transmitter)  通用异步串行接收/发送器

                串口是设备双方互相进行数据传输的一种通信协议,是众多通信协议中的其中一种,并且是使用频率比较高的一种通讯协议;串口中最重要的是两个设备间需要设置同一个波特率,否则无法进行同步,从而导致数据传输失败;串口通信通过转换芯片可以转换成 USB通信/232通信/485通信.

2、USART的通信方式

        异步串行全双工,并且串口通信只能一个设备对应另一个设备(一主一从),不能一对多

3、USART的数据帧格式

        数据帧格式:起始位(1位)+数据位(8位)+校验位(1位)+停止位(0.5位/1位/1.5位/2位)

        或数据帧格式(不用校验位):起始位(1位)+数据位(8位)+停止位(0.5位/1位/1.5位/2位)

        串口数据帧最多包含12个位

4、USART通信原理图

5、串口通信的四要素

        波特率+数据位+检验位+停止位

6、USART和UART的区别

        USART可以在同步或者异步通信状态下使用;而UART仅可以在异步通信状态下使用。

故当在异步通信的情况下,可以用USART.

二、如何配置串口

1、串口控制器框图

1.1 数据传输框图部分

①发送部分框图

发送数据中遇到的问题:

发送数据过程:内核写入数据到TDR,TDR并行自动载入到发送移位寄存器,发送移位寄存器再串行发送出去。

封装串口发送一字节函数思路:

void 串口发送一字节函数(要发送的数据)

{

   //等待之前发送的数据发送完成(等待状态寄存器的发送完成位(TC)置1)

    ①该位由软件序列清零(读取 USART_SR 寄存器,然后写入USART_DR 寄存器)

    ②TC 位也可以通过向该位写入‘0’来清零

   //将数据写入到发送TDR

}

②接收部分框图

接收数据中遇到的问题:

数据接收过程:数据串行接收到接收移位寄存器,接收移位寄存器再并行自动载入到RDR,最后内核读取RDR。

封装串口接受一字节函数思路:

返回值类型 串口接受一字节函数(void)

{

//等待之前接收的数据接收完成(等待状态寄存器的接收完成位(RXNE)置1)

①通过对 USART_DR 寄存器执行读入操作将该位清零。

 RXNE 标志也可以通过向该位写入零来清零。

//读取RDR并写入变量中

//返回变量

}

1.2 波特率部分框图

红色框:整数    紫色框:小数

fCK : 串口所挂载在总线上的时钟频率

USARTDIV= fCK/(8*(2-OVER8))/bps

波特率写入值的计算:需要将通过波特率计算出来的结果写入USART_BRR寄存器

方法1:

整数部分:

DIV_M=(强转取整数)USARTDIV

小数部分:

小数计算方法

化简后得:DIV_F= (强转取整数)(USARTDIV - DIV_M)*8*(2-OVER8)

波特率写入的值=DIV_M+DIV_F

示例代码:

方法2:

注意:此时得到的值带有小数部分,要想写入寄存器(寄存器只能存整数),二进制要整体左移四位,故十进制要扩大16倍

变形得到:USARTDIV= (fCK/(8*(2-OVER8))/bps)*16

波特率写入的值 = fCK / 波特率         //注意此时是16倍过采样

波特率写入的值 = fCK / 波特率 * 2;     //注意此时是8倍过采样

示例代码:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值