目录
一、UART和USART
1、UART
工作方式
UART是一种通用的串行通信协议,采用异步通信方式,即不需要时钟信号来同步数据传输。它使用起始位、数据位、校验位和停止位来组织和解析数据。
数据传输
在UART通信中,数据位是指每个数据字节中实际传输的位数。通常,UART支持7位或8位数据位的传输。起始位用于指示数据传输的开始,而停止位则指示数据传输的结束。校验位可以用于检测传输过程中的错误。
2、USART
工作方式
USART是一种通用的串行通信协议,它结合了UART和同步通信的功能。与UART不同,USART可以通过外部时钟信号进行同步通信,也可以使用内部时钟进行异步通信。
数据传输
USART支持多种传输模式,包括异步、同步、全双工和半双工模式。它可以发送和接收数据,并且可以实现更高的通信速率和更可靠的数据传输。
3、比较
UART 在简单性和成本方面有一些优势,适用于一些基本的串行通信需求;而 USART 则在通信速率、数据传输可靠性和通信模式等方面具有更多的功能和灵活性,适用于更复杂和要求更高的串行通信应用。
二、printf函数实现
在 STM32 微控制器中使用 printf 函数通常需要结合串口通信模块(如 USART 或 UART)来实现。
为了让 printf 函数将数据输出到串口通信模块,需要重定向 printf 函数。比如GNUC编译器,就要将 printf 函数重定向,通常使用__io_putchar(int ch)函数来实现这一功能,这个函数会被 printf 自动调用来输出数据。
重定向之后,还需要链接相应的库函数来实现底层的串口输出。这通常是通过 STM32 提供的库(比如 STM32Cube HAL 库)来完成的,其中包含了底层的串口驱动函数。这些函数负责将数据发送到正确的串口,并且处理发送过程中可能的错误或者中断。
三、串口调试
1、配置
2、代码
3、调试
烧录过程在前面文章整理过,这里我就省略了。需要该串口工具的同学可以私聊我。
4、浮点数输出
当我想要输出浮点数时,编译器会报错,这是为什么呢?由于单片机的硬件资源限制(内存太小),所以STM32单片机里C语言标准库的printf()函数并不支持浮点数的输出。但是我们的代码可能需要用到浮点数,那如何解决呢?请看下图:
添加-u_printf_float,重新烧录并调试。