存儲在程序存儲器中的數據不能直接在MAXQ?微控制器上訪問。相反,IAR 嵌入式工作臺?用于調用 C 代碼中的特殊函數,這些功能在微控制器的 ROM 中為此任務提供。本應用筆記解釋了從應用代碼調用ROM所需的步驟。
概述
程序員在使用微控制器時,通常在應用程序代碼中使用查找表。然而,由于MAXQ內核的性質,應用軟件不能直接從代碼空間讀取,因此不能直接訪問應用代碼中定義的任何表。為了緩解這個問題,所有MAXQ微控制器都實現了所謂的“偽馮諾依曼”架構:開發人員可以在程序空間中存儲數據和表,但只能使用特殊的實用程序ROM例程。除了這些核心功能外,每個MAXQ微控制器的ROM都可以具有特定于該器件的例程。本應用筆記描述了使用IAR嵌入式工作臺從代碼訪問這些實用程序ROM功能時必須采取的步驟。
指定函數地址和原型
使用 ROM 功能的第一步是確定這些功能的位置。MAXQ器件用戶指南補充列出了實用程序ROM用戶功能、地址、輸入和輸出。使用此信息查找要調用的函數的入口點。例如,下面的表1(MAXQ48補充的表2000)顯示flashWrite功能位于字地址08461h。
表 1.實用程序 ROM 用戶功能(適用于實用程序 ROM 版本 1.01)
功能編號 | 函數名稱 | 入口點 | 總結 |
0 | 閃寫 | 08461h | 對單個字的閃存進行編程。 |
1 | 閃光擦除頁面 | 08467h | 擦除(FFFFh 的程序)一個 256 字的閃存扇區。 |
2 | frashEraseAll | 08478h | 擦除(程序到 FFFFh)所有閃存。 |
3 | 移動DP0 | 08487h | 在 DP[0] 處讀取一個字節/字 |
4 | 移動DP0inc | 0848安 | 在 DP[0] 處讀取一個字節/字,然后遞增 DP[0]。 |
5 | 移動DP0dec | 0848分 | 讀取 DP[0] 處的字節/字,然后遞減 DP[0]。 |
6 | 移動DP1 | 08490h | 在 DP[1] 處讀取一個字節/字。 |
7 | 移動DP1inc | 08493h | 在 DP[1] 處讀取一個字節/字,然后遞增 DP[0]。 |
8 | 移動DP1dec | 08496h | 讀取 DP[1] 處的字節/字,然后遞減 DP[0]。 |
9 | 移動FB | 08499h | 讀取 BP[關閉] 處的字節/字。 |
10 | 移動FPinc | 0849通道 | 讀取 BP[Offs] 處的字節/字,然后遞增 Offs。 |
11 | 移動FPdec | 0849Fh | 讀取 BP[Offs] 處的字節/字,然后遞減 Offs。 |
12 | 復制緩沖區 | 084A2h | 將 LC[0] 值從 DP[0] 復制到 BP[關閉]。 |
現在,各種功能的入口點已經知道,IAR嵌入式工作臺可以配置為使用這些地址。從“項目”菜單中選擇“選項”。在出現的對話框中,從“類別”列表中選擇“鏈接器”。單擊“額外選項”選項卡,并確保選中標有“使用命令行選項”的框。在選項列表中,您必須為要使用的每個實用程序ROM功能添加一個項目;指定該函數的地址。這些選項應具有以下格式: 《function_name》是將從應用程序代碼調用的函數名稱。它不必與上表中給出的名稱匹配,但它必須是有效的 C 代碼函數名稱。《hexadecimal_byte_address》是 ROM 函數入口點的字節地址。由于該表列出了單詞地址,因此您需要將它們乘以 1 才能將它們轉換為字節地址。下面是一個MAXQ2000項目選項示例(圖《》),該項目使用三個ROM功能。
-D=
圖1.MAXQ2000項目示例使用三個ROM功能。
若要使這些函數可通過應用程序代碼訪問,請使用在“選項”屏幕中指定的相同名稱為每個函數聲明原型。參數傳遞將在下一節中討論,因此現在聲明每個原型不接受任何參數且沒有返回值。
extern void utilFlashWrite(void); extern void utilFlashErasePage(void); extern void utilMoveDP0(void);
創建包裝函數
現在可以直接從應用程序代碼調用 ROM 函數。但是,有一個警告。由于函數通常在與IAR編譯器使用的寄存器不同的寄存器中接受其輸入參數,因此這些函數可能會破壞編譯器所依賴的寄存器。這些函數可能還需要在禁用中斷的情況下執行。因此,您應該創建一些幫助程序函數來處理這些問題。對于要調用的每個 ROM 函數,確定:它接受哪些輸入;它提供的輸出;以及它銷毀的寄存器。所有這些信息都可以在MAXQ器件的用戶指南補充中找到。
繼續上面的例子,可以看到MAXQ2000的flashErasePage函數有如下說明:
功能:閃存擦除頁面
摘要:擦除(程序到0FFFFh)265字的閃存頁。
輸入:A[0]:位于要擦除的頁面中的單詞地址。(頁碼是 A[0] 的高字節。
輸出:進位:錯誤時設置,成功時清除。
摧毀:PSF,LC[1],GR,AP,AP,APC
筆記:
如果看門狗復位功能處于活動狀態,則應在調用此函數之前將其禁用。
從 flash 調用此函數時,應注意返回地址不在要擦除的頁面中。
使用此信息,您可以創建一個調用 flashErasePage 的幫助程序函數。除了實際調用實用程序 ROM 函數外,此幫助程序函數還需要執行四個附加步驟:
配置 ROM 功能的輸入。
保存并恢復 ROM 功能銷毀的任何保留寄存器。
處理 ROM 函數的輸出。
保存、禁用和恢復調用 ROM 函數周圍的中斷。
準備輸入
此示例 ROM 函數接受 A[0] 作為其輸入,設置 A[0] 非常簡單。我們可以通過使用一些IAR關鍵字和宏為MAXQ中的任何寄存器聲明一個變量。要為 A[0] 聲明變量,請添加以下語句:
__no_init volatile __io unsigned int A0 @ _M(0x09,0x00);
特別注意_M宏的數據類型和輸入。此變量 A0 被聲明為“無符號 int”,因為它是一個 16 位寄存器。如果它是一個 8 位寄存器,我們可以將其聲明為“無符號字符”。_M宏的輸入是模塊編號,后跟A[0]寄存器的偏移。現在,您只需將此變量設置為 A[0] 中所需的值即可。
A0 = pageAddr;
保存特殊登記冊
以上述方式使用寄存器時必須小心,因為編譯器希望某些寄存器不會從一個函數調用更改為下一個函數調用。MAXQ IAR C編譯器參考指南列出了以下寄存器(表2)作為暫存器。您可以在不干擾程序流的情況下銷毀這些寄存器。此外,APC 和 DP[1] 寄存器以及 DPC 寄存器的位 0、1 和 3 在任何時候都不應修改。如果函數更改了任何其他寄存器,則應在退出該函數之前恢復它們。
表 2.暫存寄存器1
MAXQ10器件 | MAXQ20器件 |
A[0], A[1], A[2], A[3], GR, LC[0], LC[1], DP[0], BP, OFFS, AP |
A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], GR,LC[0], LC[1], DP[0]。英國石油公司,關閉,美聯社 |
flashErasePage 描述將 APC 列為已銷毀的寄存器之一,因此您必須確保在調用 utilFlashErasePage 之前保存并恢復該寄存器。如果您使用 IAR 的 asm() 函數,此任務也很簡單。MAXQ匯編語句可以使用這個函數直接插入到C代碼中。由于需要保存 APC,因此只需在調用 utilFlashErasePage 時添加 asm(“push APC”) 和 asm(“pop APC”) 語句即可。
處理 ROM 函數的輸出
處理 ROM 函數的返回類似于處理輸入。您可以直接讀取相應的寄存器。例如,flashErasePage函數設置錯誤的進位。您可以使用 IAR 提供的 iomaxq.h 頭文件中聲明的PSF_bit結構直接訪問此位。
return (PSF_bit.C == 0);
保存、禁用和恢復中斷
要考慮的最后一個任務是是否需要禁用中斷。大多數實用程序ROM例程都假定它們不會被中斷。因此,如果您的應用程序使用中斷,明智的做法是在調用實用程序 ROM 函數之前禁用它們。禁用它們的最簡單方法是使用 iomaxq.h 頭文件中定義的IC_bit結構和 intrinsics.h 文件中定義的 __disable_interrupt() 函數。
unsigned char origIGE = IC_bit.IGE; // Save current state. __disable_interrupt(); /* Add UROM call code here. */ IC_bit.IGE = origIGE; // Restore interrupt state.如果執行所有這些步驟,您將獲得類似于以下內容的代碼:
#include#include // Prototype for the real Utility ROM function. extern void utilFlashErasePage(void); // Define the register we need direct access to. __no_init volatile __io unsigned int A0 @ _M(0x09,0x00); unsigned char flashErasePage(unsigned int page) { unsigned int pageAddr; unsigned char origIGE; pageAddr = page << 8; // Change page # to an address. origIGE = IC_bit.IGE; // Save current state. __disable_interrupt(); A0 = pageAddr; // Set up input to UROM function. asm("push APC"); // UROM function destroys APC. utilFlashErasePage(); // Call actual UROM function. asm("pop APC"); // Restore APC. IC_bit.IGE = origIGE; // Restore interrupt state. return (PSF_bit.C == 0); // Check return code from UROM. }
結論
使用上述步驟,您可以輕松調用每個MAXQ微控制器的實用程序ROM中提供的功能。您可以創建函數包裝器,利用MAXQ實用程序ROM中的代碼訪問查找表,在程序空間中存儲數據,以及MAXQ系列器件獨有的其他功能。
審核編輯:郭婷
-
微控制器
+關注
關注
48文章
7660瀏覽量
152185 -
嵌入式
+關注
關注
5095文章
19189瀏覽量
307992 -
ROM
+關注
關注
4文章
575瀏覽量
86034
發布評論請先 登錄
相關推薦
請問哪里可以找到用于IAR Embedded Workbench的STM32G0處理器的啟動文件?
采用MAXQ610評估套件(EV kit)和IAR嵌入式工作
![采用<b class='flag-5'>MAXQ</b>610評估套件(EV kit)和<b class='flag-5'>IAR</b><b class='flag-5'>嵌入式</b><b class='flag-5'>工作</b>](https://file1.elecfans.com//web2/M00/A4/87/wKgZomUMNJqALB11AAAxPzWCZbo282.jpg)
采用MAXQ610評估套件(EV kit)和IAR嵌入式工作
![采用<b class='flag-5'>MAXQ</b>610評估套件(EV kit)和<b class='flag-5'>IAR</b><b class='flag-5'>嵌入式</b><b class='flag-5'>工作</b>](https://file1.elecfans.com//web2/M00/A4/CD/wKgZomUMNb-Aai6tAAAxPzWCZbo854.jpg)
基于MAXQ微控制器的嵌入式工作臺設計
用于MSP430的IAR嵌入式工作平臺版本3+
使用用于MCS-51的IAR嵌入式平臺編寫的一個示例程序程序免費下載
![使用<b class='flag-5'>用于</b>MCS-51的<b class='flag-5'>IAR</b><b class='flag-5'>嵌入式</b>平臺編寫的一個示例<b class='flag-5'>程序</b><b class='flag-5'>程序</b>免費下載](https://file.elecfans.com/web1/M00/A3/60/o4YBAF1VBtOAVjWPAAKM1y4hkoY622.png)
IAR Systems更新Visual Studio Code擴展 簡化嵌入式開發工作流程
使用MAXQ2000和MAX7312進行LED打靶練習游戲
![使用<b class='flag-5'>MAXQ</b>2000和MAX7312進行LED打靶練習游戲](https://file.elecfans.com//web2/M00/8B/3F/pYYBAGPCUn2AebvYAABB3uqPPCI468.gif)
將LCD仿真器與MAX-IDE和IAR嵌入式工作臺開發環境配合使用
![將LCD仿真器與MAX-IDE和<b class='flag-5'>IAR</b><b class='flag-5'>嵌入式</b><b class='flag-5'>工作臺</b>開發環境配合使用](https://file.elecfans.com//web2/M00/95/B1/pYYBAGQBikiAZp7lAAAYY7Ejl_M115.gif)
適用于MSP430 MCUs的IAR嵌入式工作臺IDE版本7+
![適<b class='flag-5'>用于</b>MSP430 MCUs的<b class='flag-5'>IAR</b><b class='flag-5'>嵌入式</b><b class='flag-5'>工作臺</b>IDE版本7+](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論