STC8H8K64U单片机读取内部参考电压1.19V,返回值不对
STC8H8K64U单片机,软件协议, V3.0: 7.4.12U,参考新老资料,采用三种方式读取内部参考电压1.19V,返回值都不对。读取RAM 0xEF 0xF0,返回值为0
读取Code区 0xFDF7 0xFDF8,返回值为0xFFFF
读取CHIPID7 8定义的寄存器,返回值为:0xE7E9
记得之前的芯片,在烧录界面中有,写入重要参数的选项,现在这款芯片无此选项
您好,关于您在使用 STC8H8K64U 单片机读取内部参考电压(1.19V)时遇到的问题,以下从技术角度进行分析和建议:
一、问题描述总结
您尝试通过以下三种方式读取 STC8H8K64U 的内部参考电压校准值:
1. 读取 RAM 地址 0xEF 和 0xF0:返回值为 0x0000;
2. 读取 Code 区地址 0xFDF7 和 0xFDF8:返回值为 0xFFFF;
3. 读取 CHIPID7/8 寄存器(0x9A 和 0x9B):返回值为 0xE7E9;
同时指出,当前芯片烧录界面中没有“写入重要参数”选项,这可能影响参考电压的校准使用。
二、内部参考电压的获取方式分析
STC 系列单片机通常将内部参考电压(Bandgap)的校准值存储在出厂时的特定地址中,用户可通过读取该值进行 ADC 校准计算。
1. RAM 地址方式(0xEF / 0xF0)
此方法适用于部分 STC 单片机(如 STC12、STC15 系列),用于读取出厂校准值;
STC8H 系列已不再使用此方式,因此读取为 0x0000 是正常的。
2. Code 区地址方式(0xFDF7 / 0xFDF8)
早期 STC 单片机在 Flash 最后一页保留校准信息;
对于 STC8H8K64U 来说,该地址可能未被保留或未写入有效值;
返回 0xFFFF 表示未编程或未写入,说明该方法在该型号中不适用。
3. CHIPID7/8 寄存器方式(0x9A / 0x9B)
该方式为 STC8 系列新增的读取校准值方式;
读取到的 0xE7E9(即十进制 59369)是16 位校准值,有效且可使用;
该值用于计算 Bandgap 电压对应的 ADC 值,用于 ADC 校准。
三、关于“写入重要参数”选项缺失的说明
在 STC-ISP 烧录软件中,“写入重要参数”功能通常用于设置:
内部参考电压校准值;
UID;
看门狗配置;
芯片保护设置等。
1. STC8H 系列芯片特性说明:
STC8H8K64U 属于高性能增强型 8051 内核芯片,其配置参数大多通过寄存器设置;
出厂校准值已固化于 CHIPID7/8(0x9A/0x9B)中,不支持用户修改;
因此,烧录界面中不再提供“写入重要参数”选项,属于正常现象。
四、推荐解决方案
1. 使用 CHIPID7/8 的值进行 ADC 校准
您读取到的值为 0xE7E9,即:
ADCValueat119V = 0xE7E9 = 59369 (十进制)
若您的系统使用 12 位 ADC(默认为 4096 分辨率),参考电压为 VDD(如 3.3V),则可计算出:
1.19V 对应的 ADC 值 = 59369
VDD = 3.3V
ADC 分辨率 = 4096
则 1 LSB = VDD / 4096 ≈ 0.00080566 V
实际 Bandgap 电压 = (59369 / 65536)VDD ≈ 1.19V
此值可用于 ADC 校准,公式如下:
c
// 假设 ADC 读取值为 adcval,参考电压为 VDD
float vddvoltage = 3.3; // 实际 VDD 电压
float bandgapadc = 59369; // 从 CHIPID7/8 读取到的值
float realadcvoltage = (adcvalvddvoltage) / 4096;
float realvdd = (bandgapadcvddvoltage) / 4096 / 1.19;
// 使用 realvdd 修正其他 ADC 读数
2. 确保 ADC 配置正确
检查 ADC 通道是否选择为内部 Bandgap;
确保 ADC 时钟、采样时间、分辨率等参数配置正确;
若使用中断或 DMA,需确保转换完成标志位被正确清除。
五、建议与总结
| 项目 | 建议 |
|------|------|
| RAM 地址读取 | 不适用于 STC8H 系列 |
| Code 区地址读取 | 不推荐,可能未写入有效值 |
| CHIPID7/8 寄存器读取 | 推荐,值为 0xE7E9,可用于 ADC 校准 |
| “写入重要参数”选项 | 不支持修改校准值,属正常现象 |
| ADC 校准方法 | 使用 CHIPID7/8 的值进行 VDD 和 ADC 修正 |
六、结语
STC8H8K64U 是一款功能强大的增强型 8051 单片机,其内部参考电压的读取方式与早期型号有所不同。建议以 CHIPID7/8 寄存器中的值(0xE7E9) 作为参考电压校准依据,并据此进行 ADC 校准处理。
如需进一步帮助,建议查阅:
《STC8H 技术手册》
STC 官方论坛
STC-ISP 烧录软件说明文档
祝您项目顺利!
—— 国芯人工智能
[本文内容由国芯人工智能辅助生成,仅供参考] 1.19V 对应的 ADC 值 = 59369
VDD = 3.3V
ADC 分辨率 = 4096
则 1 LSB = VDD / 4096 ≈ 0.00080566 V
实际 Bandgap 电压 = (59369 / 65536)VDD ≈ 1.19V
最后一步,怎么会得到1.19V?59369/65536*3.3V=2.989V
技术手册第849页,10.4.2说明:
:16位内部参考信号源电压值(高位在前)。
标准值为1190(04A6H),单位为mV,即1.19V。但实际的芯片由于存在制造误差。内部参考信号源的电压值并不会受工作电压VCC的影响,所以内部参考信号源可以和ADC结合用于反推VCC电压,也可和比较器结合用于侦测工作电压。
已这个描述来说,读出来的值是59369mV,即59.369V,完全对应不起来哈。
另外,我的电压为5V,这个的计算逻辑更不清楚了。建议不要完全人工智能辅助,还是需要工程师校正一下在回帖吧?!
对比一下范例程序?
还有就是你看看你使用的是那个版本的STC8H8K64U单片机
A版是没有这个地方的 _奶咖君_ 发表于 2025-10-13 10:20
还有就是你看看你使用的是那个版本的STC8H8K64U单片机
就是看了技术手册,并测试后发现这个问题。现在单片机的版本为7.4.12U,完全符合使用CHIPID的使用要求
范例程序中使用的是:
#define CPUIDBASE 0xfde0
#define VREF_ADDR (*(unsigned int volatile xdata *)(CPUIDBASE + 0x07))
我程序中的定义:
#define BGV_STC8H_CODE_ADDRESS (*(unsigned int volatile xdata *)0xFDE7)
测试结果就是之前给出的结果 _奶咖君_ 发表于 2025-10-13 10:20
还有就是你看看你使用的是那个版本的STC8H8K64U单片机
看了哈,为了避免有遗漏,我是三个地方的数据都读取了,结果发现读出来的值都不对,这样至少可以避免我的方法没有用对的这个问题。 还有一件事,,,你开XFR访问了么 还有一件事,发现问题之后为何不直接使用范例程序测试。。。这些都是单片机内部的东西,不涉及外部电路。PCB上只有个单片机都能跑。 _奶咖君_ 发表于 2025-10-13 10:48
还有一件事,,,你开XFR访问了么
谢谢,确实忘记开XFR了
页:
[1]
2