请问,我上面用chipid读的程序有什么问题吗?
对照范例看下呢
https://www.stcaimcu.com/data/attachment/forum/202303/27/215017ej00bkgc00xszgg0.png
https://www.stcaimcu.com/data/attachment/forum/202303/27/215017f085zjacd580v585.png
https://www.stcaimcu.com/data/attachment/forum/202303/27/215017t4pwfcccbbbpcpfw.png
STC32位8051芯片 发表于 2023-3-29 14:32
对照范例看下呢
你好,我测试了,地址是0xfdf7值才对,地址是0xfef7值不对,STC-ISP例程里面地址是对的 STC8A8K64D4内部参数从多个位置都能读取,以下是保存在Flash空间的地址,
可以通过 BGV = (int code *)0xfdf7; 的方式指向Flash区域进行读取。
此外还可以从CHIPID寄存器里读取(推荐)
CHIPID是扩展寄存器,从这里读取应该使用访问扩展寄存器的方法,而不能再用读取Flash空间的方法
#define USBCHIPID
#define CPUIDBASE 0xfde0
#define VREF_ADDR (*(unsigned int volatile xdata *)(CPUIDBASE + 0x07))
使用不同的方法应参考对应的例程,不能单纯只修改一下地址。
乘风飞扬 发表于 2023-3-30 09:19
STC8A8K64D4内部参数从多个位置都能读取,以下是保存在Flash空间的地址,
可以通过 BGV = (int code *)0xfd ...
我应该找到原因了,谢谢!应该是缺少P_SW2=0x80;这条语句导致的,不过我还有2点疑问,1、为什么地址和直接ROM读取的地址不同?2、既然CHIPID是只读的,为什么还要用volatile修饰 ? 神农鼎 发表于 2023-3-27 21:50
谢谢,我找到问题了,程序缺少PSW2=0x80;的语句 本帖最后由 山顶任风吹 于 2024-6-24 19:22 编辑
请问,
1. STC8H3K64S2是不是没有含CHIPID寄存器,所以也就无法从CHIPID中读出内部1.19V参考电压?若有的话,按范例为啥读出来的数据显示的字符是 }},数据不对? 定义指针 #define VREF_ADDR (*(unsigned int volatile xdata *)(0xfde7))
2. 用printf("CHIPID开始= %u\n",VREF_ADDR); 显示的字符是32125
3. 按范例从RAM中读取1.19V,无输出显示,用printf 打印,数据显示1185,应该是对的
4. 按范例从ROM中读取1.19V,无输出显示,用printf 打印,数据显示65535,应该是错的,
请各位大佬帮忙看看主函数哪里有错 谢谢
//#include <STC8Hxxx.h>
#include <STC8H.h>
#include <intrins.h>
#include "uart1.h"
#include <stdio.h>
#define fosc1 11059200
#define VREF_ADDR (*(unsigned int volatile xdata *)(0xfde7))
int *BGVROM; //ROM,RAM
int *BGVRAM;
sbitLowBat_Lamp = P1^0; //红色led,欠压报警灯
//sbitVcc_Lamp = P5^4; //绿色led,电源指示灯
/************* 本地函数声明 **************/
void delay_ms(u16 ms);
void Portmode();
/**********************************************/
void main(void)
{
u16 cnt =0; //设置变量在主函数后
Portmode();
P1M0 = 0x05; P1M1 = 0x87; //P1.0、1.2开漏, P1.1、1.7高阻ADC, p1.3~6准双向
P5M0 = 0x10; P5M1 = 0x10; //p5.4开漏
BGVROM = (int code*)0xfdf7; //ROM 1.19VSTC8H3K64S2
BGVRAM = (int idata*)0xef; //RAM 1.19VSTC8H3K64S2
EA = 1;
ES = 1;
P_SW2 |= 0x80; //使能访问XFR
Uart1_Init();
while (1)
{
Uart1_Send('R'); //无读数 不正确
Uart1_Send('O');
Uart1_Send('M');
Uart1_Send('=');
Uart1_Send (*BGVROM >>8); //ROM /RAM 读1.19V
Uart1_Send (*BGVROM);
Uart1_Send('\r');
Uart1_Send('\n');
Uart1_Send('R'); //无读数不正确
Uart1_Send('A');
Uart1_Send('M');
Uart1_Send('=');
Uart1_Send (*BGVRAM >>8); //ROM /RAM 读1.19V
Uart1_Send (*BGVRAM);
Uart1_Send('\r');
Uart1_Send('\n');
Uart1_Send('H');
Uart1_Send('A');
Uart1_Send('P');
Uart1_Send('P');
Uart1_Send('Y');
Uart1_Send('\r');
Uart1_Send('\n');
Uart1_SendString("我们就要飞啰\r\n");
printf("BGVROM开始= %u\n",*BGVROM); //读数不正确 显示65535
printf("BGVRAM开始= %u\n",*BGVRAM); //读数正确 显示1185
Uart1_Send(VREF_ADDR>>8); //不正确 CHIPID 读数显示 }}
Uart1_Send(VREF_ADDR);
Uart1_Send('\r');
Uart1_Send('\n');
printf("CHIPID开始= %u\n",VREF_ADDR); //不正确 CHIPID显示32125
printf("计时开始= %u\n",cnt);
cnt++;if(cnt>1000) cnt=0;
delay_ms(2000);
LowBat_Lamp =~ LowBat_Lamp;
}
}
void Portmode() //端口设置
{
P1M0 = 0x00; P1M1 = 0x00;
P3M0 = 0X00; P3M1 = 0X00;
P5M0 = 0x00; P5M1 = 0x00;
}
voiddelay_ms(u16 ms)
{
u16 i;
do
{
i =fosc1 / 10000;
while(--i) ;
}while(--ms);
}
STC8H3K64S2没有CHIPID寄存器
页:
1
[2]