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.
I am trying to read UID value from LPC11xx chip. My code is running ok, until I try to read UID. After that, well after few other things that run on the uC it ends up in HardKernel. I guess stack overflow or something, but I dont see anything wrong in iap call..
#define IAP_ADDRESS 0x1FFF1FF1 struct iap_commands{ enum CMD { eReadUID = 58 }; }; unsigned int param_table[5]; unsigned int result_table[5]; typedef void(*iap)(unsigned int [], unsigned int []); iap iap_entry; void read_serial_num () { iap_entry = (iap)IAP_ADDRESS; param_table[0] = iap_commands::eReadUID; iap_entry (param_table, result_table); }
It is totally same whether I call this function at the beginning of main or at some other place, it would always end up with HardKernel. Same use case but without call of read_serial_num runs fine.
I am not really near the RAM or ROM limit of uC.
I am using C++. Am I missing some extern "C" somewhere ?
After searching for the problem I noticed that my stack gets overwritten ... Then I found that IAP functions are located in memory that is used by stack and that I need to reserve those last 32 bytes of SRAM for IAP.
How do I configure that in Keil ?
Just shrink the size of the RAM block in the project settings - or in the scatter file, in case you are using a manually created scatter file.