|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
Keil c51編譯器問題,請進(jìn)來研究研究.急! |
| 作者:qqkevin 欄目:單片機(jī) |
小弟近來用SST的單片機(jī),想使用那單片機(jī)的IAP功能,今天程序?qū)懲暧肒EIL一仿真出了怪事,現(xiàn)在羅列出來給高手們看看. #include <REG52.H> sfr SFCF = 0xB1; /*FLASH配置位*/ sfr SFCM = 0xB2; /*FLASH命令位*/ sfr SFAL = 0xB3; /*FLASH地址低位*/ sfr SFAH = 0xB4; /*FLASH地址高位*/ sfr SFDT = 0xB5; /*FLASH數(shù)據(jù)位*/ sfr SFST = 0xB6; /*FLASH狀態(tài)位*/ #define SFCM_SE 0x0B; /*扇區(qū)擦除IAP指令*/ #define SFCM_VB 0x0C; /*字節(jié)校讀IAP指令*/ #define SFCM_PB 0x0E; /*字節(jié)編程IAP指令*/ void sector_erase(unsigned SHORT int dataAddr); void main() { unsigned SHORT int destAddr = 0x80; sector_erase(destAddr); /*寫數(shù)據(jù)前先擦除要寫的扇區(qū)*/ } void sector_erase(unsigned SHORT int dataAddr) { SFCF = SFCF | 0x40; /*IAP使能*/ SFAH = dataAddr>>8; /*存入地址的高位字節(jié)*/ SFAL = dataAddr; /*存入地址的低位字節(jié)*/ SFCM = SFCM_SE; /*發(fā)出扇區(qū)擦除指令*/ return; } 下面是KEIL編譯后的匯編指令: 26: void sector_erase(unsigned SHORT int dataAddr) C:0x0003 AD07 MOV R5,0x07 C:0x0005 AC06 MOV R4,0x06 27: { 28: 29: SFCF = SFCF | 0x40; /*IAP使能*/ C:0x0007 43B140 ORL SFCF(0xB1),#0x40 30: SFAH = dataAddr>>8; /*存入地址的高位字節(jié)*/ C:0x000A 8CB4 MOV SFAH(0xB4),R4 31: SFAL = dataAddr; /*存入地址的低位字節(jié)*/ C:0x000C 8DB3 MOV SFAL(0xB3),R5 32: SFCM = SFCM_SE; /*發(fā)出扇區(qū)擦除指令*/ 33: 34: return; C:0x000E 75B20B MOV SFCM(0xB2),#0x0B 35: } C:0x0011 22 RET C:0x0012 787F MOV R0,#0x7F C:0x0014 E4 CLR A C:0x0015 F6 MOV @R0,A C:0x0016 D8FD DJNZ R0,C:0015 C:0x0018 758107 MOV SP(0x81),#0x07 C:0x001B 02001E LJMP main(C:001E) 15: void main() 16: { 17: unsigned SHORT int destAddr = 0x80; 18: 19: 20: C:0x001E 7F80 MOV R7,#P0(0x80) C:0x0020 7E00 MOV R6,#0x00 21: sector_erase(destAddr); /*寫數(shù)據(jù)前先擦除要寫的扇區(qū)*/ C:0x0022 020003 LJMP sector_erase(C:0003) 看,sector_erase(unsigned SHORT int dataAddr);的入口變量恒為0x0607了,且無論我如何修改dataAddr的值,R4跟R5寄存器的值還是不變.也就是外部的值怎么都傳不到dataAddr里去. 我還寫多了兩個子程序byte_program(destAddr, origData);verifyData=byte_verify(destAddr); 還是會出現(xiàn)同樣的問題,請問大家之前有沒遇見過這個問題.該怎么解決呢? 還有個問題,IAP功能可以在KEIL的仿真環(huán)境下觀察EEPROM里面的數(shù)據(jù)嗎? |
| 2樓: | >>參與討論 |
| 作者: lg3459 于 2005/12/5 14:33:00 發(fā)布:
就這樣。。 R4、R5寄存器保存的是0X06、0X07單元的內(nèi)容,也就是MOV R4,R6,MOV R5,R7 再一個,SHORT 和int 都是16位的,沒必要定義2次吧? |
|
| 3樓: | >>參與討論 |
| 作者: qqkevin 于 2005/12/5 15:29:00 發(fā)布:
請問KEIL是不是.. 原來是這樣,又學(xué)到東西了,謝謝樓上的高手. 請問在KEIL是不是不可以用查看CODE變量的方式來看IAP過的那些EEPROM寄存器的數(shù)值呢? 如果不可以的話那有沒什么比較方便的方法來驗(yàn)證我程序的效果呢? |
|
|
|
| 免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |