We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
Hi, I'm using the P89LPC932A1 and attempting to read the global checksum using IAP during normal program execution. I have used this knowledgebase article as my guide: http://www.keil.com/support/docs/2554.htm So basically, I added this function to my code:
long unsigned IAP_ReadGlobalCRC (void) { ACC = 6; // MOV A,#06H return ((unsigned char (code *)(void)) 0xFF03)(); // LJMP 0FF03H }
return ((unsigned char (code *)(void)) 0xFF03)(); // LJMP 0FF03H
Thank you for replying to my thread. I think I might be "seeing the light". Below, I have posted what this compiles to. Basically it seems that after LCALL FF03, the 32-bit result should be in R4-R7 with the MSB being in R4. But this code looks like it overwrites R4-R6 with 00's and then leaves R7 as is. This would explain why I get 0x000000XX as the return value. However, I'm a bit confused by this c code to begin with. First, why would Keil say that this is the way to do it when the compiler generates code that overwrites the true result. How *should* this be done using c? Much Thanks Philip This is what it compiles to in my project:
; FUNCTION IAP_ReadGlobalCRC (BEGIN) ; SOURCE LINE # 80 ; SOURCE LINE # 81 ; SOURCE LINE # 82 0000 7406 MOV A,#06H ; SOURCE LINE # 84 0002 12FF03 LCALL 0FF03H 0005 E4 CLR A 0006 FC MOV R4,A 0007 FD MOV R5,A 0008 FE MOV R6,A ; SOURCE LINE # 85 0009 ?C0007: 0009 22 RET ; FUNCTION IAP_ReadGlobalCRC (END)
Ouch. Didn't spot this. I think this knowledgebase article has a typo:
long unsigned IAP_ReadGlobalCRC (void) should be unsigned long IAP_ReadGlobalCRC (void)
; FUNCTION IAP_ReadGlobalCRC (BEGIN) ; SOURCE LINE # 80 ; SOURCE LINE # 81 ; SOURCE LINE # 82 0000 7406 MOV A,#06H ; SOURCE LINE # 83 0002 12FF03 LCALL 0FF03H ; SOURCE LINE # 84 0005 ?C0007: 0005 22 RET ; FUNCTION IAP_ReadGlobalCRC (END)