一、关于软件配置
串口9 rt-thread中并不是直接支持,通过usart.c等文件已经实现
char uart_name[RT_NAME_MAX];
struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; /* 初始化配置参数 */
rt_strncpy(uart_name, UART9_UART_NAME, RT_NAME_MAX);
/* step1:查找系统中的串口设备 */
dings_serial = rt_device_find(uart_name);
if (!dings_serial)
{
rt_kprintf("find %s failed!\n", uart_name);
return;
}
/* step2:修改串口配置参数 */
config.baud_rate = BAUD_RATE_115200; //修改波特率为 115200
config.data_bits = DATA_BITS_8; //数据位 8
config.stop_bits = STOP_BITS_1; //停止位 1
config.bufsz = 128; //修改缓冲区 buff size 为 128
config.parity = PARITY_NONE; //无校验位
/* step3:控制串口设备。通过控制接口传入命令控制字,与控制参数 */
rt_device_control(dings_serial, RT_DEVICE_CTRL_CONFIG, &config);
初始化模块,都正常。
二、问题
通过串口打印数据,接收到的数据不正确,打断点看485发送数据又是正确的。
三、逻辑分析仪查看波形
1、抓取UART8(正常的串口) 和 UART9(异常的串口)进行比较,发送的数据都只有一个字节0xAA
波形如下:

通过波形发现,异常串口9 时间间隔不对,所以串口发出数据不对,请问如何排查呢
/ step2:修改串口配置参数 /
config.baud_rate = BAUD_RATE_115200; //修改波特率为 115200
config.data_bits = DATA_BITS_8; //数据位 8
config.stop_bits = STOP_BITS_1; //停止位 1
config.bufsz = 128; //修改缓冲区 buff size 为 128
config.parity = PARITY_NONE; //无校验位
————————————————
版权声明:本文为RT-Thread论坛用户「ForNow」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://club.rt-thread.org/ask/question/cfe246e867902389.html
2个串口波特率初始化,都是这样的,串口8可以,串口9不行
void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/ USER CODE BEGIN UART9_MspInit 0 /
/ USER CODE END UART9_MspInit 0 /
/ UART9 clock enable /
__HAL_RCC_UART9_CLK_ENABLE();
/ USER CODE BEGIN UART9_MspInit 1 /
/ USER CODE END UART9_MspInit 1 /
}
而且串口9,我不用这个初始化的话,不能发送数据,加了这个可以发出数据,就是数据不对。
感觉还是底层波特率配置不对,是不是底层还是有哪里需要配置
直接去看CubeF4 的代碼跟裡面講的文件會快一點在不同情況下它會用不同的PLL當clock
但是文件其實有說UART9 用的是 PCLK2
他的標準代碼應該是有問題的
要自己修改
https://github.com/STMicroelectronics/stm32f4xx_hal_driver/blob/34ef062fce0a101065abc448091615e5a8534ca9/Src/stm32f4xx_hal_usart.c#L2792-L2815
ref.
https://github.com/STMicroelectronics/STM32CubeF4/issues/5
感谢你的回复,结提。
底层驱动9和10参照8添加就可以。
9和10是用PCLK2,更改时钟数 可解决。
@KunYi