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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1307|回復: 13
收起左側

STC8H單片機eeprom不能保存數據

[復制鏈接]
ID:307493 發表于 2024-9-1 20:48 | 顯示全部樓層 |閱讀模式
/******************************************************************/
#include    "eeprom.h"
#include <intrins.h>
/******************************************************************/
void IapIdle()
{
    IAP_CONTR = 0;                              //關閉IAP功能
    IAP_CMD = 0;                                //清除命令寄存器
    IAP_TRIG = 0;                               //清除觸發寄存器
    IAP_ADDRH = 0x80;                           //將地址設置到非IAP區域
    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;                            //寫觸發命令(0x5a)
    IAP_TRIG = 0xa5;                            //寫觸發命令(0xa5)
    _nop_();_nop_();_nop_();_nop_();
    dat = IAP_DATA;                             //讀IAP數據
    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數據
    IAP_TRIG = 0x5a;                            //寫觸發命令(0x5a)
    IAP_TRIG = 0xa5;                            //寫觸發命令(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;                            //寫觸發命令(0x5a)
    IAP_TRIG = 0xa5;                            //寫觸發命令(0xa5)
    _nop_();_nop_();_nop_();_nop_();                                     //
    IapIdle();                                  //關閉IAP功能
}


u8 update_admin_passwd(u8 buf[], u8 buf_len) // 第一次數據保存-臨時
{
    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; //如果內容為空,則寫入初始化數據
            break;
        }
        printf("1次存儲 %bd \r\n",  old_key[i]);  //第一次保存數據測試下是否其他位數也可以
        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;
    }

調試的數據如下
[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
個人認為已經寫入新的密碼數據了,也讀出來了,但是以斷電 就又恢復出廠值了
回復

使用道具 舉報

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

使用道具 舉報

ID:161164 發表于 2024-9-2 09:37 | 顯示全部樓層
代碼不全,main()呢?
回復

使用道具 舉報

ID:961114 發表于 2024-9-2 10:13 | 顯示全部樓層
平常不要操作 STC32G/STC8H的EEPROM:
1,上電時讀到 SRAM 中;
2,平常在SRAM中改寫;
3,掉電時及時保存到 EEPROM/DATA-FLASH中!
用內部比較器做外部掉電檢測。。
其他用法都是錯誤的用法 下載.png

回復

使用道具 舉報

ID:961114 發表于 2024-9-2 10:14 | 顯示全部樓層
51hei截圖20240902101349.png
回復

使用道具 舉報

ID:226055 發表于 2024-9-2 14:22 | 顯示全部樓層
    1、你沒有給出STC8H具體的單片機型號,所以一定注意,有些單片機是出廠自帶EEPROM,有些沒有EEPROM,而只有再手動分割FLASH出來作為EEPROM使用。手上正好有艾克姆科技的STC8H8K64U的開發板,把相關資料分享給你。 連接誒圖.jpg

    2、STC8H8K64U是沒有片內EEPROM的,所以需要在STC-ISP下載軟件時分好EEPROM空間。如果芯片自帶片內EEPROM,則無需分割,比如STC8H8K48U。
實驗現象截圖.jpg

    3、程序源碼見附件,下載程序后,打開串口助手可觀察對片內EEPROM的讀寫操作。
STC-ISP軟件配置.jpg

EEPROM.rar

34.05 KB, 下載次數: 1

回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

ID:307493 發表于 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
以上為驗證的數據,能夠寫入也能夠讀出來,就是斷電后不能保存

1.png
2.png
回復

使用道具 舉報

ID:307493 發表于 2024-9-2 22:14 | 顯示全部樓層
wpppmlah 發表于 2024-9-2 08:40
單字節,指定地址讀寫,進行實驗,如果沒問題,就是你的連續讀寫代碼有問題,另外注意連續讀寫跨扇區問題,STC是 ...

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

使用道具 舉報

ID:227818 發表于 2024-9-3 08:08 | 顯示全部樓層
本帖最后由 newlined 于 2024-9-3 09:12 編輯

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

使用道具 舉報

ID:161164 發表于 2024-9-4 09:47 | 顯示全部樓層
qq378912453 發表于 2024-9-2 22:07
#include "config.h"
/*************        功能說明        **************
選擇時鐘 11.0592MHz (可以在配置文件"con ...

update_admin_passwd和update_admin_passwd1在哪里運行?
回復

使用道具 舉報

ID:624769 發表于 2024-9-4 22:20 | 顯示全部樓層
STC莊偉 發表于 2024-9-2 10:13
平常不要操作 STC32G/STC8H的EEPROM:
1,上電時讀到 SRAM 中;
2,平常在SRAM中改寫;

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

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

使用道具 舉報

ID:307493 發表于 2024-9-7 21:00 | 顯示全部樓層
已解決,謝謝大家
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 色接久久 | 一区二区三区视频 | 欧产日产国产精品99 | 久久久久久久久久久蜜桃 | 久久黄网| 国产精品久久久久久久久久免费看 | 国产www成人 | 麻豆av在线 | 国产精品免费看 | 亚洲一区二区日韩 | 欧美一区二区在线免费观看 | 国产一区在线免费观看视频 | 成人av在线大片 | 一区二区三区国产精品 | 久久久国产精品一区 | 国产一区 | 久久婷婷麻豆国产91天堂 | 亚洲久草视频 | 欧美精品一区二区三区在线播放 | 久久久视频在线 | 黄色欧美在线 | 91精品在线看 | 色婷婷亚洲国产女人的天堂 | 91视频精选 | 一区二区三区在线 | 欧美性大战久久久久久久蜜臀 | 这里精品 | 精品丝袜在线 | 一级日韩 | www.久久.com| av一区二区三区四区 | 国产伦精品一区二区三区视频金莲 | 永久av| 久久蜜桃av一区二区天堂 | 欧美日韩亚洲国产综合 | 免费看黄视频网站 | 干干天天 | 精品自拍视频在线观看 | 三级免费 | 亚洲高清在线观看 | 国产成人高清在线观看 |