|
Keil C51默认优化等级是“8:Reuse Common Entry Code”,再次优化等级下,能够正常操作Flash,为何将优化等级提高到“9:common block subroutines”,代码就无法写Flash?
注意到 write_DATAFLASH_BYTE 函数注释,这个咋破?
- /*****************************************************************************************************************
- write_DATAFLASH_BYTE :
- user can copy all this subroutine into project, then call this function in main.
- ******************************************************************************************************************/
- void write_DATAFLASH_BYTE(UINT16 u16_addr, UINT8 u8_data)
- {
- UINT8 looptmp = 0, u8_addrl_r;
- unsigned char code *cd_longaddr;
- unsigned char idata *xd_tmp;
- //Check page start address
- u8_addrl_r = u16_addr;
- if (u8_addrl_r < 0x80)
- {
- u8_addrl_r = 0;
- }
- else
- {
- u8_addrl_r = 0x80;
- }
- //Save APROM data to XRAM
- xd_tmp = 0x80;
- cd_longaddr = (u16_addr & 0xff00) + u8_addrl_r;
- while (xd_tmp != 0x100)
- {
- *xd_tmp = *cd_longaddr;
- looptmp++;
- xd_tmp++;
- cd_longaddr++;
- }
- // Modify customer data in XRAM
- u8_addrl_r = u16_addr;
- if (u8_addrl_r < 0x80)
- {
- xd_tmp = u8_addrl_r + 0x80;
- }
- else
- {
- xd_tmp = u8_addrl_r + 0;
- }
- *xd_tmp = u8_data;
- //Erase APROM DATAFLASH page
- IAPAL = u16_addr;
- IAPAH = u16_addr >> 8;
- IAPFD = 0xFF;
- set_IAPEN;
- set_APUEN;
- IAPCN = 0x22;
- set_IAPGO;
- //Save changed RAM data to APROM DATAFLASH
- u8_addrl_r = u16_addr;
- if (u8_addrl_r < 0x80)
- {
- u8_addrl_r = 0;
- }
- else
- {
- u8_addrl_r = 0x80;
- }
- xd_tmp = 0x80;
- IAPAL = u8_addrl_r;
- IAPAH = u16_addr >> 8;
- set_IAPEN;
- set_APUEN;
- IAPCN = 0x21;
- while (xd_tmp != 0xFF)
- {
- IAPFD = *xd_tmp;
- set_IAPGO;
- IAPAL++;
- xd_tmp++;
- }
- clr_APUEN;
- clr_IAPEN;
- }
复制代码 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|