32位8051 发表于 2023-3-29 14:32:30

jwd 发表于 2023-3-29 13:40
请问,我上面用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

jwd 发表于 2023-3-30 09:17:20

STC32位8051芯片 发表于 2023-3-29 14:32
对照范例看下呢

你好,我测试了,地址是0xfdf7值才对,地址是0xfef7值不对,STC-ISP例程里面地址是对的

乘风飞扬 发表于 2023-3-30 09:19:16

STC8A8K64D4内部参数从多个位置都能读取,以下是保存在Flash空间的地址,
可以通过 BGV = (int code *)0xfdf7; 的方式指向Flash区域进行读取。


此外还可以从CHIPID寄存器里读取(推荐)
CHIPID是扩展寄存器,从这里读取应该使用访问扩展寄存器的方法,而不能再用读取Flash空间的方法
#define USBCHIPID
#define CPUIDBASE   0xfde0
#define VREF_ADDR   (*(unsigned int volatile xdata *)(CPUIDBASE + 0x07))

使用不同的方法应参考对应的例程,不能单纯只修改一下地址。

jwd 发表于 2023-3-30 10:40:40

乘风飞扬 发表于 2023-3-30 09:19
STC8A8K64D4内部参数从多个位置都能读取,以下是保存在Flash空间的地址,
可以通过 BGV = (int code *)0xfd ...

我应该找到原因了,谢谢!应该是缺少P_SW2=0x80;这条语句导致的,不过我还有2点疑问,1、为什么地址和直接ROM读取的地址不同?2、既然CHIPID是只读的,为什么还要用volatile修饰 ?

jwd 发表于 2023-3-30 11:11:38

神农鼎 发表于 2023-3-27 21:50


谢谢,我找到问题了,程序缺少PSW2=0x80;的语句

山顶任风吹 发表于 2024-6-24 19:01:11

本帖最后由 山顶任风吹 于 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);
}

神农鼎 发表于 2024-6-24 19:48:30

STC8H3K64S2没有CHIPID寄存器













页: 1 [2]
查看完整版本: 请问STC8A8K64D4的内部1.19V的地址是多少?