[方案相关] 华大HC32L13x 串口波特率设置为115200打印乱码问题

[复制链接]
1953|28
 楼主| 和下土 发表于 2022-6-28 17:03 | 显示全部楼层
  1. M0P_SYSCTRL->RCH_CR_f.TRIM = (*((volatile uint16_t*) (0x00100C00ul)));
 楼主| 和下土 发表于 2022-6-28 17:20 | 显示全部楼层
验证
串口部分确认配置为115200-8-N-1
  1. //串口模块配置
  2. void App_UartCfg(void)
  3. {
  4.     stc_uart_cfg_t  stcCfg;
  5.     stc_uart_baud_t stcBaud;

  6.     DDL_ZERO_STRUCT(stcCfg);
  7.     DDL_ZERO_STRUCT(stcBaud);

  8.     Sysctrl_SetPeripheralGate(SysctrlPeripheralUart0,TRUE); ///<使能UART0外设时钟门控开关
  9.     ///<UART Init
  10.     stcCfg.enRunMode        = UartMskMode1;                 ///<模式1
  11.     stcCfg.enStopBit        = UartMsk1bit;                  ///<1bit停止位
  12.     stcCfg.enMmdorCk =      UartMskDataOrAddr;                     //无校验
  13.     stcCfg.stcBaud.u32Baud  = 115200;                         ///<波特率115200
  14.     stcCfg.stcBaud.enClkDiv = UartMsk8Or16Div;              ///<通道采样分频配置
  15.     stcCfg.stcBaud.u32Pclk  = Sysctrl_GetPClkFreq();        ///</<获得外设时钟(PCLK)频率值
  16.     Uart_Init(M0P_UART0, &stcCfg);                          ///<串口初始化

  17.     ///<UART中断使能
  18.     Uart_ClrStatus(M0P_UART0,UartRC);    //清接收请求
  19.     Uart_ClrStatus(M0P_UART0,UartTC);    //清发送请求
  20.     Uart_EnableIrq(M0P_UART0,UartRxIrq); //使能串口接收中断
  21.     //Uart_EnableIrq(M0P_UART0,UartTxIrq); //使能串口发送中断
  22.     //EnableNvic(UART0_IRQn, IrqLevel3, TRUE);              ///<系统中断使能
  23. }
 楼主| 和下土 发表于 2022-6-28 17:20 | 显示全部楼层
再次抓取波形,123轻松识别,脉宽8.65us,误差不到0.35%,验证ok
 楼主| 和下土 发表于 2022-6-28 17:21 | 显示全部楼层
 楼主| 和下土 发表于 2022-6-28 17:23 | 显示全部楼层
总结
HC32L13x 串口例程PCLK给的是4MHz,默认串口波特率也是9600,要正常使用115200bps通信,需调高PCLK的值。

也许这就是低功耗MCU吧,时钟跑这么低,PLL也不用。
HC11425 发表于 2022-6-28 17:26 | 显示全部楼层

void Sys_Clk(void)
{
    stc_gpio_config_t        stcGpioCfg;
    stc_sysctrl_clk_config_t stcCfg;
    stc_sysctrl_pll_config_t stcPLLCfg;
   
    DDL_ZERO_STRUCT(stcCfg);
    DDL_ZERO_STRUCT(stcPLLCfg);
   
    Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);
    ///< 开启FLASH外设时钟
    Sysctrl_SetPeripheralGate(SysctrlPeripheralFlash, TRUE);
   
    ///< 因将要倍频的PLL作为系统时钟HCLK会达到48MHz:所以此处预先设置FLASH 读等待周期为1 cycle(默认值为0 cycle)
    Flash_WaitCycle(FlashWaitCycle2);   

    ///< 时钟初始化前,优先设置要使用的时钟源:此处配置PLL
    Sysctrl_SetRCHTrim(SysctrlRchFreq4MHz);             //PLL使用RCH作为时钟源,因此需要先设置RCH   
   
    stcPLLCfg.enInFreq    = SysctrlPllInFreq4_6MHz;     //RCH 4MHz
    stcPLLCfg.enOutFreq   = SysctrlPllOutFreq36_48MHz;  //PLL 输出48MHz
    stcPLLCfg.enPllClkSrc = SysctrlPllRch;              //输入时钟源选择RCH
    stcPLLCfg.enPllMul    = SysctrlPllMul12;            //4MHz x 12 = 48MHz
    Sysctrl_SetPLLFreq(&stcPLLCfg);     

    stcCfg.enClkSrc  = SysctrlClkPLL;
    stcCfg.enHClkDiv = SysctrlHclkDiv1;
    stcCfg.enPClkDiv = SysctrlPclkDiv1;
    ///< 系统时钟初始化
    Sysctrl_ClkInit(&stcCfg);
}
115200波特率理论上,系统时钟需要比115200速率要大,比如16M,24M,32M,48M等等。我这个配置是内部4M倍频到48M。可以直接使用。若不需要校验,请使用MODE1模式。 小华半导体代理:13168079092
wubangmi 发表于 2022-7-1 12:58 | 显示全部楼层
直接加载24M频率,真是大胆啊,玩玩可以,批量的时候有你找不到问题出在哪里的。

评论

为什么啊  发表于 2022-7-2 09:51
godlovedeath 发表于 2022-7-2 09:50 | 显示全部楼层
关注,这个在4M的时候不能配置波特率生成器寄存器吗,可以降低误差
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部
0