这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » CHIPID应用,STC32只读特殊功能寄存器中存储的十种高速时钟和唯一ID号等

共3条 1/1 1 跳转至

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

助工
2023-04-20 09:00:11     打赏

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

image.png


STC32G系列单片机内部的只读特殊功能寄存器CHIPID中保存有与芯片相关的一些特殊参数,包括:全球唯一ID号、32K掉电唤醒定时器的频率、内部1.19V参考信号源值(BGV)以及IRC参数。在用户程序中只能读取CHIPID中的内容,不可修改。使用CHIPID中的数据对用户程序进行加密是STC官方推荐的最优方案。


相关寄存器

image.png

image.png

image.png

9.3.1    CHIP之全球唯一ID号解读

image.png

[CHIPID0, CHIPID1]:16位MCU ID,用于区别不同的单片机型号(高位在前)。[CHIPID2, CHIPID3]:16位测试机台编号(高位在前)。[CHIPID4, CHIPID5, CHIPID6]:24位测试流水编号(高位在前)。

9.3.2    CHIP之内部参考信号源解读

image.png

[CHIPID7, CHIPID8]:16位内部参考信号源电压值(高位在前)。

标准值为1190(04A6H),单位为mV,即1.19V。但实际的芯片由于存在制造误差。内部参考信号源的电压值并不会受工作电压VCC的影响,所以内部参考信号源可以和ADC结合用于校准ADC,也可和比较器结合用于侦测工作电压。

9.3.3   CHIP之内部32KIRC振荡频率解读

image.png

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

9.3.4    CHIP之高精度IRC参数解读

image.png

支持CHIPID功能的STC32G系列单片机,内部集成的高精度IRC分4个频段,每个频段对应的参考电压值在出厂时已进行了校准,当选择不同的频段时,只需要将相应频段的电压校准值填入VRTRIM寄存器即可。4个频段的中心频率分别为6MHz、10MHz、27MHz和44MHz,由于制造误差,中心频率一般可能有±5%的偏差,为了得到精确的用户频率,可使用IRTRIM对频率进行微调校准。使用STC官方提供的下载软件下载用户程序时,系统会根据用户所设定频率自动设置VRTRIM和IRTRIM寄存器。同时,在CHIPID也内部预置了10个常用频率的IRTRIM值以及4个频段的参考电压值校准值,让用户可以在程序运行过程中动态的修改工作频率。[CHIPID11 : CHIPID20]:10个常用频率的IRTRIM值。括号里面的注解即为对应的频段[CHIPID21 : CHIPID24]:4个频段的参考电压值校准值。用户动态修改频率时,只需要将[CHIPID11 : CHIPID20]中的某个频率校准值读出并写入IRTRIM寄存器,同时根据该频率所对应的频段将[CHIPID21 : CHIPID24]中的某个电压校准值读出并写入VRTRIM寄存器即可。详细操作请参考后续章节的范例程序。

9.3.5    CHIP之测试时间参数解读

image.png

测试时间的年、月、日参数均为BCD码。(例如:CHIPID27=0x21,CHIPID28=0x11,CHIPID29=0x18,则目标芯片的生产测试日期为2021年11月18日)

9.3.6    CHIP之芯片封装形式编号解读

image.png

image.png





关键词: CHIPID应用          STC32    

助工
2023-04-20 09:03:57     打赏
2楼

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


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


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


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-04-20 09:06:29     打赏
3楼

学习了,很实用,谢谢



共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]