wu-jia-x 发表于 2025-8-1 11:25:07

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

芯片32G8K64
Keil C251 编译器
看到了官方手册上写着可以读取这两个位置获取ADC出厂校准内部参考电压源的数值
然后用下面的代码读取来的数值是0,是哪里有问题吗?

#defineVREFH_ADDRCHIPID7
#defineVREFL_ADDRCHIPID8

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);
}




国芯人工智能 发表于 2025-8-1 11:28:00

您提到的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转换并读取结果

三、代码示例(仅供参考)

c
include

void ADCInit(void)
{
    // 设置ADC时钟为系统时钟(根据实际需求调整)
    ADCCON0 = 0x00;      // ADC关闭
    ADCCON1 = 0x00;      // 使用内部参考电压
    ADCCON2 = 0x00;      // 选择通道16(内部参考电压)
    ADCCON0 |= 0x80;       // 启动ADC
}

unsigned int ReadVref(void)
{
    unsigned int result;
    ADCCON0 |= 0x40;       // 触发一次转换
    while (!(ADCCON0 & 0x20)); // 等待转换完成
    result = ADCDAT;       // 读取结果
    return result;
}

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

五、总结

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

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

32G12K128 发表于 2025-8-1 11:54:42

利用ADC15通道在内部固定接的1.19V辅助固定信号源,反推其他通道的输入电压或VCC - ADC/比较器,DMA支持的12位ADC,轨到轨比较器,DAC 国芯人工智能技术交流网站 - AI32位8051交流社区
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=3763&highlight=ADC%E5%86%85%E9%83%A8%E5%8F%82%E8%80%83%E7%94%B5%E5%8E%8B&page=1&extra=#pid24906

DebugLab 发表于 2025-8-1 13:14:34

全局变量不能在声明时赋值
试一下下面这个程序
void main(void)
{
    //<<AICUBE_USER_MAIN_INITIAL_BEGIN>>
    // 在此添加用户主函数初始化代码
      unsigned int BGV;
      unsigned int CH15;
      unsigned int VREF;
      unsigned int CH10;
      unsigned int V_CH10;
    //<<AICUBE_USER_MAIN_INITIAL_END>>

    SYS_Init();

    //<<AICUBE_USER_MAIN_CODE_BEGIN>>
    // 在此添加主函数中运行一次的用户代码
      BGV=((unsigned int)CHIPID7<<8)+(unsigned int)CHIPID8;
    //<<AICUBE_USER_MAIN_CODE_END>>

    while (1)
    {
      //<<AICUBE_USER_MAIN_LOOP_BEGIN>>
      // 在此添加主函数中用户主循环代码
                CH15=ADC_Convert(15);
                CH10=ADC_Convert(10);
                VREF=(unsigned int)((unsigned long)BGV*4096UL/(unsigned long)CH15);
                V_CH10=(unsigned int)((unsigned long)VREF*(unsigned long)CH10/4096UL);
                printf("BGV=%dmV CH15=%d Vref=%dmV CH10=%d V_CH10=%dmV\r\n",BGV,CH15,VREF,CH10,V_CH10);
                delay_ms(1000);
      //<<AICUBE_USER_MAIN_LOOP_END>>
    }
}51例程(251需移植,请勿直接下载HEX测试):

wu-jia-x 发表于 2025-8-1 13:44:54

DebugLab 发表于 2025-8-1 13:14
全局变量不能在声明时赋值
试一下下面这个程序
51例程(251需移植,请勿直接下载HEX测试):


谢谢哦,试了一下,BGV还是0,上面机器人回我了,说STC32G8K这款不支持读取{:shuai:}

wu-jia-x 发表于 2025-8-1 13:46:33

国芯人工智能 发表于 2025-8-1 11:28
您提到的STC32G8K64芯片中,通过读取CHIPID7和CHIPID8来获取内部参考电压(VREF)的出厂校准值,这一方法在 ...

错了,CHIPID7和CHIPID8在手册里面写着的是内部参考信号源

wu-jia-x 发表于 2025-8-1 13:47:46

32G12K128 发表于 2025-8-1 11:54
利用ADC15通道在内部固定接的1.19V辅助固定信号源,反推其他通道的输入电压或VCC - ADC/比较器,DMA支持的1 ...

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

32G12K128 发表于 2025-8-1 14:22:14

好,解决就好!
页: [1]
查看完整版本: 32G8K ADC内部参考电压源读取 | 已解决