本帖最后由 聪聪哥哥 于 2026-2-2 08:58 编辑
一:串口知识介绍:
通用同步异步收发器(USART)是一个能通过多种不同的配置与使用不同的数据格式的外设进行通信的通用接口,同时支持异步全双工,异步半双工以及同步传输。USART提供了可编程的波特率发生器,根据系统频率以及分频系数的不同,用户可以通过配置系统时钟以及分频系数以此产生所需要的特定通信频率。USART 除了支持标准的 NRZ异步以及同步收发通信协议外,还支持一些常用的其他类型的串行通信协议,如LIN(局域互联网),IrDA(红外数据组织)SIRENDEC规范,ISO7816-3标准的异步智能卡协议,以及 CTS/RTS (Clear To Send/Request To Send) 硬件流操作, RS485 和 Modbus.USART还支持多处理器通信,以及可配置通过空闲帧或地址匹配唤醒的静默模式,以此搭建USART网络,并且同时支持使用DMA进行数据的收发,以此实现高速通信。
二:串口的特征:
可编程配置的全双工或半双工通信
-全双工异步通信
一单线半双工通信
可编程配置的通信模式
-NRZ标准格式(Mark/Space)
-LIN(局域互联网)
一IrDASIR(串行红外)
一ISO7816-3标准里定义的异步智能卡协议: 智能卡模式支持0.5或1.5个停止位-RS-232 CTS/RTS (Clear To Send/Request To Send) 硬件流操作
一通过静默模式实现多处理器通信(具有地址匹配和总线空闲两种可编程配置的唤醒方式)一同步模式
可编程配置的波特率发生器
一 发送和接收共用的可编程波特率
可编程配置的帧格式
一可编程的数据位位数(7位或8位或9位)
一可编程的停止位位数-支持1或2个停止位
一可编程的校验控制:发送方具备发送校验位的能力,接收方具备对接收到的数据进行校验的能力
一可编程配置的数据发送顺序(MSB/LSB)
一可编程配置的Tx/Rx引脚极性
一可编程配置的DT数据极性
可编程配置的DMA多缓冲器通信
可编程配置的独立的发送器和接收器使能位
三:图形化配置如下所示:
3.1 串口的编写流程:
3.1.1 首先串口时钟使能,GPIO时钟使能:
3.1.2 GPIO端口模式设置:
3.1.3 串口参数初始化:
3.1.4 开启中断并且初始化
3.1.5 使能串口:
3.1.6 编写串口发送函数,重映射串口功能
3.2 原理图如下所示:
可以看到开发板与调试器与PA9,PA10进行连接,这里在图形化软件中,配置一下串口的一些参数;
3.3 软件配置:
配置好后,直接生成工具就可以了;
四:软件代码编写:
4.1 重映射的代码如下所示:
- #if defined (__GNUC__) && !defined (__clang__)
- #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
- #else
- #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
- #endif
- /**
- * @brief retargets the c library printf function to the usart.
- * @param none
- * @retval none
- */
- PUTCHAR_PROTOTYPE
- {
- #if !defined (__GNUC__) || defined (__clang__)
- UNUSED(f);
- #endif
- while(usart_flag_get(USART1, USART_TDBE_FLAG) == RESET);
- usart_data_transmit(USART1, (uint16_t)ch);
- while(usart_flag_get(USART1, USART_TDC_FLAG) == RESET);
- return ch;
- }
然后在主函数添加串口的输出测试函数:
- while(1)
- {
- /* add user code begin 3 */
-
- // gpio_bits_toggle(GPIOD,GPIO_PINS_13 | GPIO_PINS_14 | GPIO_PINS_15);
- gpio_bits_toggle(GPIOD,GPIO_PINS_13);
- wk_delay_ms(500);
- printf("AT32F457 printf is ok !!!!\r\n");
- /* add user code end 3 */
- }
五:实物验证如下所示:
六:遇到的问题:
由于这里我只是测试一下串口输出是否正常,这里开启试了 TDBC、TDC的中断功能,但是发现,开启之后,在调用输出函数,软件就会卡死,如下所示:
我看到官方里面的printf,在发送的时候也是判断是否发送完成,这里开启发送完成的标志会有什么问题吗?
03USART_printf.zip
(2.17 MB, 下载次数: 0)
|