您当前的位置:五五电子网电子知识单片机-工控设备STC单片机(STC90/89系列内部 EEPROM 放数据(C语言) 正文
STC90/89系列内部 EEPROM 放数据(C语言)

STC90/89系列内部 EEPROM 放数据(C语言)

点击数:7278 次   录入时间:03-04 11:52:58   整理:http://www.55dianzi.com   STC单片机(
    else
        return    ERROR;
}

/* 写数据进 数据Flash存储器, 只在同一个扇区内写,不保留原有数据    */
/* begin_addr,被写数据Flash开始地址;counter,连续写多少个字节; array[],数据来源    */
INT8U sequential_write_flash_in_one_sector(INT16U begin_addr, INT16U counter, INT8U array[])
{
    INT16U    i    =    0;
    INT16U    in_sector_begin_addr    =    0;
    INT16U    sector_addr    =    0;

    /* 判是否是有效范围,此函数不允许跨扇区操作 */
    if(counter > USED_BYTE_QTY_IN_ONE_SECTOR)
        return    ERROR;
    in_sector_begin_addr =        begin_addr & 0x01ff;         /* 0000,0001,1111,1111 */
    if( (in_sector_begin_addr + counter) > USED_BYTE_QTY_IN_ONE_SECTOR )
        return ERROR;

    /* 擦除 要修改/写入 的扇区 */
    sector_addr    =    (begin_addr & 0xfe00);    /* 1111,1110,0000,0000; 取扇区地址 */
    ISP_ADDRH    =    (INT8U)(sector_addr >> 8);
    ISP_ADDRL    =    0x00;
    ISP_CMD        =    ISP_CMD    &    0xf8;        /* 1111,1000 */
    ISP_CMD        =    ISP_CMD    |    SECTOR_ERASE_AP_and_Data_Memory_Command;    /* 0000,0011 */

    ISP_IAP_enable();
    ISP_TRIG    =    0x46;        /* 触发ISP_IAP命令 */
    ISP_TRIG    =    0xb9;        /* 触发ISP_IAP命令 */
    _nop_();

    for(i = 0; i< counter; i++)
    {
        /* 写一个字节 */
        ISP_ADDRH    =    (INT8U)(begin_addr >> 8);
        ISP_ADDRL    =    (INT8U)(begin_addr & 0x00ff);
        ISP_DATA    =    array[i];
        ISP_CMD        =    ISP_CMD    &    0xf8;    /* 1111,1000 */
        ISP_CMD        =    ISP_CMD    |    PROGRAM_AP_and_Data_Memory_Command;        /* 0000,0010 */

        ISP_TRIG    =    0x46;    /* 触发ISP_IAP命令 */
        ISP_TRIG    =    0xb9;    /* 触发ISP_IAP命令 */
        _nop_();

        /* 读回来 */
        ISP_DATA    =    0x00;

        ISP_CMD        =    ISP_CMD    &    0xf8;    /* 1111,1000 */
        ISP_CMD     =    ISP_CMD    |    READ_AP_and_Data_Memory_Command;    /* 0000,0001 */

        ISP_TRIG    =    0x46;    /* 触发ISP_IAP命令 */
        ISP_TRIG    =    0xb9;    /* 触发ISP_IAP命令 */
        _nop_();

        /*  比较对错 */
        if(ISP_DATA != array[i])
        {
            ISP_IAP_disable();
            return ERROR;
        }
        begin_addr++;
    }
    ISP_IAP_disable();
    return    OK;
}

/* 写数据进数据Flash存储器(EEPROM), 只在同一个扇区内写,保留同一扇区中不需修改的数据    */
/* begin_addr,被写数据Flash开始地址;counter,连续写多少个字节; array[],数据来源        */
INT8U write_flash_with_protect_in_one_sector(INT16U begin_addr, INT16U counter, INT8U array[])
{
    INT16U    i    =    0;
    INT16U    in_sector_begin_addr    =    0;
    INT16U    sector_addr    =    0;
    INT16U    byte_addr    =    0;

    /* 判是否是有效范围,此函数不允许跨扇区操作 */
    if(counter > USED_BYTE_QTY_IN_ONE_SECTOR)
        return ERROR;
    in_sector_begin_addr =        begin_addr & 0x01ff;         /* 0000,0001,1111,1111 */
    /* 假定从扇区的第0个字节开始,到USED_BYTE_QTY_IN_ONE_SECTOR-1个字节结束,后面部分不用,程序易编写    */

上一页  [1] [2] [3] [4] [5] [6] [7] [8]  下一页


本文关键字:C语言  STC单片机(单片机-工控设备 - STC单片机(

《STC90/89系列内部 EEPROM 放数据(C语言)》相关文章>>>