LPC43xx系列使用IAP的注意事項
LPC43xx IAP函數(shù)的調(diào)用
一般MCU的IAP是,廠商固化一段代碼在芯片的某個區(qū)域,然后告訴你這個代碼的入口地址。
我們一般可以這么做:
typedef void (*IAP_ENTRY_T)(參數(shù)列表)
#define IAP_ADDR (0xdeadbeef) // 假設(shè)的地址
IAP_ENTRY_T const iap_entry = (IAP_ENTRY_T)IAP_ADDR;
這樣我們便可以通過iap_entry來調(diào)用芯片里的固化代碼了。
然而,LPC43xx系列內(nèi)部的布局卻不是這樣。
LPC43xx ROM API結(jié)構(gòu)
上面是LPC43xx內(nèi)部固化代碼的結(jié)構(gòu),可以看出:NXP把固化的函數(shù)的入口地址放到了一個數(shù)組里,然后告訴我們數(shù)組的起始地址,IAP函數(shù)排在第0位。
那么我們可以這樣調(diào)用IAP函數(shù):
/* 定義IAP入口函數(shù)的類型別名 */
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入口函數(shù)的地址提取出來
#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])
{ // 強(qiáng)制轉(zhuǎn)換為函數(shù)指針,然后調(diào)用
((IAP_ENTRY_T)IAP_ENTRY_LOCATION)(cmd_param, status_result);
}
內(nèi)部FLASH操作是的注意事項關(guān)全局中斷
一定要先調(diào)用 Init 命令,再調(diào)用其他命令
擦除或?qū)慒LASH區(qū)塊前,要先調(diào)用Prepare sectors for write operation命令
LPC43xx命令總覽