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系列微控制器...