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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1706|回復(fù): 13
打印 上一主題 下一主題
收起左側(cè)

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

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
/******************************************************************/
#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ù)出廠值了
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:68189 發(fā)表于 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;
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

6#
ID:226055 發(fā)表于 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

回復(fù)

使用道具 舉報(bào)

7#
ID:57657 發(fā)表于 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。
回復(fù)

使用道具 舉報(bào)

8#
ID:307493 發(fā)表于 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ī)切換
        /**********************************************/
    }
}
回復(fù)

使用道具 舉報(bào)

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
一次對(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
回復(fù)

使用道具 舉報(bào)

10#
ID:307493 發(fā)表于 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ì)保存
回復(fù)

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

12#
ID:161164 發(fā)表于 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)行?
回復(fù)

使用道具 舉報(bào)

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

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

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 免费av一区| 久久婷婷色 | 国产a久久麻豆入口 | 日本婷婷 | 狠狠干免费视频 | 91福利视频导航 | 日韩精品在线一区二区 | 日韩精品视频在线免费观看 | 黄色大片网站 | 国产精品视频专区 | 亚洲精品午夜精品 | 亚洲精品日韩丝袜精品 | 日本国产在线观看 | 在线网站免费观看18 | 中文字幕二区 | 欧美综合色 | 国产精品一区三区 | 成人自拍视频在线观看 | 亚洲黄色天堂 | 欧美精品亚洲精品 | 性色av一区二区 | 国产成人精品网站 | 精品国产乱码一区二区三 | 亚洲欧美网站 | 欧美精品第一页 | 日韩一级片 | 欧美一区二区三 | 日韩av在线免费观看 | 躁躁躁日日躁 | 天天躁日日躁bbbbb | www.日韩av | 日韩黄色一级视频 | 高清视频一区二区 | 亚洲天天干| 精品成人av | 日韩黄色影院 | 日韩中文字幕在线观看 | 黑人精品xxx一区一二区 | 精品视频在线观看免费 | 国产午夜在线观看 | 人人草人人草 |