串口:串口就是STM32与外部通信的桥梁!是一种简单、常用的通信方式。串口是STM32内部的一个外设!

串口理论知识

一、串口的组成

1)串口的IO : TXD-->数据的发送  RXD -->数据的接收 GND -->共地

接线方式:

CUBEMX STM32H753 串口设置 stm32串口在哪_串口

串口属于串行通信方式 。低位先发!!

全双工:可以同时实现数据的发送和接收!

半双工:同一时间只能接收或者发送数据!

单工:  只能发送数据,只能接收数据!

2)  发送器 : 用于数据的发送。

启动发送器 : CR1 的 TE位必须置1

3)  接收器:用于数据的接收。

4)  波特率发生器:用于决定通信的速度。

二、USART 字符说明  (数据帧)

CUBEMX STM32H753 串口设置 stm32串口在哪_数据_02

1+8+1 =10 位.

如果是9600 波特率,通信速度=9600 /10 -> 960 个字节

三 、数据的发送

1)必须判断(等待)发送数据寄存器为空,这时才能发送数据。也就是TXE 这位为1

2)判断 发送完成,SR寄存器的 TC位为1,也说明可以再次发送数据!!!

void usart1_send(chardat)
{
while(...); // 等待 TC为1
USART1->DR=dat;
}

四 、数据的接收

读取数据寄存器不为空 的时候才可以读取数据。SR寄存器的 RXEN =1

u8 usart1_res(void)
{
u8 data;
while(...); // 等待 RXEN为1
data=USART1->DR ;
return data;
}

五 、波特率发生器

1)选择合适的过采样方法

a)   16倍   OVER8=0 ;可以增加接收器对时钟的容差。

b)   8倍     OVER8=1  ; 速度快,但是容差降低。

2) 波特率的生成

公式:

CUBEMX STM32H753 串口设置 stm32串口在哪_数据_03

OVER8=0时

CUBEMX STM32H753 串口设置 stm32串口在哪_寄存器_04

TX/RX : -->波特率的大小 ,如 9600,115200;

fck  : 串口的时钟频率的大小,不同的串口它的时钟频率是不一样。以串口1为例说明.

 

USART1 和USART6 -->   fck  = 84M(M4)
USART2-USART5   ->   fck  = 42M(M4)
 
USART1                 -->  fck  = 72M(M3)
USART2 USART3   -->    fck = 36M(M3)

 

USARTDIV : 写进波特率寄存器的值。

9600    ->              USARTDIV =546.875
115200 ->              USARTDIV = 45.573 (约等于)

 

波特率寄存器 (USART_BRR)

CUBEMX STM32H753 串口设置 stm32串口在哪_串口_05

只用低16位。

 4-15 位用于存放USARTDIV的整数部分

 0-3   位用于存放 USARTDIV的小数部分。(OVER8=0)

假设用的是9600,那么就要把546.875写到USART_BRR寄存器中?

也就是 546 怎么写到 4-15位?(0.875 * 16= ) 写到0-3位????

CUBEMX STM32H753 串口设置 stm32串口在哪_串口_06

USART->BRR=546<<4| 14  ;
USART->BRR=546*16+14  ;


串口配置

一、初始化步骤

1)       引脚初始化

2)       开串口时钟

3)       配置模式 (全双工模式)

4)       配置数据帧 (一个起始位,8个数据位)

5)       配置校验  (不使用校验)和数据流

6)       配置波特率

7)       使能。

二、数据的发送和接收函数

void usartx_send(chardat)
{
    while(...); // 等待 TC为1
    USARTx>DR=dat;
}
u8 usartx_res(void)
{
    u8 data;
    while(...); // 等待 RXEN为1
    data=USARTx->DR ;
    return data;
}

三、printf函数

1) 修改fputc函数

//重定义fputc函数
int fputc(int ch,FILE *f)
{
         while(!(USART1->SR& 1<<6));
         USART1->DR =ch; 
    return ch;
}

2)Printf使用环境

法1. Target——Code Generation——选中Use MicroLIB

 

法2.//加入以下代码,支持printf函数,而不需要选择use MicroLIB    

#if 1
#pragmaimport(__use_no_semihosting)             
//标准库需要的支持函数                 
struct __FILE 
{ 
       int handle; 
 
};
FILE __stdout;       
//定义_sys_exit()以避免使用半主机模式    
_sys_exit(int x) 
{ 
       x = x; 
}