亚洲春色中文字幕久久久-三上亚,91精品国产亚一区二区三区,久久久九色综合亚洲成色777,涩涩视频下载,国产午夜亚洲精品午夜鲁丝片,国产精品A一区二区三区腾讯导航,影音先锋色情AV在线看片,蜜臀国产在线视频,极品少妇高潮啪啪无码吴梦梦 ,精品人妻无码一区二区三区手机版

標(biāo)題: STC單片機(jī)唯一的序列號MCU ID號讀取程序-模擬串口通訊示例 - GetMCUID [打印本頁]

作者: 愛51hei    時(shí)間: 2015-10-29 12:54
標(biāo)題: STC單片機(jī)唯一的序列號MCU ID號讀取程序-模擬串口通訊示例 - GetMCUID
STC MCU都具有唯一的MCU ID號,一般保存在RAM的0xF1-F7區(qū)域,對于15系列,同時(shí)會保存在ROM的最后7個(gè)字節(jié)中。因此,可以通過字符指針,獲取MCU ID值,用于程序的加密。

// 讀取 STCMCU 的唯一性ID的例程
#define ID_ADDR_RAM 0xF1        //ID號的存放在RAM區(qū)的地址為0F1H
#define ID_ADDR_ROM 0x0FF9      //4K程序空間的MCU(如STC15F204EA, STC15F104EA)
unsigned char UID[8];
#define RAMID 0
#define ROMID 1
char *GetMCUID(unsigned char nType);

 //獲取 MCU ID.
char *GetMCUID(unsigned char nType)
{
    unsigned char idata *iptr;
    unsigned char code *cptr;
    unsigned char i;
    unsigned char bb[8];
   
    if (nType == RAMID) {
        iptr = ID_ADDR_RAM;         //從RAM區(qū)讀取ID號
        for (i=0; i<7; i++) {       //讀7個(gè)字節(jié)
            UID[i] =*iptr++;      
            sprintf(bb, "%02x",(int)UID[i]); //***在 Keil C51中,如果想得到正確的2字符十六進(jìn)制數(shù)輸出,必須使用(int)形式做轉(zhuǎn)換。
            SendStr(bb);
        }
    }
    else {
        cptr = ID_ADDR_ROM;         //從程序區(qū)讀取ID號
        for (i=0; i<7; i++) {       //讀7個(gè)字節(jié)
            UID[i] =*cptr++; 
            sprintf(bb, "%02X",(int)UID[i]);
            SendStr(bb);
        }
    }
    UID[7]=0;
   
    return UID;
}
實(shí)際運(yùn)行的結(jié)果如下:

可以看出,RAMID都是0,但是ROM ID 是正確的。
目前的疑問是:RAM無法讀取,獲得的數(shù)據(jù)會發(fā)生變化。ROM區(qū)則讀取正確穩(wěn)定。程序使用 Keil C51 V954a 編譯,采用小內(nèi)存模式。問題原因未找到。
Program Size: data=100.6 xdata=0 code=2397 
 
查看該程序的M51鏈接內(nèi)存配置文件,可以看到內(nèi)存分配如下:
 TYPE    BASE      LENGTH    RELOCATION   SEGMENT NAME
            -----------------------------------------------------
            * * * * * * *   D A T A   M E M O R Y   * * * * * * *
            REG     0000H     0008H     ABSOLUTE     "REG BANK 0"
                    0008H     0018H                  *** GAP ***
            BIT     0020H.0   0001H.1   UNIT         _BIT_GROUP_
            BIT     0021H.1   0000H.5   UNIT         ?BI?STCUARTDEMO
                    0021H.6   0000H.2                *** GAP ***
            DATA    0022H     0038H     UNIT         _DATA_GROUP_
            DATA    005AH     0022H     UNIT         ?DT?STCUARTDEMO
            IDATA   007CH     0001H     UNIT         ?STACK 
目前最大的懷疑是Timer0ISR用作模擬串口,在使用時(shí)多次中斷,導(dǎo)致堆棧增長損壞了idata區(qū)域。STC15F204EA的堆棧是向上增長的,以便初始化的棧底值最小,使用PUSH指令增加一些 數(shù)據(jù)存儲時(shí),SP的值會增大。這樣可能導(dǎo)致IDATA的數(shù)據(jù)區(qū)0xF1-0xF7(MCUID)區(qū)被破壞。但因?yàn)闊o法實(shí)際做在線仿真,不能驗(yàn)證此原因。

作者: ahshmj    時(shí)間: 2015-10-30 17:01
RAM掉電不就沒有了嗎?
作者: cryophysics    時(shí)間: 2019-5-9 03:57
ahshmj 發(fā)表于 2015-10-30 17:01
RAM掉電不就沒有了嗎?

上電冷啟動(dòng)由ISP固件寫入的
作者: cryophysics    時(shí)間: 2019-5-9 03:59
固件版本6.6.4C的單片機(jī)RAM ID可讀,6.6C版本的讀出來都是0
作者: Ty78619120    時(shí)間: 2019-11-20 14:11
您好,我大致按著你的這個(gè)例子,在sprintf這里的時(shí)候,不知道為什么輸出的都是錯(cuò)的,還有你的UID【7】=0是什么意思呢
作者: 創(chuàng)造生活    時(shí)間: 2021-11-16 15:34
cryophysics 發(fā)表于 2019-5-9 03:59
固件版本6.6.4C的單片機(jī)RAM ID可讀,6.6C版本的讀出來都是0

請問大神這個(gè)單片機(jī)的固件版本號是怎么看出來的呀




歡迎光臨 (http://www.denmoz.com/bbs/) Powered by Discuz! X3.1