LPC11Uxx系列 IAP介紹

2021-08-25 08:43:51 字數 1664 閱讀 2519

void *fun()  ——  宣告乙個返回值是任意型別的指標的函式fun()

void (*)()  ——  這是一種變數型別,用來定義函式指標變數

一般做法:

兩部分**都同時燒錄在user flash中,晶元上電後從boot loader程式開始執行,其功能主要是:

需要則執行更新操作

保證偏移量為0x200的倍數;

irom1的位址區域和iram1的位址區域不能重疊;

lpc11uxx系列iap介紹

boot loader大小為16kb,起始位址為0x1fff0000,復位後,駐留在片內flash儲存器引導模組中的中斷向量也將變為有效,即引導模組底部的512個位元組也將出現在起始位址為0x00000000的儲存器區域中。

lpc11uxx通過usb連線被pc列舉成msc裝置時,其快閃儲存器空間表示為主機檔案系統中的驅動器,對映在主機資料夾中預設名稱為firmware.bin的檔案中,使用者可通過複製新的firmware.bin檔案實現快閃儲存器**更新。

iap 例程應該通過暫存器r0的字指標來呼叫,其指向包含命令**和引數的記憶體(ram)。

iap程式是thumb**,駐留在位址0x1fff1ff0處,定義

#define   iap_location    0x1fff1ff1ul

定義iap函式的資料架構或指標來傳遞iap命令表和結果表

unsigned long command[5];

unsigned long result[4];

定義函式型別的指標,它有兩個引數並返回void,iap返回的結果帶有駐留在r1中的表的基址

#define iap_execute_cmd(a, b)            ((void (*)())(iap_rom_location))(a, b)

或者typedef void (*iap)(unsigned int ,unsigned int);

iap iap_entry;

iap_entry=(iap)iap_location;

------將iap_rom_location這個位址轉化為返回void的函式指標,這個函式接收連個引數,並把這個函式定義為iap_execute_cmd(a,b)

呼叫iap,可使用以下方法

iap_entry(command,result);

或者iap_execute(command,result);

r0用來存放命令**和引數,命令結果返回在r1暫存器中

iap中相關操作舉例分析(命令**由使用者事先定義好值)

1、iap_preparesectors(準備寫操作扇區)

三個引數(依次存放進command陣列中)

返回狀態result[0]

該命令必須在執行「將ram 內容複製到flash」或「擦除扇區」命令之前執行

2、iap_copyramtoflash(將ram內容複製到flash)

5個引數

返回碼同理,相關的操作還有擦除扇區、空白檢查扇區、讀取器件id、讀boot**版本、重呼叫isp、讀uid、eeprom讀寫等

LPC11U35 電源管理

一共有工作 睡眠 深度睡眠 掉電和深度掉電模式,後4種不支援除錯模式。各種模式特定與wwdt對其的影響 工作模式 允許irc或看門狗振盪器,核心和儲存器由系統時鐘計時,外設有系統或專用時鐘計時。深度睡眠模式 允許irc和看門狗振盪器。核心的系統時鐘停止,復位或中斷之前都不能執行指令,外設功能繼續執行...

LPC1700系列晶元記憶體注意問題

在amr晶元中記憶體空間是越來越大了,而我們的使用需求也是水漲船高。而不同arm晶元的記憶體分配也是截然不同。例如同樣是64k的stm32,只要你的陣列定義在64k內就可以操作的,而64k的lpc晶元則不能定義64k的陣列。這個問題恐怕困擾了不少。產生這一問題的主要原因是不同晶元記憶體架構是不一樣的...

LPC11U3x儲存器對映

1 mcu不同變數的儲存位置 區域性變數 棧區 stack 由編譯器自動分配和釋放 區域性靜態變數 靜態區 程式結束後由系統釋放 全域性變數 靜態區的常量區 全域性靜態變數 靜態區 堆區 heap 一般由程式設計師自行分配和釋放,分配malloc和new申請的區域 2 cortex m0系列微控制器...