STM32F103RCT6 串口接收数据不正确

发布于 2020-07-17 16:22:36

在 Linux 环境,根据 stm32f103-mini-system 工程编译出了 rtthread.bin,使用的是芯片内部始终,现在遇到的问题是 finsh 可以打印出来内容,但是串口接收的数据不正确:比如我输入的a,但是提示的是接收到0xa1b提示的是接收到0xa2,调试发现串口 1 的 USART_DR 寄存器的值就是 0xa1 和 0xa2,感觉好奇怪???
还有一个问题,有时候打印的内容会缺少一些字节,串口配置 115200 8n1,默认的串口配置。

查看更多

关注者
0
被浏览
159
3 个回答
JQRR_7669
JQRR_7669 认证专家 2020-07-17

检查时钟配置是否正确,应该是时钟频率不对导致地波特率错误引起的

fhqmcu
fhqmcu 认证专家 2020-07-17

用keil编译一下试试,gcc环境有时能编译出来bin,但是有可能不对。

iysheng
iysheng 2020-07-18

通过让同事帮忙在 Keil 烧录正常的程序,然后对比 RCC 和 uart1 的寄存器值,定位到是 HSI 时钟没有经过校准导致的。
首先描述下,我们双方都用内部的 HSI 时钟,倍频到 64MHz 作为 APB2 的时钟,正常的寄存器:

串口 1 涉及到的寄存器
0x40013800: 000000d0 00000061 0000022c 0000202c 00000000 00000000
RCC 涉及到的寄存器
0x40021000: 03005583 0038c40a 00000000 00000000 00000000 00000015 00004235 00100002
0x40021020: 00000000 0c000000

异常的寄存器:

0x40013800: 000000d0 000000a1 0000022c 0000202c 00000000 00000000
0x40021000: 03004103 0038040a 00000000 00000000 00000000 00000014 0000403d 10000000 000000a1 0000022c 0000202c 00000000 00000000
0x40021020: 00000000 0c000000

通过对比分析,关键在寄存器0x40021000的值不一样。
查看寄存器:
Selection_013.png
手册描述:
Selection_014.png
在 RT-thread 根据 stm32f103-minisystem 默认使用的外部时钟,修改为内部时钟的时候没有校准,校准后测试正常,代码修改:

│ */
│ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
20│ RCC_OscInitStruct.HSIState = RCC_HSI_ON;
│ + RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
│ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
│ RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL16;
│ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友