找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STC8H單片機eeprom不能保存數(shù)據(jù)

[復制鏈接]
跳轉到指定樓層
樓主
ID:307493 發(fā)表于 2024-9-1 20:48 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
/******************************************************************/
#include    "eeprom.h"
#include <intrins.h>
/******************************************************************/
void IapIdle()
{
    IAP_CONTR = 0;                              //關閉IAP功能
    IAP_CMD = 0;                                //清除命令寄存器
    IAP_TRIG = 0;                               //清除觸發(fā)寄存器
    IAP_ADDRH = 0x80;                           //將地址設置到非IAP區(qū)域
    IAP_ADDRL = 0;
}

unsigned char IapRead(int addr)
{
    char dat;
    //IAP_TPS = 12;
    IAP_CONTR = 0x80;                           //使能IAP
    IAP_CMD = 1;                                //設置IAP讀命令
    IAP_ADDRL = addr;                           //設置IAP低地址
    IAP_ADDRH = addr >> 8;                      //設置IAP高地址
    IAP_TRIG = 0x5a;                            //寫觸發(fā)命令(0x5a)
    IAP_TRIG = 0xa5;                            //寫觸發(fā)命令(0xa5)
    _nop_();_nop_();_nop_();_nop_();
    dat = IAP_DATA;                             //讀IAP數(shù)據(jù)
    IapIdle();                                  //關閉IAP功能

    return dat;
}

void IapProgram(int addr, unsigned char dat)
{
    //IAP_TPS = 12;
    IAP_CONTR = 0x80;                           //使能IAP
    IAP_CMD = 2;                                //設置IAP寫命令
    IAP_ADDRL = addr;                           //設置IAP低地址
    IAP_ADDRH = addr >> 8;                      //設置IAP高地址
    IAP_DATA = dat;                             //寫IAP數(shù)據(jù)
    IAP_TRIG = 0x5a;                            //寫觸發(fā)命令(0x5a)
    IAP_TRIG = 0xa5;                            //寫觸發(fā)命令(0xa5)
    _nop_();_nop_();_nop_();_nop_();
    IapIdle();                                  //關閉IAP功能
}

void IapErase(int addr)
{
    //IAP_TPS = 12;
    IAP_CONTR = 0x80;                           //使能IAP
    IAP_CMD = 3;                                //設置IAP擦除命令
    IAP_ADDRL = addr;                           //設置IAP低地址
    IAP_ADDRH = addr >> 8;                      //設置IAP高地址
    IAP_TRIG = 0x5a;                            //寫觸發(fā)命令(0x5a)
    IAP_TRIG = 0xa5;                            //寫觸發(fā)命令(0xa5)
    _nop_();_nop_();_nop_();_nop_();                                     //
    IapIdle();                                  //關閉IAP功能
}


u8 update_admin_passwd(u8 buf[], u8 buf_len) // 第一次數(shù)據(jù)保存-臨時
{
    u8 i;
    if (buf_len < 4 || buf_len > 10)
    {
        return 0;
    }
    for (i = 0; i < buf_len; i++)
    {
        old_key[i] = buf[i];
        if(buf[i]==0xff)
        {
            buf[i]=0xff; //如果內(nèi)容為空,則寫入初始化數(shù)據(jù)
            break;
        }
        printf("1次存儲 %bd \r\n",  old_key[i]);  //第一次保存數(shù)據(jù)測試下是否其他位數(shù)也可以
        key_buf_index=0;
    }
    return 1;
}
u8 update_admin_passwd1(u8 buf1[], u8 buf_len) // 第二次對比測試-臨時
{
    u8 i;
    if (byte_compare(old_key, buf1, buf_len))
    {
        EA=0; // 關閉總中斷
        IapErase(EEPROM_ADD_1);
        for (i = 0; i < buf_len; i++)
        {
            new_key[i]=old_key[i];
            IapProgram(EEPROM_ADD_1 + i, new_key[i]);
            new_key[i]=IapRead(EEPROM_ADD_1 + i);
            printf("二次對比 %bd \r\n",  IapRead(EEPROM_ADD_1 + i));
        }
        printf("update_admin_passwd1 cunchu ok \r\n");
        passwd_bijiao=1;
        key_buf_index=0;
        EA=1; // 開啟總中斷
        return 1;
    }

調(diào)試的數(shù)據(jù)如下
[20:35:29.947]接收←12 /r/n初始化 永久,管理,臨時key_value=12sys_key_state == PASSWD_UNLOCK[20:35:32.386]接收←key_value < 11key_value=3guanli[20:35:34.242]接收←key_value < 11key_value=7[20:35:34.601]接收←key_value < 11key_value=7[20:35:34.901]接收←key_value < 11key_value=7[20:35:35.170]接收←key_value < 11key_value=7[20:35:35.425]接收←key_value < 11key_value=7[20:35:35.739]接收←key_value < 11key_value=7[20:35:36.263]接收←12 /r/n初始化 永久,管理,臨時key_value=12CMD_UPDATE_PASSWD17 7 7 7 7 7 [20:35:37.715]接收←key_value < 11key_value=7[20:35:38.045]接收←key_value < 11key_value=7[20:35:38.359]接收←key_value < 11key_value=7[20:35:38.629]接收←key_value < 11key_value=7[20:35:38.883]接收←key_value < 11key_value=7[20:35:39.213]接收←key_value < 11key_value=7[20:35:40.172]接收←12 /r/n初始化 永久,管理,臨時key_value=12NEW_PASSWD3buf_len = 67 7 7 7 7 7 update_admin_common_pin cunchu ok [20:35:42.387]接收←key_value < 11key_value=7[20:35:42.686]接收←key_value < 11key_value=7[20:35:43.001]接收←key_value < 11key_value=7[20:35:43.374]接收←key_value < 11key_value=7[20:35:43.734]接收←key_value < 11key_value=7[20:35:44.077]接收←key_value < 11key_value=7[20:35:44.572]接收←12 /r/n管理密碼模式new old_key_common du [0] = 7new old_key_common du [1] = 7new old_key_common du [2] = 7new old_key_common du [3] = 7new old_key_common du [4] = 7new old_key_common du [5] = 7key_value=12sys_key_state == PASSWD_UNLOCKin mode_yongjiu == 1 && mode_linshi == 0common_pin buf_len = 0admin_checkcommon_pin okkey_buf_index22=6[20:35:45.845]接收←new_key_yongjiu0=1new_key_yongjiu1=1new_key_yongjiu2=1new_key_yongjiu3=1
個人認為已經(jīng)寫入新的密碼數(shù)據(jù)了,也讀出來了,但是以斷電 就又恢復出廠值了
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:68189 發(fā)表于 2024-9-2 08:40 | 只看該作者
單字節(jié),指定地址讀寫,進行實驗,如果沒問題,就是你的連續(xù)讀寫代碼有問題,另外注意連續(xù)讀寫跨扇區(qū)問題,STC是扇區(qū)擦除,寫之前需要對當前扇區(qū)先進行擦除操作,才能寫.嚴格按照官方的代碼進行操作,一般不會出問題,另外設置等待參數(shù)為什么要注釋掉呢: //IAP_TPS = 12;
回復

使用道具 舉報

板凳
ID:161164 發(fā)表于 2024-9-2 09:37 | 只看該作者
代碼不全,main()呢?
回復

使用道具 舉報

地板
ID:961114 發(fā)表于 2024-9-2 10:13 | 只看該作者
平常不要操作 STC32G/STC8H的EEPROM:
1,上電時讀到 SRAM 中;
2,平常在SRAM中改寫;
3,掉電時及時保存到 EEPROM/DATA-FLASH中!
用內(nèi)部比較器做外部掉電檢測!。
其他用法都是錯誤的用法

回復

使用道具 舉報

5#
ID:961114 發(fā)表于 2024-9-2 10:14 | 只看該作者
回復

使用道具 舉報

6#
ID:226055 發(fā)表于 2024-9-2 14:22 | 只看該作者
    1、你沒有給出STC8H具體的單片機型號,所以一定注意,有些單片機是出廠自帶EEPROM,有些沒有EEPROM,而只有再手動分割FLASH出來作為EEPROM使用。手上正好有艾克姆科技的STC8H8K64U的開發(fā)板,把相關資料分享給你。

    2、STC8H8K64U是沒有片內(nèi)EEPROM的,所以需要在STC-ISP下載軟件時分好EEPROM空間。如果芯片自帶片內(nèi)EEPROM,則無需分割,比如STC8H8K48U。


    3、程序源碼見附件,下載程序后,打開串口助手可觀察對片內(nèi)EEPROM的讀寫操作。

EEPROM.rar

34.05 KB, 下載次數(shù): 1

回復

使用道具 舉報

7#
ID:57657 發(fā)表于 2024-9-2 16:39 | 只看該作者
STC的EEPROM的讀寫擦除方法:
字節(jié)讀:部分系列可使用unsigned char/int/long code指針或匯編MOVC訪問(STC89/90系列除外)。
字節(jié)編程:二進制1可以寫為0,0不能寫為1,必須擦除后才可以繼續(xù)寫。
扇區(qū)擦除:沒有字節(jié)擦除,1次擦1扇區(qū)為512字節(jié),擦除后全部恢復為0xFF。
回復

使用道具 舉報

8#
ID:307493 發(fā)表于 2024-9-2 22:07 | 只看該作者
#include "config.h"
/*************        功能說明        **************
選擇時鐘 11.0592MHz (可以在配置文件"config.h"中修改).
******************************************/
/**********************************************/
int main(void)
{
    P_SW2 |= 0x80; // 允許訪問擴展寄存器xsfr
    IRCDB = 0x10;  // IRCDB設置減小,增加內(nèi)部高速振蕩器去抖
    IAP_TPS = 11;   //設置EEPROM操作等待參數(shù)(11.0592MHz),初始化設置一次即可
    EA    = 1;     // 允許全局中斷
    INT0_Init();
    Timer0_Init();
    GPIO_config();
    PrintfInit(); // 串口波特率
    ADC_config();
    Touch_Init();
    /**********************************************/
    open_flag  = 1; // 默認開的狀態(tài)
    close_flag = 0;
    /**********************************************/
    mode_yongjiu = 1;  //永久模式(固定模式)
    mode_linshi  = 0;
    /**********************************************/
    while (1)
    {
       // key();
        /**********************************************/
        Touch_Scan();
        /**********************************************/
        Show_Vol(); // 顯示電池的電壓
        /**********************************************/
        handle_key_function(); // 狀態(tài)機切換
        /**********************************************/
    }
}
回復

使用道具 舉報

9#
ID:307493 發(fā)表于 2024-9-2 22:13 | 只看該作者
21:48:48.679]接收←key_value < 11
key_value=7

[21:48:48.984]接收←key_value < 11
key_value=7

[21:48:49.275]接收←key_value < 11
key_value=7

[21:48:49.551]接收←key_value < 11
key_value=7

[21:48:49.857]接收←key_value < 11
key_value=7

[21:48:50.208]接收←key_value < 11
key_value=7

[21:48:50.786]接收←12 /r/nCMD_UPDATE_PASSWD1
一次對比 key_common[0]=7
一次對比 key_common[1]=7
一次對比 key_common[2]=7
一次對比 key_common[3]=7
一次對比 key_common[4]=7
一次對比 key_common[5]=7

[21:48:51.634]接收←key_value < 11
key_value=7

[21:48:51.937]接收←key_value < 11
key_value=7

[21:48:52.212]接收←key_value < 11
key_value=7

[21:48:52.470]接收←key_value < 11
key_value=7

[21:48:52.760]接收←key_value < 11
key_value=7

[21:48:53.094]接收←key_value < 11
key_value=7

[21:48:53.688]接收←12 /r/nNEW_PASSWD3
buf_len = 6
二次對比 new_key_common[0]=7
二次對比 new_key_common[1]=7
二次對比 new_key_common[2]=7
二次對比 new_key_common[3]=7
二次對比 new_key_common[4]=7
二次對比 new_key_common[5]=7

[21:48:55.758]接收←key_value < 11
key_value=7

[21:48:56.147]接收←key_value < 11
key_value=7

[21:48:56.431]接收←key_value < 11
key_value=7

[21:48:56.716]接收←key_value < 11
key_value=7

[21:48:57.033]接收←key_value < 11
key_value=7

[21:48:57.351]接收←key_value < 11
key_value=7

[21:48:58.293]接收←12 /r/nsys_key_state == PASSWD_UNLOCK
in mode_yongjiu == 1 && mode_linshi == 0
new_key_common=7 7 7 7 7 7 -1 -1
common_pin0 = 7
common_pin1 = 7
common_pin2 = 7
common_pin3 = 7
common_pin4 = 7
common_pin5 = 7
common_pin6 = -1
common_pin7 = -1
admin_checkcommon_pin ok
key_buf_index22=6
以上為驗證的數(shù)據(jù),能夠寫入也能夠讀出來,就是斷電后不能保存

1.png (25.54 KB, 下載次數(shù): 5)

1.png

2.png (62.46 KB, 下載次數(shù): 5)

2.png
回復

使用道具 舉報

10#
ID:307493 發(fā)表于 2024-9-2 22:14 | 只看該作者
wpppmlah 發(fā)表于 2024-9-2 08:40
單字節(jié),指定地址讀寫,進行實驗,如果沒問題,就是你的連續(xù)讀寫代碼有問題,另外注意連續(xù)讀寫跨扇區(qū)問題,STC是 ...

這個main 初始化已經(jīng)初始化了 ,就是根據(jù)官方改的,目前可以寫可以讀,就是斷電不會保存
回復

使用道具 舉報

11#
ID:227818 發(fā)表于 2024-9-3 08:08 | 只看該作者
本帖最后由 newlined 于 2024-9-3 09:12 編輯

前邊樓層已經(jīng)想到了,編輯掉了,請版主刪掉此貼,謝謝。
回復

使用道具 舉報

12#
ID:161164 發(fā)表于 2024-9-4 09:47 | 只看該作者
qq378912453 發(fā)表于 2024-9-2 22:07
#include "config.h"
/*************        功能說明        **************
選擇時鐘 11.0592MHz (可以在配置文件"con ...

update_admin_passwd和update_admin_passwd1在哪里運行?
回復

使用道具 舉報

13#
ID:624769 發(fā)表于 2024-9-4 22:20 | 只看該作者
STC莊偉 發(fā)表于 2024-9-2 10:13
平常不要操作 STC32G/STC8H的EEPROM:
1,上電時讀到 SRAM 中;
2,平常在SRAM中改寫;

你說用比較器做掉電檢測,其他用法都是錯的??

那么,STC的“掉電中斷”是干什么吃的? 樣子貨?
回復

使用道具 舉報

14#
ID:307493 發(fā)表于 2024-9-7 21:00 | 只看該作者
已解決,謝謝大家
回復

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表