六、STM32的UART
1、串行通信的基本概念
1.1、通信的基本概念
1.1.1、通信
最少有两个对象,一个收,一个发
1.1.2、同步通信
一般情况下 同步通信指的是通信双方根据同步信号进行通信的方式。比如通信双方有一个共同的时钟信号,大家根据时钟信号的变化进行通信。相当于两个人参考的一个手表做事情,肯定是同步的 例如 SPI总线,I2C总线等等
1.1.3、异步通信
是指数据传输速度匹配依赖于通信双方有自己独立的系统时钟,大家约定好通信的速度。异步通信不需要同步信号,但是并不是说通信的过程不同步。相当于两个人参考两个不同的手表做事情,只能尽力做到同步,比如UART,USB等等
1.1.4 、串行通信
同一时刻只能收或者发一个bit位的数据。因此只用一根信号线就可以。
1.1.5、异步通信
同一时刻只能收或者发多个bit位的数据。因此要用多根信号线就可以。
1.1.6、单工、半双工、全双工
单工:要么收,要么发,只能做接收设备或者发送设备。比如收音机
半双工:可以收,可以发,但是不能同时收发,比如对讲机
全双工:可以在同一时刻即接收,又发送。比如手机
1.2、USART的介绍
1.2.1 USART基本概念
1.3、串口的电路连接
1.4、串口的通信协议
1.5、串口的通信波特率
2、串口寄存器的介绍
2.1、控制寄存器------USART_CR
2.2、状态寄存器------USART_SR
2.3、数据寄存器------USART_DR
2.4、波特率寄存器------USART_BRR
3、HAL层串口函数库的使用及printf的实现
3.1、 HAL库中串口的收发函数
stm32f4xx_hal_uart.c
/**
* @brief Sends an amount of data in blocking mode.
* @param huart pointer to a UART_HandleTypeDef structure that contains
* the configuration information for the specified UART module.
* @param pData Pointer to data buffer
* @param Size Amount of data to be sent
* @param Timeout Timeout duration
* @retval HAL status
*/
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
/**
* @brief Receives an amount of data in blocking mode.
* @param huart pointer to a UART_HandleTypeDef structure that contains
* the configuration information for the specified UART module.
* @param pData Pointer to data buffer
* @param Size Amount of data to be received
* @param Timeout Timeout duration
* @retval HAL status
*/
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
3.2、 printf重定向
其实printf重定向就是我们将printf重新定向到串口,也就是我们可以自己重写C的库函数,当连接器检查到用户编写了与C库函数相同的名字,优先采用
用户编写的函数这样用户就可以实现对库的修改了。
printf函数实际是一个宏,最终调用的是 fputc(int ch,FILE *f)这个函数,所以我们需要修改这个函数。
3.3、实现方式
4、详细代码实现过程如下