xmks 发表于 2025-8-16 21:33:00

求教:在使用库函数时,使用内部时钟,一直卡在while (!(IRC32KCR & 1)); //等待时钟

库函数描述是错误的,应该是RTC初始化。请厂商修改描述!我卡的地方用P32灯点不亮!

//========================================================================
// 函数: u8        ADC_Inilize(ADC_InitTypeDef *ADCx)
// 描述: ADC初始化程序.
// 参数: ADCx: 结构参数,请参考头文件里的定义.
// 返回: none.
// 版本: V1.0, 2012-10-22
//========================================================================
u8        RTC_Inilize(RTC_InitTypeDef *RTCx)
{
        if(RTCx->RTC_Year > 99)        return FAIL;        //错误
        if(RTCx->RTC_Month > 12)        return FAIL;        //错误
        if(RTCx->RTC_Day > 31)        return FAIL;        //错误
        if(RTCx->RTC_Hour > 23)        return FAIL;        //错误
        if(RTCx->RTC_Min > 59)        return FAIL;        //错误
        if(RTCx->RTC_Sec > 59)        return FAIL;        //错误
        if(RTCx->RTC_Ssec > 127)        return FAIL;        //错误
        if(RTCx->RTC_ALAHour > 23)        return FAIL;        //错误
        if(RTCx->RTC_ALAMin > 59)        return FAIL;        //错误
        if(RTCx->RTC_ALASec > 59)        return FAIL;        //错误
        if(RTCx->RTC_ALASsec > 127)        return FAIL;        //错误

        INIYEAR = RTCx->RTC_Year;
        INIMONTH = RTCx->RTC_Month;
        INIDAY = RTCx->RTC_Day;
        INIHOUR = RTCx->RTC_Hour;
        INIMIN = RTCx->RTC_Min;
        INISEC = RTCx->RTC_Sec;
        INISSEC = RTCx->RTC_Ssec;

        ALAHOUR = RTCx->RTC_ALAHour;        //闹钟小时
        ALAMIN= RTCx->RTC_ALAMin;                //闹钟分钟
        ALASEC= RTCx->RTC_ALASec;                //闹钟秒
        ALASSEC = RTCx->RTC_ALASsec;        //闹钟1/128秒

        if(RTCx->RTC_Clock == RTC_IRC32KCR)
        {
                //STC8H8K64U B版本芯片使用内部32K时钟,休眠无法唤醒
                IRC32KCR = 0x80;   //启动内部32K晶振.
               
               
               
                while (!(IRC32KCR & 1));//等待时钟稳定
                P32=0;
                RTCCFG = 0x03;    //选择内部32K时钟源,触发RTC寄存器初始化
        }
        else
        {
                X32KCR = 0x80 + 0x40;   //启动外部32K晶振, 低增益+0x00, 高增益+0x40.
                while (!(X32KCR & 1));//等待时钟稳定
                RTCCFG = 0x01;    //选择外部32K时钟源,触发RTC寄存器初始化
        }

        if(RTCx->RTC_Enable == ENABLE)
        {
                RTCCR = 0x01;   //RTC使能
                while(RTCCFG & 0x01);        //等待初始化完成,需要在 "RTC使能" 之后判断.
                //设置RTC时间需要32768Hz的1个周期时间,大约30.5us. 由于同步, 所以实际等待时间是0~30.5us.
                //如果不等待设置完成就睡眠, 则RTC会由于设置没完成, 停止计数, 唤醒后才继续完成设置并继续计数.
        }
        else
        {
                RTCCR = 0x00;   //RTC关闭
        }
       
        return SUCCESS;
}

国芯人工智能 发表于 2025-8-16 21:38:00

尊敬的用户,您好:

感谢您对国芯人工智能产品的关注与反馈。关于您提到的“使用内部时钟时卡在 while (!(IRC32KCR & 1));”的问题,我们已收到相关描述,并高度重视。

首先,针对您所提及的代码片段:

c
while (!(IRC32KCR & 1)); // 等待时钟

此代码通常用于等待内部低速时钟(如 IRC32K)稳定。若程序在此处长时间停滞,可能由以下几种原因导致:

1. 时钟源未正确配置:请确认是否已经启用并正确配置了 IRC32K 时钟源。
2. 时钟稳定性问题:部分芯片在启动初期可能需要一定时间使内部时钟稳定,建议在等待前增加适当的延时。
3. 寄存器位定义错误:请核对 IRC32KCR 寄存器的定义是否准确,特别是对应位的含义和读取方式。

关于您提到的“库函数描述是错误的,应该是 RTC 初始化”,我们理解您的困惑。目前提供的 RTCInit() 函数主要用于初始化实时时钟模块,其功能包括设置年、月、日、时、分、秒等参数。若您在调用该函数时发现异常,可能是由于以下原因:
未正确配置 RTC 时钟源:RTC 通常依赖于 LSE 或 IRC32K 作为时钟源,若未正确配置,可能导致 RTC 初始化失败。
系统时钟未就绪:某些芯片要求主时钟(如 HSE 或 HSI)先稳定后,才能进行 RTC 初始化。
参数输入不合法:例如,月份为 0 或大于 12,日期超过当月最大天数等,均会导致函数返回错误。

此外,您提到“P32 灯点不亮”,这可能意味着程序未能正常执行到 LED 控制代码段。建议您通过调试工具(如 JTAG 或 SWD)查看当前程序执行流程,确认是否因上述问题导致程序卡死。

我们建议您在使用库函数前,仔细阅读官方文档及示例代码,确保各模块的初始化顺序和参数设置符合规范。同时,我们也正在对相关库函数的说明进行核查,如有必要将尽快更新文档并优化函数逻辑。

如您仍有疑问或需要进一步技术支持,欢迎随时联系国芯人工智能的技术支持团队,我们将竭诚为您服务。

此致
敬礼!

国芯人工智能技术团队
2025年4月5日

[本文内容由国芯人工智能辅助生成,仅供参考]

xmks 发表于 2025-8-16 21:49:00

国芯人工智能 发表于 2025-8-16 21:38
尊敬的用户,您好:

感谢您对国芯人工智能产品的关注与反馈。关于您提到的“使用内部时钟时卡在 while (!( ...

我是指这个描述张冠李戴了

//========================================================================
// 函数: u8      ADC_Inilize(ADC_InitTypeDef *ADCx)
// 描述: ADC初始化程序.
// 参数: ADCx: 结构参数,请参考头文件里的定义.
// 返回: none.
// 版本: V1.0, 2012-10-22
//========================================================================

DebugLab 发表于 2025-8-16 21:59:36

一直等待外部时钟稳定,检查外部32768晶振是否正常工作,注意晶振两个IO必须设置为高阻,并关闭数字输入

xmks 发表于 2025-8-16 22:07:40

DebugLab 发表于 2025-8-16 21:59
一直等待外部时钟稳定,检查外部32768晶振是否正常工作,注意晶振两个IO必须设置为高阻,并关闭数字输入 ...

我说使用内部时钟!

DebugLab 发表于 2025-8-16 22:33:45

xmks 发表于 2025-8-16 22:07
我说使用内部时钟!

那不应该出现这个问题

RTCx->RTC_Clock == RTC_IRC32KCR

这个条件满足了吗?

xmks 发表于 2025-8-16 23:03:55

DebugLab 发表于 2025-8-16 22:33
那不应该出现这个问题

RTCx->RTC_Clock == RTC_IRC32KCR


能满足。用P32=0放在while语句前能点亮,放后面死循环!
if(RTCx->RTC_Clock == RTC_IRC32KCR)
        {
                //STC8H8K64U B版本芯片使用内部32K时钟,休眠无法唤醒
               
                IRC32KCR = 0x80;   //启动内部32K晶振.
               
                P32=0;
               
                while (!(IRC32KCR & 1));//等待时钟稳定
               
                RTCCFG = 0x03;    //选择内部32K时钟源,触发RTC寄存器初始化
        }

xmks 发表于 7 天前

问题找到了,我用的是8g系列没有RTC,还是建议厂商把8g和8H的函数库分开,他们并不通用!

乘风飞扬 发表于 6 天前

8H芯片也并非都有RTC,所以在使用前最好先通过规格书选型表了解选用的芯片都有哪些功能。





xmks 发表于 5 天前

乘风飞扬 发表于 2025-8-18 10:40
8H芯片也并非都有RTC,所以在使用前最好先通过规格书选型表了解选用的芯片都有哪些功能。




谢谢!我只是在80年代末期用8051的汇编做过一些项目,后来因为其他原因中断了技术工作,最近快退休想重新学习下,目前只使用了8g的库函数,发现里面尤其是描述部分错误很多。比较STM32他们的基本没啥错,或者我没有发现。还是需要厂方能提供严谨的文档。斗胆提个意见!
页: [1]
查看完整版本: 求教:在使用库函数时,使用内部时钟,一直卡在while (!(IRC32KCR & 1)); //等待时钟