⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stc89c58rd+ flash-isp-iap.lst

📁 移植到51单片机的UIP代码
💻 LST
📖 第 1 页 / 共 3 页
字号:
 169          
 170          /* 字节编程并校验 */
 171          INT8U byte_program_and_verify(INT16U byte_addr, INT8U original_data)
 172          {
 173   1              ISP_ADDRH       =       (INT8U)(byte_addr >> 8);
 174   1              ISP_ADDRL       =       (INT8U)(byte_addr & 0x00ff);
 175   1      
 176   1              ISP_CMD         =       ISP_CMD &       0xf8;        /* 1111,1000 */
 177   1              ISP_CMD         =       ISP_CMD |       PROGRAM_AP_and_Data_Memory_Command;     /* 0000,0010 */
 178   1              ISP_DATA        =       original_data;
C51 COMPILER V8.08   STC89C58RD__FLASH_ISP_IAP                                             05/13/2008 23:42:02 PAGE 4   

 179   1      
 180   1              ISP_IAP_enable();
 181   1      
 182   1              ISP_TRIG        =       0x46;
 183   1              ISP_TRIG        =       0xb9;
 184   1              _nop_();
 185   1      
 186   1              ISP_DATA        =       0x00;
 187   1      
 188   1              ISP_CMD         =       ISP_CMD &       0xf8;        /* 1111,1000 */
 189   1              ISP_CMD         =       ISP_CMD |       READ_AP_and_Data_Memory_Command;        /* 0000,0001 */
 190   1      
 191   1              ISP_TRIG        =       0x46;        /* 触发ISP_IAP命令 */
 192   1              ISP_TRIG        =       0xb9;        /* 触发ISP_IAP命令 */
 193   1              _nop_();
 194   1      
 195   1              ISP_IAP_disable();
 196   1      
 197   1              if(ISP_DATA     ==      original_data)
 198   1                      return  OK;
 199   1              else
 200   1                      return  ERROR;
 201   1      }
 202          
 203          /* 写数据进 数据Flash存储器, 只在同一个扇区内写,不保留原有数据 */
 204          /* begin_addr,被写数据Flash开始地址;counter,连续写多少个字节; array[],数据来源       */
 205          INT8U sequential_write_flash_in_one_sector(INT16U begin_addr, INT16U counter, INT8U array[])
 206          {
 207   1              INT16U  i       =       0;
 208   1              INT16U  in_sector_begin_addr    =       0;
 209   1              INT16U  sector_addr     =       0;
 210   1      
 211   1              /* 判是否是有效范围,此函数不允许跨扇区操作 */
 212   1              if(counter > USED_BYTE_QTY_IN_ONE_SECTOR)
 213   1                      return  ERROR;
 214   1              in_sector_begin_addr =        begin_addr & 0x01ff;         /* 0000,0001,1111,1111 */
 215   1              if( (in_sector_begin_addr + counter) > USED_BYTE_QTY_IN_ONE_SECTOR )
 216   1                      return ERROR;
 217   1      
 218   1          /* 擦除 要修改/写入 的扇区 */
 219   1              sector_addr     =       (begin_addr & 0xfe00);  /* 1111,1110,0000,0000; 取扇区地址 */
 220   1              ISP_ADDRH       =       (INT8U)(sector_addr >> 8);
 221   1              ISP_ADDRL       =       0x00;
 222   1              ISP_CMD         =       ISP_CMD &       0xf8;           /* 1111,1000 */
 223   1              ISP_CMD         =       ISP_CMD |       SECTOR_ERASE_AP_and_Data_Memory_Command;        /* 0000,0011 */
 224   1      
 225   1              ISP_IAP_enable();
 226   1              ISP_TRIG        =       0x46;        /* 触发ISP_IAP命令 */
 227   1              ISP_TRIG        =       0xb9;        /* 触发ISP_IAP命令 */
 228   1              _nop_();
 229   1      
 230   1              for(i = 0; i< counter; i++)
 231   1              {
 232   2                      /* 写一个字节 */
 233   2                      ISP_ADDRH       =       (INT8U)(begin_addr >> 8);
 234   2                      ISP_ADDRL       =       (INT8U)(begin_addr & 0x00ff);
 235   2                      ISP_DATA        =       array[i];
 236   2                      ISP_CMD         =       ISP_CMD &       0xf8;   /* 1111,1000 */
 237   2                      ISP_CMD         =       ISP_CMD |       PROGRAM_AP_and_Data_Memory_Command;             /* 0000,0010 */
 238   2      
 239   2                      ISP_TRIG        =       0x46;   /* 触发ISP_IAP命令 */
 240   2                      ISP_TRIG        =       0xb9;   /* 触发ISP_IAP命令 */
C51 COMPILER V8.08   STC89C58RD__FLASH_ISP_IAP                                             05/13/2008 23:42:02 PAGE 5   

 241   2                      _nop_();
 242   2      
 243   2                      /* 读回来 */
 244   2                      ISP_DATA        =       0x00;
 245   2      
 246   2                      ISP_CMD         =       ISP_CMD &       0xf8;   /* 1111,1000 */
 247   2                      ISP_CMD     =   ISP_CMD |       READ_AP_and_Data_Memory_Command;        /* 0000,0001 */
 248   2      
 249   2                      ISP_TRIG        =       0x46;   /* 触发ISP_IAP命令 */
 250   2                      ISP_TRIG        =       0xb9;   /* 触发ISP_IAP命令 */
 251   2                      _nop_();
 252   2      
 253   2                      /*  比较对错 */
 254   2                      if(ISP_DATA != array[i])
 255   2                      {
 256   3                              ISP_IAP_disable();
 257   3                              return ERROR;
 258   3                      }
 259   2              begin_addr++;
 260   2              }
 261   1              ISP_IAP_disable();
 262   1              return  OK;
 263   1      }
 264          
 265          /* 写数据进数据Flash存储器(EEPROM), 只在同一个扇区内写,保留同一扇区中不需修改的数据    */
 266          /* begin_addr,被写数据Flash开始地址;counter,连续写多少个字节; array[],数据来源               */
 267          INT8U write_flash_with_protect_in_one_sector(INT16U begin_addr, INT16U counter, INT8U array[])
 268          {
 269   1              INT16U  i       =       0;
 270   1              INT16U  in_sector_begin_addr    =       0;
 271   1              INT16U  sector_addr     =       0;
 272   1              INT16U  byte_addr       =       0;
 273   1      
 274   1              /* 判是否是有效范围,此函数不允许跨扇区操作 */
 275   1              if(counter > USED_BYTE_QTY_IN_ONE_SECTOR)
 276   1                      return ERROR;
 277   1              in_sector_begin_addr =        begin_addr & 0x01ff;         /* 0000,0001,1111,1111 */
 278   1              /* 假定从扇区的第0个字节开始,到USED_BYTE_QTY_IN_ONE_SECTOR-1个字节结束,后面部分不用,程序易编写 */
 279   1              if( (in_sector_begin_addr + counter) > USED_BYTE_QTY_IN_ONE_SECTOR )
 280   1                      return ERROR;
 281   1      
 282   1              /* 将该扇区数据 0 - (USED_BYTE_QTY_IN_ONE_SECTOR-1) 字节数据读入缓冲区保护 */
 283   1              sector_addr             =       (begin_addr & 0xfe00);  /* 1111,1110,0000,0000; 取扇区地址              */
 284   1              byte_addr               =   sector_addr;                        /* 扇区地址为扇区首字节地址                             */
 285   1      
 286   1              ISP_IAP_enable();
 287   1              for(i = 0; i < USED_BYTE_QTY_IN_ONE_SECTOR; i++)
 288   1              {
 289   2                      ISP_ADDRH       =       (INT8U)(byte_addr >> 8);
 290   2                      ISP_ADDRL       =       (INT8U)(byte_addr & 0x00ff);
 291   2      
 292   2                      ISP_CMD         =       ISP_CMD &       0xf8;        /* 1111,1000 */
 293   2                      ISP_CMD         =       ISP_CMD |       READ_AP_and_Data_Memory_Command;        /* 0000,0001 */
 294   2      
 295   2                      ISP_TRIG        =       0x46;
 296   2                      ISP_TRIG        =       0xb9;
 297   2                      _nop_();
 298   2      
 299   2                      protect_buffer[i]       =       ISP_DATA;
 300   2                      byte_addr++;
 301   2              }
 302   1      
C51 COMPILER V8.08   STC89C58RD__FLASH_ISP_IAP                                             05/13/2008 23:42:02 PAGE 6   

 303   1              /* 将要写入的数据写入保护缓冲区的相应区域,其余部分保留 */
 304   1              for(i = 0; i < counter; i++)
 305   1              {
 306   2                      protect_buffer[in_sector_begin_addr] = array[i];
 307   2                      in_sector_begin_addr++;
 308   2              }
 309   1      
 310   1              /* 擦除 要修改/写入 的扇区 */
 311   1              ISP_ADDRH       =       (INT8U)(sector_addr >> 8);
 312   1              ISP_ADDRL       =       0x00;
 313   1              ISP_CMD         =       ISP_CMD &       0xf8;        /* 1111,1000 */
 314   1              ISP_CMD         =       ISP_CMD |       SECTOR_ERASE_AP_and_Data_Memory_Command;        /* 0000,0011 */
 315   1      
 316   1              ISP_TRIG        =       0x46;        /* 触发ISP_IAP命令 */
 317   1              ISP_TRIG        =       0xb9;        /* 触发ISP_IAP命令 */
 318   1              _nop_();
 319   1      
 320   1              /* 将保护缓冲区的数据写入 Data Flash, EEPROM */
 321   1              byte_addr       =   sector_addr;                        /* 扇区地址为扇区首字节地址     */
 322   1              for(i = 0; i< USED_BYTE_QTY_IN_ONE_SECTOR; i++)
 323   1              {
 324   2                      /* 写一个字节 */
 325   2                      ISP_ADDRH       =       (INT8U)(byte_addr >> 8);
 326   2                      ISP_ADDRL       =       (INT8U)(byte_addr & 0x00ff);
 327   2                      ISP_DATA        =       protect_buffer[i];
 328   2                      ISP_CMD         =       ISP_CMD &       0xf8;        /* 1111,1000 */
 329   2                      ISP_CMD         =       ISP_CMD |       PROGRAM_AP_and_Data_Memory_Command;             /* 0000,0010 */
 330   2      
 331   2                      ISP_TRIG        =       0x46;        /* 触发ISP_IAP命令 */
 332   2                      ISP_TRIG        =       0xb9;        /* 触发ISP_IAP命令 */
 333   2                      _nop_();
 334   2      
 335   2                      /* 读回来 */
 336   2                      ISP_DATA        =       0x00;
 337   2      
 338   2                      ISP_CMD         =       ISP_CMD &       0xf8;        /* 1111,1000 */
 339   2                      ISP_CMD         =       ISP_CMD |       READ_AP_and_Data_Memory_Command;        /* 0000,0001 */
 340   2      
 341   2                      ISP_TRIG        =       0x46;        /* 触发ISP_IAP命令 */
 342   2                      ISP_TRIG        =       0xb9;        /* 触发ISP_IAP命令 */
 343   2                      _nop_();
 344   2      

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -