欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: STC8H單片機(jī)eeprom不能保存數(shù)據(jù) [打印本頁]

作者: qq378912453    時(shí)間: 2024-9-1 20:48
標(biāo)題: STC8H單片機(jī)eeprom不能保存數(shù)據(jù)
/******************************************************************/
#include    "eeprom.h"
#include <intrins.h>
/******************************************************************/
void IapIdle()
{
    IAP_CONTR = 0;                              //關(guān)閉IAP功能
    IAP_CMD = 0;                                //清除命令寄存器
    IAP_TRIG = 0;                               //清除觸發(fā)寄存器
    IAP_ADDRH = 0x80;                           //將地址設(shè)置到非IAP區(qū)域
    IAP_ADDRL = 0;
}

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

    return dat;
}

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

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


u8 update_admin_passwd(u8 buf[], u8 buf_len) // 第一次數(shù)據(jù)保存-臨時(shí)
{
    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次存儲(chǔ) %bd \r\n",  old_key[i]);  //第一次保存數(shù)據(jù)測試下是否其他位數(shù)也可以
        key_buf_index=0;
    }
    return 1;
}
u8 update_admin_passwd1(u8 buf1[], u8 buf_len) // 第二次對(duì)比測試-臨時(shí)
{
    u8 i;
    if (byte_compare(old_key, buf1, buf_len))
    {
        EA=0; // 關(guān)閉總中斷
        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("二次對(duì)比 %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初始化 永久,管理,臨時(shí)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初始化 永久,管理,臨時(shí)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初始化 永久,管理,臨時(shí)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
個(gè)人認(rèn)為已經(jīng)寫入新的密碼數(shù)據(jù)了,也讀出來了,但是以斷電 就又恢復(fù)出廠值了

作者: wpppmlah    時(shí)間: 2024-9-2 08:40
單字節(jié),指定地址讀寫,進(jìn)行實(shí)驗(yàn),如果沒問題,就是你的連續(xù)讀寫代碼有問題,另外注意連續(xù)讀寫跨扇區(qū)問題,STC是扇區(qū)擦除,寫之前需要對(duì)當(dāng)前扇區(qū)先進(jìn)行擦除操作,才能寫.嚴(yán)格按照官方的代碼進(jìn)行操作,一般不會(huì)出問題,另外設(shè)置等待參數(shù)為什么要注釋掉呢: //IAP_TPS = 12;
作者: lkc8210    時(shí)間: 2024-9-2 09:37
代碼不全,main()呢?
作者: STC莊偉    時(shí)間: 2024-9-2 10:13
平常不要操作 STC32G/STC8H的EEPROM:
1,上電時(shí)讀到 SRAM 中;
2,平常在SRAM中改寫;
3,掉電時(shí)及時(shí)保存到 EEPROM/DATA-FLASH中!
用內(nèi)部比較器做外部掉電檢測。!
其他用法都是錯(cuò)誤的用法


作者: STC莊偉    時(shí)間: 2024-9-2 10:14

作者: cocolala    時(shí)間: 2024-9-2 14:22
    1、你沒有給出STC8H具體的單片機(jī)型號(hào),所以一定注意,有些單片機(jī)是出廠自帶EEPROM,有些沒有EEPROM,而只有再手動(dòng)分割FLASH出來作為EEPROM使用。手上正好有艾克姆科技的STC8H8K64U的開發(fā)板,把相關(guān)資料分享給你。

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


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

EEPROM.rar

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


作者: npn    時(shí)間: 2024-9-2 16:39
STC的EEPROM的讀寫擦除方法:
字節(jié)讀:部分系列可使用unsigned char/int/long code指針或匯編MOVC訪問(STC89/90系列除外)。
字節(jié)編程:二進(jìn)制1可以寫為0,0不能寫為1,必須擦除后才可以繼續(xù)寫。
扇區(qū)擦除:沒有字節(jié)擦除,1次擦1扇區(qū)為512字節(jié),擦除后全部恢復(fù)為0xFF。
作者: qq378912453    時(shí)間: 2024-9-2 22:07
#include "config.h"
/*************        功能說明        **************
選擇時(shí)鐘 11.0592MHz (可以在配置文件"config.h"中修改).
******************************************/
/**********************************************/
int main(void)
{
    P_SW2 |= 0x80; // 允許訪問擴(kuò)展寄存器xsfr
    IRCDB = 0x10;  // IRCDB設(shè)置減小,增加內(nèi)部高速振蕩器去抖
    IAP_TPS = 11;   //設(shè)置EEPROM操作等待參數(shù)(11.0592MHz),初始化設(shè)置一次即可
    EA    = 1;     // 允許全局中斷
    INT0_Init();
    Timer0_Init();
    GPIO_config();
    PrintfInit(); // 串口波特率
    ADC_config();
    Touch_Init();
    /**********************************************/
    open_flag  = 1; // 默認(rèn)開的狀態(tài)
    close_flag = 0;
    /**********************************************/
    mode_yongjiu = 1;  //永久模式(固定模式)
    mode_linshi  = 0;
    /**********************************************/
    while (1)
    {
       // key();
        /**********************************************/
        Touch_Scan();
        /**********************************************/
        Show_Vol(); // 顯示電池的電壓
        /**********************************************/
        handle_key_function(); // 狀態(tài)機(jī)切換
        /**********************************************/
    }
}

作者: qq378912453    時(shí)間: 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
一次對(duì)比 key_common[0]=7
一次對(duì)比 key_common[1]=7
一次對(duì)比 key_common[2]=7
一次對(duì)比 key_common[3]=7
一次對(duì)比 key_common[4]=7
一次對(duì)比 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
二次對(duì)比 new_key_common[0]=7
二次對(duì)比 new_key_common[1]=7
二次對(duì)比 new_key_common[2]=7
二次對(duì)比 new_key_common[3]=7
二次對(duì)比 new_key_common[4]=7
二次對(duì)比 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
以上為驗(yàn)證的數(shù)據(jù),能夠?qū)懭胍材軌蜃x出來,就是斷電后不能保存

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

1.png

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

2.png

作者: qq378912453    時(shí)間: 2024-9-2 22:14
wpppmlah 發(fā)表于 2024-9-2 08:40
單字節(jié),指定地址讀寫,進(jìn)行實(shí)驗(yàn),如果沒問題,就是你的連續(xù)讀寫代碼有問題,另外注意連續(xù)讀寫跨扇區(qū)問題,STC是 ...

這個(gè)main 初始化已經(jīng)初始化了 ,就是根據(jù)官方改的,目前可以寫可以讀,就是斷電不會(huì)保存
作者: newlined    時(shí)間: 2024-9-3 08:08
本帖最后由 newlined 于 2024-9-3 09:12 編輯

前邊樓層已經(jīng)想到了,編輯掉了,請(qǐng)版主刪掉此貼,謝謝。
作者: lkc8210    時(shí)間: 2024-9-4 09:47
qq378912453 發(fā)表于 2024-9-2 22:07
#include "config.h"
/*************        功能說明        **************
選擇時(shí)鐘 11.0592MHz (可以在配置文件"con ...

update_admin_passwd和update_admin_passwd1在哪里運(yùn)行?
作者: 188610329    時(shí)間: 2024-9-4 22:20
STC莊偉 發(fā)表于 2024-9-2 10:13
平常不要操作 STC32G/STC8H的EEPROM:
1,上電時(shí)讀到 SRAM 中;
2,平常在SRAM中改寫;

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

那么,STC的“掉電中斷”是干什么吃的? 樣子貨?
作者: qq378912453    時(shí)間: 2024-9-7 21:00
已解決,謝謝大家




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