找回密码
 立即注册
查看: 62|回复: 7

32G8K ADC内部参考电压源读取 | 已解决

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-08-01 11:20:10
已绑定手机

2

主题

11

回帖

82

积分

注册会员

积分
82
发表于 4 天前 | 显示全部楼层 |阅读模式
芯片32G8K64
Keil C251 编译器
看到了官方手册上写着可以读取这两个位置获取ADC出厂校准内部参考电压源的数值
然后用下面的代码读取来的数值是0,是哪里有问题吗?

#define  VREFH_ADDR  CHIPID7
#define  VREFL_ADDR  CHIPID8

int BGV = 0;
void Function()
{

     EAXFR = 1;//使能访问 XFR,没有冲突不用关闭
    CKCON = 0x00;//设置外部数据总线速度为最快
    WTST = 0x00;//设置程序代码等待参数,
                        //赋值为 0 可将 CPU 执行程序的速度设置为最快
    BGV = ((VREFH_ADDR << 8) + VREFL_ADDR);
    printf("vref : %d\r\n", BGV);
}




回复

使用道具 举报 送花

3

主题

2098

回帖

1044

积分

等待验证会员

积分
1044
发表于 4 天前 | 显示全部楼层
您提到的STC32G8K64芯片中,通过读取CHIPID7和CHIPID8来获取内部参考电压(VREF)的出厂校准值,这一方法在部分文档中确实有所提及。然而,需要注意的是:STC32G8K系列芯片并不支持直接通过该方式读取内部参考电压值,其内部参考电压源(如1.2V或2.5V)通常不提供直接访问接口。

您当前的代码尝试通过VREFHADDR和VREFLADDR读取数据,但返回值为0,可能是以下原因导致:

一、地址定义错误

您将VREFHADDR和VREFLADDR定义为CHIPID7和CHIPID8,这是不正确的。CHIPID7和CHIPID8是用于读取芯片唯一标识码(UID)的寄存器地址,与ADC内部参考电压无关。

正确做法:  
如果需要读取内部参考电压,应使用ADC模块的特定通道(如ADC通道16或17),并配置ADC为内部参考电压模式进行测量。

二、未正确配置ADC

要读取内部参考电压,需对ADC进行如下配置:

1. 选择内部参考电压源  
   在ADC控制寄存器中设置参考电压为内部参考(如ADCCON1 |= 0x08;,具体取决于芯片手册)。

2. 选择内部参考电压通道  
   某些型号的ADC支持内部参考电压作为输入通道,例如通道16或17。

3. 启动ADC转换并读取结果

三、代码示例(仅供参考)
  1. c
  2. include
  3. void ADCInit(void)
  4. {
  5.     // 设置ADC时钟为系统时钟(根据实际需求调整)
  6.     ADCCON0 = 0x00;        // ADC关闭
  7.     ADCCON1 = 0x00;        // 使用内部参考电压
  8.     ADCCON2 = 0x00;        // 选择通道16(内部参考电压)
  9.     ADCCON0 |= 0x80;       // 启动ADC
  10. }
  11. unsigned int ReadVref(void)
  12. {
  13.     unsigned int result;
  14.     ADCCON0 |= 0x40;       // 触发一次转换
  15.     while (!(ADCCON0 & 0x20)); // 等待转换完成
  16.     result = ADCDAT;       // 读取结果
  17.     return result;
  18. }
复制代码

四、注意事项
ADC精度限制:内部参考电压的精度可能较低,适用于一般应用,若需要高精度测量,建议使用外部参考电压。
不同型号差异:STC32G8K系列中,部分型号可能不支持内部参考电压直接读取,建议查阅具体型号的数据手册确认。
编译器兼容性:Keil C251编译器在处理特殊寄存器时需确保语法正确,避免因编译器优化导致问题。

五、总结

您目前的代码逻辑存在地址定义错误,且未正确配置ADC以读取内部参考电压。建议按照官方手册中ADC章节的说明,使用ADC模块的指定通道进行测量。如需进一步帮助,请提供完整的代码片段及使用的具体ADC配置参数,以便更准确地定位问题。

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

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:60
  • 最近打卡:2025-08-04 11:49:20

25

主题

434

回帖

2702

积分

超级版主

积分
2702
发表于 4 天前 | 显示全部楼层
利用ADC15通道在内部固定接的1.19V辅助固定信号源,反推其他通道的输入电压或VCC - ADC/比较器,DMA支持的12位ADC,轨到轨比较器,DAC 国芯人工智能技术交流网站 - AI32位8051交流社区
  https://www.stcaimcu.com/forum.p ... amp;extra=#pid24906

电话:0513-55012946 QQ:2195591714  微信:  19952583740
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:517
  • 最近打卡:2025-08-04 07:10:33
已绑定手机

87

主题

5811

回帖

1万

积分

超级版主

DebugLab

积分
10448
发表于 4 天前 | 显示全部楼层
全局变量不能在声明时赋值
试一下下面这个程序
  1. void main(void)
  2. {
  3.     //<<AICUBE_USER_MAIN_INITIAL_BEGIN>>
  4.     // 在此添加用户主函数初始化代码  
  5.         unsigned int BGV;
  6.         unsigned int CH15;
  7.         unsigned int VREF;
  8.         unsigned int CH10;
  9.         unsigned int V_CH10;
  10.     //<<AICUBE_USER_MAIN_INITIAL_END>>
  11.     SYS_Init();
  12.     //<<AICUBE_USER_MAIN_CODE_BEGIN>>
  13.     // 在此添加主函数中运行一次的用户代码
  14.         BGV=((unsigned int)CHIPID7<<8)+(unsigned int)CHIPID8;
  15.     //<<AICUBE_USER_MAIN_CODE_END>>
  16.     while (1)
  17.     {
  18.         //<<AICUBE_USER_MAIN_LOOP_BEGIN>>
  19.         // 在此添加主函数中用户主循环代码  
  20.                 CH15=ADC_Convert(15);
  21.                 CH10=ADC_Convert(10);
  22.                 VREF=(unsigned int)((unsigned long)BGV*4096UL/(unsigned long)CH15);
  23.                 V_CH10=(unsigned int)((unsigned long)VREF*(unsigned long)CH10/4096UL);
  24.                 printf("BGV=%dmV CH15=%d Vref=%dmV CH10=%d V_CH10=%dmV\r\n",BGV,CH15,VREF,CH10,V_CH10);
  25.                 delay_ms(1000);
  26.         //<<AICUBE_USER_MAIN_LOOP_END>>
  27.     }
  28. }
复制代码
51例程(251需移植,请勿直接下载HEX测试):
CDC发送VREF.zip (48.39 KB, 下载次数: 2)
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-08-01 11:20:10
已绑定手机

2

主题

11

回帖

82

积分

注册会员

积分
82
发表于 4 天前 | 显示全部楼层
Debu*** 发表于 2025-8-1 13:14
全局变量不能在声明时赋值
试一下下面这个程序
51例程(251需移植,请勿直接下载HEX测试):

谢谢哦,试了一下,BGV还是0,上面机器人回我了,说STC32G8K这款不支持读取
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-08-01 11:20:10
已绑定手机

2

主题

11

回帖

82

积分

注册会员

积分
82
发表于 4 天前 | 显示全部楼层
国芯人*** 发表于 2025-8-1 11:28
您提到的STC32G8K64芯片中,通过读取CHIPID7和CHIPID8来获取内部参考电压(VREF)的出厂校准值,这一方法在 ...

错了,CHIPID7和CHIPID8在手册里面写着的是内部参考信号源
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-08-01 11:20:10
已绑定手机

2

主题

11

回帖

82

积分

注册会员

积分
82
发表于 4 天前 | 显示全部楼层
32G12*** 发表于 2025-8-1 11:54
利用ADC15通道在内部固定接的1.19V辅助固定信号源,反推其他通道的输入电压或VCC - ADC/比较器,DMA支持的1 ...

感谢回复,我在手册中看到可以直接读取内部寄存器获得参考信号源的值,就像试一下,不是这种通过ADC转换得到的,十分感谢回复
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:60
  • 最近打卡:2025-08-04 11:49:20

25

主题

434

回帖

2702

积分

超级版主

积分
2702
发表于 4 天前 | 显示全部楼层
好,解决就好!
电话:0513-55012946 QQ:2195591714  微信:  19952583740
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-8-5 03:38 , Processed in 0.126617 second(s), 88 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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