找回密码
 立即注册
查看: 171|回复: 11

AI8051U开发记录二:RTC启用内部32K晶振,ADC功能受影响?

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:105
  • 最近打卡:2025-08-22 23:20:36
已绑定手机

8

主题

83

回帖

156

积分

注册会员

积分
156
发表于 2025-8-4 16:34:03 | 显示全部楼层 |阅读模式



最近在研究RTC时钟功能,由于板子上没有设计外部时钟电路,我启用了内部时钟,配置如下。


    IRC32KCR = 0x80;   //启动内部32K晶振.
    while (!(IRC32KCR & 1));  //等待时钟稳定
    RTCCFG = 0x03;    //选择内部32K时钟源,触发RTC寄存器初始化


我测试后发现,只要启用了内部时钟,ADC采样好像停了,这个是正常的吗
回复

使用道具 举报 送花

3

主题

2031

回帖

910

积分

等待验证会员

积分
910
发表于 2025-8-4 16:38:00 | 显示全部楼层
您好,感谢您的提问。关于您在使用AI8051U芯片时遇到的“启用内部32K晶振后ADC功能异常”问题,这是一个值得关注的技术细节。以下是对该现象的专业分析与建议。

首先,根据您提供的配置代码:
  1. c
  2. IRC32KCR = 0x80;   //启动内部32K晶振
  3. while (!(IRC32KCR & 1));  //等待时钟稳定
  4. RTCCFG = 0x03;    //选择内部32K时钟源,触发RTC寄存器初始化
复制代码

这段代码的功能是启用内部32KHz晶振,并将其作为RTC的时钟源。从逻辑上看,这一操作本身不会直接影响ADC模块的工作状态,因为ADC通常依赖于系统主频或特定的时钟分频,而非RTC时钟。

然而,在实际应用中,可能会存在以下几种潜在原因导致ADC采样异常:

1. 时钟域冲突:虽然内部32KHz晶振主要用于RTC,但某些MCU架构中,系统时钟可能与RTC时钟共享部分资源或控制寄存器。若ADC模块依赖于系统时钟(如HCLK或PCLK),而RTC的启用导致系统时钟配置发生变化,可能会间接影响ADC的正常工作。

2. 电源管理或功耗模式:部分MCU在启用低功耗模式时,可能会关闭非必要的外设时钟。若您在启用RTC后进入某种低功耗状态,可能导致ADC模块被意外关闭或处于待机状态。

3. 中断或DMA冲突:如果ADC采样依赖于定时器或DMA传输,而RTC的启用导致系统时钟频率变化,可能会引起定时器或DMA的时序错误,从而影响ADC采样的准确性或稳定性。

4. 寄存器配置覆盖:在某些情况下,RTC的配置可能与其他模块(如ADC)共用部分寄存器或控制位,尤其是在未正确设置寄存器保护机制的情况下,可能会出现配置冲突。

建议您进行如下排查:
检查ADC相关寄存器(如ADCCTRL、ADCCFG等)是否在启用RTC后被意外修改。
确认系统时钟配置是否在RTC启用前后保持一致,尤其是主频和分频设置。
使用示波器或逻辑分析仪观察ADC输入信号与采样时序,确认是否存在异常。
查阅AI8051U数据手册中的“时钟树”和“ADC模块”章节,确认ADC与时钟源之间的关系。

综上所述,启用内部32KHz晶振本身不会直接导致ADC功能异常,但需结合系统整体时钟配置、电源管理策略及寄存器设置进行综合分析。如问题持续存在,建议提供更详细的代码片段或硬件设计图以便进一步定位。

如需进一步技术支持,欢迎联系国芯人工智能官方技术团队。

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:537
  • 最近打卡:2025-08-24 01:00:11
已绑定手机

86

主题

5979

回帖

1万

积分

超级版主

积分
10832
发表于 2025-8-4 17:23:31 | 显示全部楼层
不正常,内部32K时钟不应该影响ADC

内部低频时钟(约32K)作为掉电唤醒定时器,出于低功耗考虑,无抗温飘压飘电路,精度较低,不能作为RTC时钟使用,RTC使用内部低频时钟仅供测试(看秒在走就是RTC正常工作),不要在实际运行时使用


注意中断问题,打开的中断必须要有中断函数,没使用中断号扩展插件必须使用isr.asm,并正确编辑isr.asm

RTC是异步操作的,设置RTC寄存器,下一个32K时钟周期才会生效

新手必读:
https://www.stcaimcu.com/thread-16535-1-1.html


回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:105
  • 最近打卡:2025-08-22 23:20:36
已绑定手机

8

主题

83

回帖

156

积分

注册会员

积分
156
发表于 2025-8-4 19:42:20 | 显示全部楼层
经过仿真,发现程序一直卡在while (!(IRC32KCR &0X01));  //等待时钟稳定,导致ADC无法初始化。
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:105
  • 最近打卡:2025-08-22 23:20:36
已绑定手机

8

主题

83

回帖

156

积分

注册会员

积分
156
发表于 2025-8-4 19:48:36 | 显示全部楼层
但是我用官方的开发板,和官方提供的代码包,也是卡在这里while (!(IRC32KCR &0X01));  //等待时钟稳定,不知道是不是仿真的影响
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:105
  • 最近打卡:2025-08-22 23:20:36
已绑定手机

8

主题

83

回帖

156

积分

注册会员

积分
156
发表于 2025-8-4 19:55:34 | 显示全部楼层
     经验证确实RTC_config();无法初始货,也就是卡在while (!(IRC32KCR &0X01));
       
        当我把P2=0X00;写在RTC_config();的后面,对应的LED无法点亮,写在这个代码前面,则可以点亮。
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:498
  • 最近打卡:2025-08-23 08:57:24
已绑定手机

45

主题

2172

回帖

7590

积分

论坛元老

积分
7590
发表于 2025-8-5 09:13:20 | 显示全部楼层
直接烧录代码到芯片里,通过指示灯判断等待时钟稳定代码是否能正常通过执行。
如果还是通不过的话,排查扩展寄存器访问使能在此之前是否有打开,打开的话有没有在其他地方又将其关闭了。
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:505
  • 最近打卡:2025-08-23 08:45:03

33

主题

2504

回帖

5379

积分

论坛元老

积分
5379
发表于 2025-8-5 09:41:36 | 显示全部楼层
仿真 你不会是软件仿真把,,,
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:105
  • 最近打卡:2025-08-22 23:20:36
已绑定手机

8

主题

83

回帖

156

积分

注册会员

积分
156
发表于 2025-8-5 14:31:34 | 显示全部楼层
_奶*** 发表于 2025-8-5 09:41
仿真 你不会是软件仿真把,,,

USB仿真
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:105
  • 最近打卡:2025-08-22 23:20:36
已绑定手机

8

主题

83

回帖

156

积分

注册会员

积分
156
发表于 2025-8-5 17:22:01 | 显示全部楼层
乘风*** 发表于 2025-8-5 09:13
直接烧录代码到芯片里,通过指示灯判断等待时钟稳定代码是否能正常通过执行。
如果还是通不过的话,排查扩 ...

目前试过,要在定时器前初始化,就可以。但是精度很差。1S的中断时长也不对。
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-8-24 04:10 , Processed in 0.121562 second(s), 94 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表