STM32入门之串口

串口:串口就是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(...); // 等待 TC1

USART1->DR=dat;

}

四 、数据的接收

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

u8 usart1_res(void)

{

u8 data;

while(...); // 等待 RXEN1

data=USART1->DR ;

return data;

}

五 、波特率发生器

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

a)   16   OVER80 ;可以增加接收器对时钟的容差。

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(...); // 等待 TC1

    USARTx>DR=dat;

}

u8 usartx_res(void)

{

    u8 data;

    while(...); // 等待 RXEN1

    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;

}




猜你喜欢

转载自blog.csdn.net/qq_41174320/article/details/80720288