打印
[方案相关]

华大HC32L13x 串口波特率设置为115200打印乱码问题

[复制链接]
1024|28
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
问题描述
华大低功耗MCU HC32L13x在设置串口波特率为115200时,串口打印乱码,而设置9600串口打印ok。官方例程也是9600bps,然而平常串口打印习惯性还是配置为115200-8-N-1(8bit数据位,无校验位,1停止位)

标准的115200bps的最小脉宽应该为8.68us,标准的9600bps的最小脉宽应该为104.17us

使用特权

评论回复
沙发
和下土|  楼主 | 2022-6-28 15:41 | 只看该作者
现象分析
配置115200打印乱码而不是没有打印说明有数据出来,但是不满足要求,软件在串口输出字符“123”,用逻辑分析仪抓取的乱码波形,关键,可以看到最小脉宽是7.99us,远小于8.68us,误差率7.95%

使用特权

评论回复
板凳
和下土|  楼主 | 2022-6-28 15:41 | 只看该作者

使用特权

评论回复
地板
和下土|  楼主 | 2022-6-28 15:43 | 只看该作者
对比9600抓取的可以正常打印的波形,最小脉宽103.83us,误差率不到0.33%

使用特权

评论回复
5
和下土|  楼主 | 2022-6-28 15:45 | 只看该作者

使用特权

评论回复
6
和下土|  楼主 | 2022-6-28 15:49 | 只看该作者
如此对比,发现实测的115200bps和实际配置的差别太远

在HC32L13x用户手册上看到了相关说明,在PCLK=4MHz的条件下说明了各波特率的误差情况(注:PCLK字面意思也就是外设时钟)

使用特权

评论回复
7
和下土|  楼主 | 2022-6-28 15:57 | 只看该作者

使用特权

评论回复
8
和下土|  楼主 | 2022-6-28 15:58 | 只看该作者
另外PCLK=24MHz条件下对各波特率误差就相对友好,居然还有0误差的。

使用特权

评论回复
9
和下土|  楼主 | 2022-6-28 16:00 | 只看该作者

使用特权

评论回复
10
和下土|  楼主 | 2022-6-28 16:06 | 只看该作者
那么问题来了,当前工程配置的PCLK为多少呢,虽然根据表格明显应该是4MHz,查看时钟结构图如下

使用特权

评论回复
11
和下土|  楼主 | 2022-6-28 16:14 | 只看该作者

关注SYSCTRL0寄存器即可,BIT7:5是选择SystemCLK哪个时钟源,BIT10:8选择SystemCLK到HCLK的分频值,BIT12:11选择HCLK到PCLK的分频值


使用特权

评论回复
12
martinhu| | 2022-6-28 16:32 | 只看该作者
和下土 发表于 2022-6-28 16:06
那么问题来了,当前工程配置的PCLK为多少呢,虽然根据表格明显应该是4MHz,查看时钟结构图如下 ...

MCU 上电后默认的时钟是4M,如果要设置其他时钟频率以匹配115200波特率,需要参考Sysctrl样例

使用特权

评论回复
13
和下土|  楼主 | 2022-6-28 16:34 | 只看该作者

使用特权

评论回复
14
和下土|  楼主 | 2022-6-28 16:35 | 只看该作者
进入Keil仿真,查看SYSCTRL寄存器组,其中SYSCTRL0为0x0000 0001 ,解释为选择内部高速时钟,SystemCLK到HCLK不分频,HCLK到PCLK也不分频,也就是PCLK = RCH。

使用特权

评论回复
15
和下土|  楼主 | 2022-6-28 16:36 | 只看该作者

使用特权

评论回复
16
和下土|  楼主 | 2022-6-28 16:46 | 只看该作者
问题是RCH标称为4M-24M,RCH具体为多少呢,事实上RCH最多为24M也就决定了PCLK最多为24M,(也可选择PLL,可以把RCH倍频上去到48MHz,这样PCLK也可以得到48MHz)

使用特权

评论回复
17
和下土|  楼主 | 2022-6-28 16:52 | 只看该作者
调试-改SystemCLK为RCH 24M
查看main入口前的SystemInit函数
void SystemInit(void)
{
    M0P_SYSCTRL->RCL_CR_f.TRIM = (*((volatile uint16_t*) (0x00100C22ul)));
    M0P_SYSCTRL->RCH_CR_f.TRIM = (*((volatile uint16_t*) (0x00100C08ul)));
    SystemCoreClockUpdate();
        _HidePinInit();
}

uint32_t SystemCoreClock = 4000000;


//add clock source.
void SystemCoreClockUpdate (void) // Update SystemCoreClock variable
{
    SystemCoreClock = Sysctrl_GetHClkFreq();
}

使用特权

评论回复
18
和下土|  楼主 | 2022-6-28 17:01 | 只看该作者
结合下图解释选择的正是4M,要改为24M,直接替换地址

使用特权

评论回复
19
和下土|  楼主 | 2022-6-28 17:02 | 只看该作者

使用特权

评论回复
20
和下土|  楼主 | 2022-6-28 17:03 | 只看该作者
改后,跟踪SystemCoreClock的值由4M变为了24M,该值也就是HCLK,也就是PCLK(没有分频)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

102

主题

1061

帖子

0

粉丝