串口:串口就是STM32与外部通信的桥梁!是一种简单、常用的通信方式。串口是STM32内部的一个外设!
串口理论知识
一、串口的组成
1)串口的IO : TXD-->数据的发送 RXD -->数据的接收 GND -->共地
接线方式:
串口属于串行通信方式 。低位先发!!
全双工:可以同时实现数据的发送和接收!
半双工:同一时间只能接收或者发送数据!
单工: 只能发送数据,只能接收数据!
2) 发送器 : 用于数据的发送。
启动发送器 : CR1 的 TE位必须置1
3) 接收器:用于数据的接收。
4) 波特率发生器:用于决定通信的速度。
二、USART 字符说明 (数据帧)
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) 波特率的生成
公式:
OVER8=0时
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)
只用低16位。
4-15 位用于存放USARTDIV的整数部分
0-3 位用于存放 USARTDIV的小数部分。(OVER8=0)
假设用的是9600,那么就要把546.875写到USART_BRR寄存器中?
也就是 546 怎么写到 4-15位?(0.875 * 16= ) 写到0-3位????
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;
}