jyrpxj 发表于 2021-5-14 23:56

HC32L136库 LCD驱动/时钟切换驱动 有BUG !

官方下载来的,HC32L136库 的例程
HC32L136_SDK\驱动库及样例\hc32l13x_ddl_Rev1.9.1\example\lcd\lcd_mode\source\main.c

int32_t main(void)
{
    Sysctrl_ClkSourceEnable(SysctrlClkRCL,TRUE);            ///< 使能RCL时钟   //BUG:运行完此句后,hclk_prs变成了5,即32分频了
    Sysctrl_SetRCLTrim(SysctrlRclFreq32768);                ///< 配置内部低速时钟频率为32.768kHz

    Sysctrl_SetPeripheralGate(SysctrlPeripheralLcd,TRUE);   ///< 开启LCD时钟
    Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE);///< 开启GPIO时钟
   
    App_PortCfg();               ///< LCD端口配置
    App_LcdCfg();                ///< LCD模块配置

    Lcd_ClearDisp();             ///< 清屏
    Lcd_WriteRam(0,0x0f0f0f0f);///< 赋值寄存器LCDRAM0
    Lcd_WriteRam(1,0x0f0f0f0f);///< 赋值寄存器LCDRAM1

    while(1)
    {
      ;
    }
}

再定位到库 HC32L136_SDK\驱动库及样例\hc32l13x_ddl_Rev1.9.1\driver\src\sysctlr.c


en_result_t Sysctrl_ClkSourceEnable(en_sysctrl_clk_source_t enSource, boolean_t bFlag)
{
    en_result_t enRet = Ok;
    uint32_t u32Temp;
   
    _SysctrlUnlock();
    bFlag = !!bFlag;

    u32Temp = M0P_SYSCTRL->PERI_CLKEN;
    switch (enSource)
    {
      case SysctrlClkRCH:
            M0P_SYSCTRL->SYSCTRL0_f.RCH_EN = bFlag;
            while(bFlag && (1 != M0P_SYSCTRL->RCH_CR_f.STABLE))
            {
                ;
            }
            break;

      case SysctrlClkXTH:
            M0P_SYSCTRL->PERI_CLKEN_f.GPIO = TRUE;
            M0P_GPIO->PDADS |= 3u;         
            M0P_SYSCTRL->SYSCTRL0_f.XTH_EN = bFlag;
            while(bFlag && (1 != M0P_SYSCTRL->XTH_CR_f.STABLE))
            {
                ;
            }
            break;

      case SysctrlClkRCL:
            
            M0P_SYSCTRL->SYSCTRL0_f.RCL_EN = bFlag;//BUG在此,运行完此句 hclk_prs变成了5,即32分频了
            while(bFlag && (1 != M0P_SYSCTRL->RCL_CR_f.STABLE))
            {
                ;
            }
            break;

      case SysctrlClkXTL:
            M0P_SYSCTRL->PERI_CLKEN_f.GPIO = TRUE;
            M0P_GPIO->PCADS |= 0xC000;
            M0P_SYSCTRL->SYSCTRL0_f.XTL_EN = bFlag;
            while(bFlag && (1 != M0P_SYSCTRL->XTL_CR_f.STABLE))
            {
                ;
            }
            break;

      case SysctrlClkPLL:
            M0P_SYSCTRL->PERI_CLKEN_f.ADC = TRUE;
            M0P_BGR->CR_f.BGR_EN = TRUE;
            delay10us(20);
            M0P_SYSCTRL->SYSCTRL0_f.PLL_EN = bFlag;
            while(bFlag && (1 != M0P_SYSCTRL->PLL_CR_f.STABLE))
            {
                ;
            }
            break;

      default:
            enRet = ErrorInvalidParameter;
            break;
    }
    M0P_SYSCTRL->PERI_CLKEN = u32Temp;
   
    return enRet;
}


有官方技术人员,请确认一下,并尽快解决。

这BUG害惨了我,搞坏了2片单片机。
我现在芯片上电主程序增加1秒延时,以防出了BUG再也无法连上仿真器。


HuangHongLun 发表于 2021-5-15 09:54

一般都有读取晶振切换稳定的判断的吧?要么加延时等待。

jyrpxj 发表于 2021-5-15 16:48

不用位变量操作,改为直接整个寄存器先读出来再与/或操作,再写入寄存器,就OK。 是编译器背锅,还是芯片硬件自身bug? 鬼知道还有没有其他的坑?

caizhiwei 发表于 2021-5-20 10:28

我也在用这个LCD驱动,但是还没发现啥问题?
页: [1]
查看完整版本: HC32L136库 LCD驱动/时钟切换驱动 有BUG !