[技术问答]

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

[复制链接]
3952|3
手机看帖
扫描二维码
随时随地手机跟帖
jyrpxj|  楼主 | 2021-5-14 23:56 | 显示全部楼层 |阅读模式
官方下载来的,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;
}
QQ截图20210514235155.jpg
QQ截图20210514235127.jpg
有官方技术人员,请确认一下,并尽快解决。

这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驱动,但是还没发现啥问题?

使用特权

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

本版积分规则

8

主题

44

帖子

1

粉丝