LPC43xx IAP函數的調用
一般MCU的IAP是,廠商固化一段代碼在芯片的某個區(qū)域,然后告訴你這個代碼的入口地址。
我們一般可以這么做:
typedef void (*IAP_ENTRY_T)(參數列表)
#define IAP_ADDR (0xdeadbeef) // 假設的地址
IAP_ENTRY_T const iap_entry = (IAP_ENTRY_T)IAP_ADDR;
這樣我們便可以通過iap_entry來調用芯片里的固化代碼了。
然而,LPC43xx系列內部的布局卻不是這樣。
LPC43xx ROM API結構
上面是LPC43xx內部固化代碼的結構,可以看出:NXP把固化的函數的入口地址放到了一個數組里,然后告訴我們數組的起始地址,IAP函數排在第0位。
那么我們可以這樣調用IAP函數:
/* 定義IAP入口函數的類型別名 */
typedef void (*IAP_ENTRY_T)(unsigned int[5], unsigned int[4]);
// ROM Driver Table的起始地址
#define LPC_ROM_API_BASE_LOC (0x10400100)
// 因為Cortex-M4是32位的,所以用uint32_t類型把IAP入口函數的地址提取出來
#define IAP_ENTRY_LOCATION (*((uint32_t *)LPC_ROM_API_BASE_LOC))
static inline void iap_entry(unsigned int cmd_param[5], unsigned int status_result[4])
{ // 強制轉換為函數指針,然后調用
((IAP_ENTRY_T)IAP_ENTRY_LOCATION)(cmd_param, status_result);
}
內部FLASH操作是的注意事項關全局中斷
一定要先調用 Init 命令,再調用其他命令
擦除或寫FLASH區(qū)塊前,要先調用Prepare sectors for write operation命令
LPC43xx命令總覽