发新帖我要提问
12
返回列表
打印
[方案相关]

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

[复制链接]
楼主: 和下土
手机看帖
扫描二维码
随时随地手机跟帖
21
和下土|  楼主 | 2022-6-28 17:03 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
M0P_SYSCTRL->RCH_CR_f.TRIM = (*((volatile uint16_t*) (0x00100C00ul)));

使用特权

评论回复
22
和下土|  楼主 | 2022-6-28 17:20 | 只看该作者
验证
串口部分确认配置为115200-8-N-1
//串口模块配置
void App_UartCfg(void)
{
    stc_uart_cfg_t  stcCfg;
    stc_uart_baud_t stcBaud;

    DDL_ZERO_STRUCT(stcCfg);
    DDL_ZERO_STRUCT(stcBaud);

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

    ///<UART中断使能
    Uart_ClrStatus(M0P_UART0,UartRC);    //清接收请求
    Uart_ClrStatus(M0P_UART0,UartTC);    //清发送请求
    Uart_EnableIrq(M0P_UART0,UartRxIrq); //使能串口接收中断
    //Uart_EnableIrq(M0P_UART0,UartTxIrq); //使能串口发送中断
    //EnableNvic(UART0_IRQn, IrqLevel3, TRUE);              ///<系统中断使能
}

使用特权

评论回复
23
和下土|  楼主 | 2022-6-28 17:20 | 只看该作者
再次抓取波形,123轻松识别,脉宽8.65us,误差不到0.35%,验证ok

使用特权

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

使用特权

评论回复
25
和下土|  楼主 | 2022-6-28 17:23 | 只看该作者
总结
HC32L13x 串口例程PCLK给的是4MHz,默认串口波特率也是9600,要正常使用115200bps通信,需调高PCLK的值。

也许这就是低功耗MCU吧,时钟跑这么低,PLL也不用。

使用特权

评论回复
26
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

使用特权

评论回复
27
wubangmi| | 2022-7-1 12:58 | 只看该作者
直接加载24M频率,真是大胆啊,玩玩可以,批量的时候有你找不到问题出在哪里的。

使用特权

评论回复
评论
godlovedeath 2022-7-2 09:51 回复TA
为什么啊 
28
godlovedeath| | 2022-7-2 09:50 | 只看该作者
关注,这个在4M的时候不能配置波特率生成器寄存器吗,可以降低误差

使用特权

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

本版积分规则