久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 21060|回復: 5
打印 上一主題 下一主題
收起左側

STC單片機唯一的序列號MCU ID號讀取程序-模擬串口通訊示例 - GetMCUID

[復制鏈接]
跳轉到指定樓層
樓主
ID:91442 發表于 2015-10-29 12:54 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
STC MCU都具有唯一的MCU ID號,一般保存在RAM的0xF1-F7區域,對于15系列,同時會保存在ROM的最后7個字節中。因此,可以通過字符指針,獲取MCU ID值,用于程序的加密。

// 讀取 STCMCU 的唯一性ID的例程
#define ID_ADDR_RAM 0xF1        //ID號的存放在RAM區的地址為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區讀取ID號
        for (i=0; i<7; i++) {       //讀7個字節
            UID[i] =*iptr++;      
            sprintf(bb, "%02x",(int)UID[i]); //***在 Keil C51中,如果想得到正確的2字符十六進制數輸出,必須使用(int)形式做轉換。
            SendStr(bb);
        }
    }
    else {
        cptr = ID_ADDR_ROM;         //從程序區讀取ID號
        for (i=0; i<7; i++) {       //讀7個字節
            UID[i] =*cptr++; 
            sprintf(bb, "%02X",(int)UID[i]);
            SendStr(bb);
        }
    }
    UID[7]=0;
   
    return UID;
}
實際運行的結果如下:

可以看出,RAMID都是0,但是ROM ID 是正確的。
目前的疑問是:RAM無法讀取,獲得的數據會發生變化。ROM區則讀取正確穩定。程序使用 Keil C51 V954a 編譯,采用小內存模式。問題原因未找到。
Program Size: data=100.6 xdata=0 code=2397 
 
查看該程序的M51鏈接內存配置文件,可以看到內存分配如下:
 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用作模擬串口,在使用時多次中斷,導致堆棧增長損壞了idata區域。STC15F204EA的堆棧是向上增長的,以便初始化的棧底值最小,使用PUSH指令增加一些 數據存儲時,SP的值會增大。這樣可能導致IDATA的數據區0xF1-0xF7(MCUID)區被破壞。但因為無法實際做在線仿真,不能驗證此原因。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:7485 發表于 2015-10-30 17:01 | 只看該作者
RAM掉電不就沒有了嗎?
回復

使用道具 舉報

板凳
ID:104984 發表于 2019-5-9 03:57 | 只看該作者
ahshmj 發表于 2015-10-30 17:01
RAM掉電不就沒有了嗎?

上電冷啟動由ISP固件寫入的
回復

使用道具 舉報

地板
ID:104984 發表于 2019-5-9 03:59 | 只看該作者
固件版本6.6.4C的單片機RAM ID可讀,6.6C版本的讀出來都是0
回復

使用道具 舉報

5#
ID:475845 發表于 2019-11-20 14:11 | 只看該作者
您好,我大致按著你的這個例子,在sprintf這里的時候,不知道為什么輸出的都是錯的,還有你的UID【7】=0是什么意思呢
回復

使用道具 舉報

6#
ID:881715 發表于 2021-11-16 15:34 | 只看該作者
cryophysics 發表于 2019-5-9 03:59
固件版本6.6.4C的單片機RAM ID可讀,6.6C版本的讀出來都是0

請問大神這個單片機的固件版本號是怎么看出來的呀
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲欧美日韩一区二区 | 欧美大片黄 | 久久99精品久久久久蜜桃tv | 国产精品一区二区无线 | 亚洲激情网站 | 亚洲人成人一区二区在线观看 | m豆传媒在线链接观看 | 久久久久久成人 | a欧美 | 亚洲综合色| 亚洲精品第一 | 日本高清中文字幕 | 色婷婷激情 | 国产欧美一区二区三区久久 | 成人欧美一区二区 | 成人亚洲| 日韩精品一区二区三区中文在线 | 国产精品日韩欧美一区二区 | 亚洲国产精品99久久久久久久久 | 蜜臀久久99精品久久久久野外 | 日韩有码一区 | 久久精品中文字幕 | 欧美成人精品欧美一级 | 欧美成人视屏 | 久久精品一区 | 亚洲国产黄色av | 国产日韩一区 | 97av视频 | 亚洲天堂精品久久 | 日本三级全黄三级a | 久久综合av| 亚洲精品久久国产高清情趣图文 | 在线观看亚洲精品视频 | 青草福利| 久久一区二区三区四区 | 久久久久久九九九九九九 | 一区二区亚洲 | 国产高清一区二区三区 | 亚洲欧美日韩在线 | 成人在线免费电影 | www.4虎影院 国产999精品久久久影片官网 |