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

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

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:100
  • 最近打卡:2025-08-06 17:34:58
已绑定手机

7

主题

81

回帖

125

积分

注册会员

积分
125
发表于 3 天前 | 显示全部楼层 |阅读模式



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


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


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

使用道具 举报 送花

3

主题

2092

回帖

1032

积分

等待验证会员

积分
1032
发表于 3 天前 | 显示全部楼层
您好,感谢您的提问。关于您在使用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
  • 打卡总天数:519
  • 最近打卡:2025-08-06 06:32:52
已绑定手机

87

主题

5847

回帖

1万

积分

超级版主

DebugLab

积分
10528
发表于 3 天前 | 显示全部楼层
不正常,内部32K时钟不应该影响ADC

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


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

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

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


DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:100
  • 最近打卡:2025-08-06 17:34:58
已绑定手机

7

主题

81

回帖

125

积分

注册会员

积分
125
发表于 3 天前 | 显示全部楼层
经过仿真,发现程序一直卡在while (!(IRC32KCR &0X01));  //等待时钟稳定,导致ADC无法初始化。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:100
  • 最近打卡:2025-08-06 17:34:58
已绑定手机

7

主题

81

回帖

125

积分

注册会员

积分
125
发表于 3 天前 | 显示全部楼层
但是我用官方的开发板,和官方提供的代码包,也是卡在这里while (!(IRC32KCR &0X01));  //等待时钟稳定,不知道是不是仿真的影响
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:100
  • 最近打卡:2025-08-06 17:34:58
已绑定手机

7

主题

81

回帖

125

积分

注册会员

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:483
  • 最近打卡:2025-08-06 09:08:34
已绑定手机

44

主题

2143

回帖

7457

积分

论坛元老

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:495
  • 最近打卡:2025-08-06 15:38:26

33

主题

2484

回帖

5389

积分

论坛元老

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

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:100
  • 最近打卡:2025-08-06 17:34:58
已绑定手机

7

主题

81

回帖

125

积分

注册会员

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

USB仿真
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:100
  • 最近打卡:2025-08-06 17:34:58
已绑定手机

7

主题

81

回帖

125

积分

注册会员

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

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

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-8-7 05:28 , Processed in 0.133930 second(s), 94 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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