神农鼎 发表于 2023-4-19 15:13:51

CHIPID应用,STC32只读特殊功能寄存器中存储的十种高速时钟和唯一ID号等重要参数

STC32系列CHIPID只读寄存器应用,设置内部十种常用高速HIRC频率
STC32G12K128, STC32G8K64出厂前用专业时钟调校设备,调校的如下10种常用高精准内部HIRC频率
【22.1184MHz, 24MHz, 27MHz, 30MHz, 33.1776MHz, 35MHz, 36.864MHz, 40MHz, 44.2368MHz, 48MHz】
在用户程序区用户自己选择设置如上STC出厂前调校的这10种内部高精准的HIRC的频率
===常温下STC出厂前用专业的高精准设备调校的这10个固定频率时钟误差 < + - 0.3%
===没有压飘,【-40度 ~ +85度,只有+-1%附近的温漂】,【125度时温漂在 + -2.5%,这时请使用外部耐高温晶振】
而如用户使用在ISP烧录时任意设置的频率,虽然范围很宽很灵活,但如用户使用第三方不专业的USB转串口来烧录,
来校准成其他的频率,这有可能会将第三方不专业工具的时钟误差,在用户ISP下载时重新校准频率而带入芯片内部
即使用户要设置特殊的频率,也请使用 STC的专业工具 STC-USB Link1D
===用STC-ISP下载时设置任意频率, 请使用STC-USB Link1D来校准内部高精准HIRC的频率,
===这个STC-USB Link1D 专业工具专门外挂了22.1184MHz晶振来ISP下载时校准内部时钟到任意频率
===STC-USB Link1D是【专业仿真器,专业在线全自动下载器/无需手工停电,专业脱机烧录器,专业时钟校准器】
这是超级重点,不要那么强大的内部时钟不会自己在程序区自己任意设置

9.3 只读特殊功能寄存器中存储的唯一ID号和重要参数(CHIPID)


产品线CHIPID
STC32G12K128系列●
STC32G8K64系列●
STC32F12K60系列●

STC32G系列单片机内部的只读特殊功能寄存器CHIPID中保存有与芯片相关的一些特殊参数,包括:全球唯一ID号、32K掉电唤醒定时器的频率、内部1.19V参考信号源值(BGV)以及IRC参数。在用户程序中只能读取CHIPID中的内容,不可修改。使用CHIPID中的数据对用户程序进行加密是STC官方推荐的最优方案。
相关寄存器
符号描述地址位地址与符号复位值
B7B6B5B4B3B2B1B0
CHIPID0硬件数字ID007EFDE0H全球唯一ID号(第0字节)nnnn,nnnn
CHIPID1硬件数字ID017EFDE1H全球唯一ID号(第1字节)nnnn,nnnn
CHIPID2硬件数字ID027EFDE2H全球唯一ID号(第2字节)nnnn,nnnn
CHIPID3硬件数字ID037EFDE3H全球唯一ID号(第3字节)nnnn,nnnn
CHIPID4硬件数字ID047EFDE4H全球唯一ID号(第4字节)nnnn,nnnn
CHIPID5硬件数字ID057EFDE5H全球唯一ID号(第5字节)nnnn,nnnn
CHIPID6硬件数字ID067EFDE6H全球唯一ID号(第6字节)nnnn,nnnn
CHIPID7硬件数字ID077EFDE7H内部1.19V参考信号源-BGV(高字节)nnnn,nnnn
CHIPID8硬件数字ID087EFDE8H内部1.19V参考信号源-BGV(低字节)nnnn,nnnn
CHIPID9硬件数字ID097EFDE9H32K掉电唤醒定时器的频率(高字节)nnnn,nnnn
CHIPID10硬件数字ID107EFDEAH32K掉电唤醒定时器的频率(低字节)nnnn,nnnn
CHIPID11硬件数字ID117EFDEBH22.1184MHz的IRC参数(27M频段)nnnn,nnnn
CHIPID12硬件数字ID127EFDECH24MHz的IRC参数(27M频段)nnnn,nnnn
CHIPID13硬件数字ID137EFDEDH27MHz的IRC参数(27M频段)nnnn,nnnn
CHIPID14硬件数字ID147EFDEEH30MHz的IRC参数(27M频段)nnnn,nnnn
CHIPID15硬件数字ID157EFDEFH33.1776MHz的IRC参数(27M频段)nnnn,nnnn
CHIPID16硬件数字ID167EFDF0H35MHz的IRC参数(44M频段)nnnn,nnnn
CHIPID17硬件数字ID177EFDF1H36.864MHz的IRC参数(44M频段)nnnn,nnnn
CHIPID18硬件数字ID187EFDF2H40MHz的IRC参数(44M频段)nnnn,nnnn
CHIPID19硬件数字ID197EFDF3H44.2368MHz的IRC参数(44M频段)nnnn,nnnn
CHIPID20硬件数字ID207EFDF4H48MHz的IRC参数(44M频段)nnnn,nnnn
CHIPID21硬件数字ID217EFDF5H6M频段的VRTRIM参数nnnn,nnnn
CHIPID22硬件数字ID227EFDF6H10M频段的VRTRIM参数nnnn,nnnn
CHIPID23硬件数字ID237EFDF7H27M频段的VRTRIM参数nnnn,nnnn
CHIPID24硬件数字ID247EFDF8H44M频段的VRTRIM参数nnnn,nnnn
CHIPID25硬件数字ID257EFDF9H00Hnnnn,nnnn
CHIPID26硬件数字ID267EFDFAH用户程序空间结束地址(高字节)nnnn,nnnn
CHIPID27硬件数字ID277EFDFBH芯片测试时间(年)nnnn,nnnn
CHIPID28硬件数字ID287EFDFCH芯片测试时间(月)nnnn,nnnn
CHIPID29硬件数字ID297EFDFDH芯片测试时间(日)nnnn,nnnn
CHIPID30硬件数字ID307EFDFEH芯片封装形式编号nnnn,nnnn
CHIPID31硬件数字ID317EFDFFH5AHnnnn,nnnn


9.3.1    CHIP之全球唯一ID号解读
符号描述地址位地址与符号复位值
B7B6B5B4B3B2B1B0
CHIPID0硬件数字ID007EFDE0H全球唯一ID号(第0字节)nnnn,nnnn
CHIPID1硬件数字ID017EFDE1H全球唯一ID号(第1字节)nnnn,nnnn
CHIPID2硬件数字ID027EFDE2H全球唯一ID号(第2字节)nnnn,nnnn
CHIPID3硬件数字ID037EFDE3H全球唯一ID号(第3字节)nnnn,nnnn
CHIPID4硬件数字ID047EFDE4H全球唯一ID号(第4字节)nnnn,nnnn
CHIPID5硬件数字ID057EFDE5H全球唯一ID号(第5字节)nnnn,nnnn
CHIPID6硬件数字ID067EFDE6H全球唯一ID号(第6字节)nnnn,nnnn

:16位MCU ID,用于区别不同的单片机型号(高位在前)。:16位测试机台编号(高位在前)。:24位测试流水编号(高位在前)。
9.3.2    CHIP之内部参考信号源解读
符号描述地址位地址与符号复位值
B7B6B5B4B3B2B1B0
CHIPID7硬件数字ID077EFDE7H内部1.19V参考信号源-BGV(高字节)nnnn,nnnn
CHIPID8硬件数字ID087EFDE8H内部1.19V参考信号源-BGV(低字节)nnnn,nnnn

:16位内部参考信号源电压值(高位在前)。标准值为1190(04A6H),单位为mV,即1.19V。但实际的芯片由于存在制造误差。内部参考信号源的电压值并不会受工作电压VCC的影响,所以内部参考信号源可以和ADC结合用于校准ADC,也可和比较器结合用于侦测工作电压。
9.3.3   CHIP之内部32K的IRC振荡频率解读
符号描述地址位地址与符号复位值
B7B6B5B4B3B2B1B0
CHIPID9硬件数字ID097EFDE9H32K掉电唤醒定时器的频率(高字节)nnnn,nnnn
CHIPID10硬件数字ID107EFDEAH32K掉电唤醒定时器的频率(低字节)nnnn,nnnn

:16位32K IRC振荡器频率值(高位在前)。标准值为32768(8000H),单位为Hz,即32.768KHz。但实际的芯片由于存在制造误差,而且温漂和压漂均比较大。内部32K振荡器的压漂测试线性图和温漂线性图如下:


9.3.4    CHIP之高精度IRC参数解读

符号描述地址位地址与符号复位值
B7B6B5B4B3B2B1B0
CHIPID11硬件数字ID117EFDEBH22.1184MHz的IRC参数(27M频段)nnnn,nnnn
CHIPID12硬件数字ID127EFDECH24MHz的IRC参数(27M频段)nnnn,nnnn
CHIPID13硬件数字ID137EFDEDH27MHz的IRC参数(27M频段)nnnn,nnnn
CHIPID14硬件数字ID147EFDEEH30MHz的IRC参数(27M频段)nnnn,nnnn
CHIPID15硬件数字ID157EFDEFH33.1776MHz的IRC参数(27M频段)nnnn,nnnn
CHIPID16硬件数字ID167EFDF0H35MHz的IRC参数(44M频段)nnnn,nnnn
CHIPID17硬件数字ID177EFDF1H36.864MHz的IRC参数(44M频段)nnnn,nnnn
CHIPID18硬件数字ID187EFDF2H40MHz的IRC参数(44M频段)nnnn,nnnn
CHIPID19硬件数字ID197EFDF3H44.2368MHz的IRC参数(44M频段)nnnn,nnnn
CHIPID20硬件数字ID207EFDF4H48MHz的IRC参数(44M频段)nnnn,nnnn
CHIPID21硬件数字ID217EFDF5H6M频段的VRTRIM参数nnnn,nnnn
CHIPID22硬件数字ID227EFDF6H10M频段的VRTRIM参数nnnn,nnnn
CHIPID23硬件数字ID237EFDF7H27M频段的VRTRIM参数nnnn,nnnn
CHIPID24硬件数字ID247EFDF8H44M频段的VRTRIM参数nnnn,nnnn
支持CHIPID功能的STC32G系列单片机,内部集成的高精度IRC分4个频段,每个频段对应的参考电压值在出厂时已进行了校准,当选择不同的频段时,只需要将相应频段的电压校准值填入VRTRIM寄存器即可。4个频段的中心频率分别为6MHz、10MHz、27MHz和44MHz,由于制造误差,中心频率一般可能有±5%的偏差,为了得到精确的用户频率,可使用IRTRIM对频率进行微调校准。使用STC官方提供的下载软件下载用户程序时,系统会根据用户所设定频率自动设置VRTRIM和IRTRIM寄存器。同时,在CHIPID也内部预置了10个常用频率的IRTRIM值以及4个频段的参考电压值校准值,让用户可以在程序运行过程中动态的修改工作频率。:10个常用频率的IRTRIM值。括号里面的注解即为对应的频段:4个频段的参考电压值校准值。用户动态修改频率时,只需要将中的某个频率校准值读出并写入IRTRIM寄存器,同时根据该频率所对应的频段将中的某个电压校准值读出并写入VRTRIM寄存器即可。详细操作请参考后续章节的范例程序。
9.3.5    CHIP之测试时间参数解读
符号描述地址位地址与符号复位值
B7B6B5B4B3B2B1B0
CHIPID27硬件数字ID277EFDFBH芯片测试时间(年)nnnn,nnnn
CHIPID28硬件数字ID287EFDFCH芯片测试时间(月)nnnn,nnnn
CHIPID29硬件数字ID297EFDFDH芯片测试时间(日)nnnn,nnnn

测试时间的年、月、日参数均为BCD码。(例如:CHIPID27=0x21,CHIPID28=0x11,CHIPID29=0x18,则目标芯片的生产测试日期为2021年11月18日)
9.3.6    CHIP之芯片封装形式编号解读
符号描述地址位地址与符号复位值
B7B6B5B4B3B2B1B0
CHIPID30硬件数字ID307EFDFEH芯片封装形式编号nnnn,nnnn



封装编号封装形式 封装编号封装形式
0x00DIP8 0x50SOP32
0x01SOP8 0x51LQFP32
0x02DFN8 0x52QFN32
0x10DIP16 0x53PLCC32
0x11SOP16 0x54QFN32S
0x20DIP18 0x60PDIP40
0x21SOP18 0x70LQFP44
0x30DIP20 0x71PLCC44
0x31SOP20 0x72PQFP44
0x32TSSOP20 0x80LQFP48
0x33LSSOP20 0x81QFN48
0x34QFN20 0x90LQFP64
0x40SKDIP28 0x91LQFP64S
0x41SOP28 0x92LQFP64L
0x42TSSOP28 0x93LQFP64M
0x43QFN28 0x94QFN64


神农鼎 发表于 2023-4-19 15:20:06

9.4    范例程序
9.4.4   用户在自己的用户程序区自己设置内部高速HIRC的频率,
            可动态切换十种STC出厂前就帮用户校准好的频率
//测试工作频率为11.0592MHz

//#include "stc8h.h"
#include "stc32g.h"                        //头文件见下载软件
#include "intrins.h"

#define      T22M_ADDR                CHIPID11      //22.1184MHz
#define      T24M_ADDR                CHIPID12      //24MHz
#define      T27M_ADDR                CHIPID13      //27MHz
#define      T30M_ADDR                CHIPID14      //30MHz
#define      T33M_ADDR                CHIPID15      //33.1776MHz
#define      T35M_ADDR                CHIPID16      //35MHz
#define      T36M_ADDR                CHIPID17      //36.864MHz
#define      T40M_ADDR                CHIPID18      //40MHz
#define      T44M_ADDR                CHIPID19      //44.2368MHz
#define      T48M_ADDR                CHIPID20      //48MHz
#define      VRT6M_ADDR            CHIPID21      //VRTRIM_6M
#define      VRT10M_ADDR            CHIPID22      //VRTRIM_10M
#define      VRT27M_ADDR            CHIPID23      //VRTRIM_27M
#define      VRT44M_ADDR            CHIPID24      //VRTRIM_44M

void main()
{
      EAXFR = 1;      //使能访问XFR
      CKCON = 0x00;      //设置外部数据总线速度为最快
      WTST = 0x00;         //设置程序代码等待参数,
                        //赋值为0可将CPU执行程序的速度设置为最快

      P0M0 = 0x00;
      P0M1 = 0x00;
      P1M0 = 0x00;
      P1M1 = 0x00;
      P2M0 = 0x00;
      P2M1 = 0x00;
      P3M0 = 0x00;
      P3M1 = 0x00;
      P4M0 = 0x00;
      P4M1 = 0x00;
      P5M0 = 0x00;
      P5M1 = 0x00;

//      //选择22.1184MHz
//      CLKDIV = 0x04;
//      IRTRIM = T22M_ADDR;
//      VRTRIM = VRT27M_ADDR;
//      IRCBAND &= ~0x03;
//      IRCBAND |= 0x02;
//      CLKDIV = 0x00;

      //选择24MHz
      CLKDIV = 0x04;
      IRTRIM = T24M_ADDR;
      VRTRIM = VRT27M_ADDR;
      IRCBAND &= ~0x03;
      IRCBAND |= 0x02;
      CLKDIV = 0x00;

//      //选择27MHz
//      CLKDIV = 0x04;
//      IRTRIM = T27M_ADDR;
//      VRTRIM = VRT27M_ADDR;
//      IRCBAND &= ~0x03;
//      IRCBAND |= 0x02;
//      CLKDIV = 0x00;

//      //选择30MHz
//      CLKDIV = 0x04;
//      IRTRIM = T30M_ADDR;
//      VRTRIM = VRT27M_ADDR;
//      IRCBAND &= ~0x03;
//      IRCBAND |= 0x02;
//      CLKDIV = 0x00;

//      //选择33.1776MHz
//      CLKDIV = 0x04;
//      IRTRIM = T33M_ADDR;
//      VRTRIM = VRT27M_ADDR;
//      IRCBAND &= ~0x03;
//      IRCBAND |= 0x02;
//      CLKDIV = 0x00;

//      //选择35MHz
//      CLKDIV = 0x04;
//      IRTRIM = T35M_ADDR;
//      VRTRIM = VRT44M_ADDR;
//      IRCBAND |= 0x03;
//      CLKDIV = 0x00;

//      //选择44.2368MHz
//      CLKDIV = 0x04;
//      IRTRIM = T44M_ADDR;
//      VRTRIM = VRT44M_ADDR;
//      IRCBAND |= 0x03;
//      CLKDIV = 0x00;

//      //选择48MHz
//      CLKDIV = 0x04;
//      IRTRIM = T48M_ADDR;
//      VRTRIM = VRT44M_ADDR;
//      IRCBAND |= 0x03;
//      CLKDIV = 0x00;

      while (1);
}

神农鼎 发表于 2023-4-19 15:18:30

9.4   范例程序
9.4.1   读取内部1.19V参考信号源值(BGV)
//测试工作频率为11.0592MHz

//#include "stc8h.h"
#include "stc32g.h"                        //头文件见下载软件
#include "intrins.h"

#define      FOSC      11059200UL      //定义为无符号长整型,避免计算溢出
#define      BRT      (65536 - (FOSC / 115200+2) / 4)
                              //加2操作是为了让Keil编译器
                              //自动实现四舍五入运算

#define      VREFH_ADDR                CHIPID7
#define      VREFL_ADDR                CHIPID8

bit      busy;

void UartIsr() interrupt 4
{
      if (TI)
      {
                TI = 0;
                busy = 0;
      }
      if (RI)
      {
                RI = 0;
      }
}

void UartInit()
{
      SCON = 0x50;
      TMOD = 0x00;
      TL1 = BRT;
      TH1 = BRT >> 8;
      TR1 = 1;
      T1x12 = 1;
      busy = 0;
}

void UartSend(char dat)
{
      while (busy);
      busy = 1;
      SBUF = dat;
}

void main()
{
      EAXFR = 1;      //使能访问XFR
      CKCON = 0x00;      //设置外部数据总线速度为最快
      WTST = 0x00;         //设置程序代码等待参数,
                        //赋值为0可将CPU执行程序的速度设置为最快

      P0M0 = 0x00;
      P0M1 = 0x00;
      P1M0 = 0x00;
      P1M1 = 0x00;
      P2M0 = 0x00;
      P2M1 = 0x00;
      P3M0 = 0x00;
      P3M1 = 0x00;
      P4M0 = 0x00;
      P4M1 = 0x00;
      P5M0 = 0x00;
      P5M1 = 0x00;

      UartInit();
      ES = 1;
      EA = 1;
      UartSend(VREF_ADDRH);      //读取内部1.19V参考信号源的高字节
      UartSend(VREF_ADDRL);      //读取内部1.19V参考信号源的低字节
      
      while (1);
}

神农鼎 发表于 2023-4-19 15:19:10

9.4   范例程序
9.4.2读取全球唯一ID号
//测试工作频率为11.0592MHz

//#include "stc8h.h"
#include "stc32g.h"                        //头文件见下载软件
#include "intrins.h"

#define      FOSC      11059200UL      //定义为无符号长整型,避免计算溢出
#define      BRT      (65536 - (FOSC / 115200+2) / 4)
                              //加2操作是为了让Keil编译器
                              //自动实现四舍五入运算

#define      ID_ADDR                (&CHIPID0)

bit      busy;

void UartIsr() interrupt 4
{
      if (TI)
      {
                TI = 0;
                busy = 0;
      }
      if (RI)
      {
                RI = 0;
      }
}

void UartInit()
{
      SCON = 0x50;
      TMOD = 0x00;
      TL1 = BRT;
      TH1 = BRT >> 8;
      TR1 = 1;
      T1x12 = 1;
      busy = 0;
}

void UartSend(char dat)
{
      while (busy);
      busy = 1;
      SBUF = dat;
}

void main()
{
      char i;

      EAXFR = 1;      //使能访问XFR
      CKCON = 0x00;      //设置外部数据总线速度为最快
      WTST = 0x00;         //设置程序代码等待参数,
                        //赋值为0可将CPU执行程序的速度设置为最快

      P0M0 = 0x00;
      P0M1 = 0x00;
      P1M0 = 0x00;
      P1M1 = 0x00;
      P2M0 = 0x00;
      P2M1 = 0x00;
      P3M0 = 0x00;
      P3M1 = 0x00;
      P4M0 = 0x00;
      P4M1 = 0x00;
      P5M0 = 0x00;
      P5M1 = 0x00;

      UartInit();
      ES = 1;
      EA = 1;

      for (i=0; i<7; i++)
      {
                UartSend(ID_ADDR);
      }
      
      while (1);
}


神农鼎 发表于 2023-4-19 15:19:36

9.4   范例程序
9.4.3   读取32K掉电唤醒定时器的频率
//测试工作频率为11.0592MHz

//#include "stc8h.h"
#include "stc32g.h"                        //头文件见下载软件
#include "intrins.h"

#define      FOSC      11059200UL      //定义为无符号长整型,避免计算溢出
#define      BRT      (65536 - (FOSC / 115200+2) / 4)
                              //加2操作是为了让Keil编译器
                              //自动实现四舍五入运算

#define      F32K_ADDRH                CHIPID9
#define      F32K_ADDRL                CHIPID10

bit      busy;

void UartIsr() interrupt 4
{
      if (TI)
      {
                TI = 0;
                busy = 0;
      }
      if (RI)
      {
                RI = 0;
      }
}

void UartInit()
{
      SCON = 0x50;
      TMOD = 0x00;
      TL1 = BRT;
      TH1 = BRT >> 8;
      TR1 = 1;
      T1x12 = 1;
      busy = 0;
}

void UartSend(char dat)
{
      while (busy);
      busy = 1;
      SBUF = dat;
}

void main()
{
      EAXFR = 1;      //使能访问XFR
      CKCON = 0x00;      //设置外部数据总线速度为最快
      WTST = 0x00;         //设置程序代码等待参数,
                        //赋值为0可将CPU执行程序的速度设置为最快

      P0M0 = 0x00;
      P0M1 = 0x00;
      P1M0 = 0x00;
      P1M1 = 0x00;
      P2M0 = 0x00;
      P2M1 = 0x00;
      P3M0 = 0x00;
      P3M1 = 0x00;
      P4M0 = 0x00;
      P4M1 = 0x00;
      P5M0 = 0x00;
      P5M1 = 0x00;

      UartInit();
      ES = 1;
      EA = 1;

      UartSend(F32K_ADDRH);      //读取32K频率的高字节
      UartSend(F32K_ADDRL);      //读取32K频率的低字节
      
      while (1);
}


国学芯用 发表于 2023-10-23 15:38:19

GYChase 发表于 2024-11-26 13:08:33

我读取CHIPID31的值为0x5B,不是0x5A.我是买到假的了吗?
页: [1]
查看完整版本: CHIPID应用,STC32只读特殊功能寄存器中存储的十种高速时钟和唯一ID号等重要参数