在TivaWareTM for C系列軟件驅動程序庫中,提供了兩種編程模型來支持用戶的程序開發:直接寄存器訪問(DRA)模型和軟件驅動程序(SD)模型。根據用戶對其應用程序的需求或開發人員所需的編程環境,可以獨立使用或組合使用每個模型
使用DRA模型的優點是可以在較小的規模下開發目標程序,效率較高。但是開發人員需要非常詳細地了解處理器和外圍硬件體系結構、接口配置以及詳細的接口參數。通過使用SD模型,用戶無需過多了解外圍硬件體系結構和接口配置,可以通過驅動程序庫輕松構建接口功能,實現對外圍設備的控制和接口,從而獲得所需達到的目標
在SD模型中,外圍驅動程序庫提供了一個相關的應用程序接口(API),該API允許用戶通過該API中涉及的一組接口函數訪問和控制外圍設備。由於這些驅動程序在正常操作模式下提供了對外圍設備的完全控制,因此可以在不直接訪問硬件的情況下編寫整個應用程序。這種方法提供了應用程序的快速開發,而不需要詳細的知識
接下來,我們將使用組合模型來構建和開發我們的應用程序項目。換句話說,我們將結合DRA模型和SD模型來構建我們的應用程序。在我們的程序中,我們可以使用DRA模型直接訪問硬件,包括與mcu相關的寄存器、內存和外圍設備。在其他一些部分,我們可以調用驅動程序庫提供的API函數來間接地訪問和控制硬件和外圍設備來實現我們的目標。
首先,讓我們通過一個示例項目來研究直接寄存器訪問(DRA)模型。
在直接寄存器訪問(DRA)模型中,用戶可以通過直接將值寫入外設寄存器來訪問和控制外設。用戶需要使用外圍驅動程序庫提供的一組寄存器宏或寄存器符號定義來簡化編碼過程。這些寄存器符號定義存儲在inc目錄中包含的特定於mcusific頭文件中。頭文件的名稱與MCU號匹配。例如,TM4C123GH6PM MCU的頭文件位於D:\ti\TivaWare_C_Series-2.1.4.178(此目錄為上一節的安裝目錄)下的inc/ TM4C123GH6PM .h目錄中
在我們繼續討論如何使用DRA模型來構建我們的示例項目之前,首先讓我們仔細看看本例中使用的硬件體系結構。
端口上的PF4和PF0引腳分別連接到兩個板載按鈕,即SW1和SW2。其余三個引腳PF1、PF2和PF3連接到三個不同顏色的led上。事實上,在我的這套開發板中,這三個LED集成到一個三色LED中,可以由F端口的三個引腳驅動。
在本例中,我們使用連接到綠色LED的PF3作為輸出引腳來驅動LED開關,進行閃爍操作。
要使GPIO端口正常工作,首先需要按照以下順序初始化和配置GPIO端口:
1. 通過在GPIO運行中設置適當的位,使系統時鍾能夠驅動GPIO Run Mode Clock Gating Control (RCGCGPIO) 寄存器。
2. 通過編程GPIODIR寄存器,為GPIO端口上的每個引腳設置方向。
3.通過在GPIODEN寄存器中設置適當的DEN位,使GPIO引腳成為數字I/O引腳。
4. 還可以選擇配置GPIOAFSEL寄存器,將每個位作為GPIO模式或備用模式進行編程。這個步驟是可選的,因為大多數端口在系統重置后以GPIO模式工作。
為了有效地使用符號定義來定義和使用這些寄存器來成功地初始化和控制GPIO PORTF,我們需要仔細研究一下端口F使用的這些寄存器的結構和位函數。
•通用運行模式時鍾門控寄存器(RCGCGPIO)
•GPIOPORTF方向寄存器(GPIOPORTFDIR)
•GPIOPORTF數字啟用寄存器(GPIOPORTFDEN)
•GPIOPORTF數據寄存器(GPIOPORTFDATA)
由於GPIO備用模式選擇寄存器(GPIOAFSEL)將在系統復位后設置為在GPIO模式下工作,並且GPIO高性能總線控制寄存器被設置為在系統重置后使用高級外圍總線(APB),因此我們可以暫時跳過本例中設置的這兩個寄存器。
為了初始化GPIO端口並提供一個系統時鍾端口,應該使用GPIO運行模式時鍾門控(RCGCGPIO)寄存器 。該寄存器為軟件提供了在運行模式下啟用和禁用GPIO模塊的功能。當啟用時,將為端口提供時鍾,並允許訪問端口寄存器。當被禁用時,時鍾將被禁用以節省電能,對端口寄存器的訪問將生成總線故障。
由於RCGCGPIO寄存器和RCGC2寄存器具有類似的功能,我們在本例中使用后者初始化GPIO端口f。這個寄存器在片上內存映射中的內存映射地址是0x400FE108。
在這個示例項目中,我們只需要使用三個與GPIO PORTF相關的寄存器:
1. PORTF數據寄存器(GPIO_PORTF_DATA_R)。
2. PORTF方向寄存器(GPIO_PORTF_DIR_R)。
3.PORTF數字使能寄存器(GPIO_PORTF_DEN_R)。
雖然每個GPIO端口使用的寄存器都是32位的,但是只使用了最低的8位,其中每個位對應於每個pin。
當在高級外圍總線(APB)光圈中工作時,這些寄存器的內存映射地址為
•PORTF數據寄存器(GPIO_PORTF_DATA_R): 0x400253FC
• PORTF方向寄存器(GPIO_PORTF_DIR_R): 0x40025400
•PORTF數字使能寄存器(GPIO_PORTF_DEN_R) : 0x4002551C
由於這個項目非常簡單,我們只使用一個頭文件“DRAModel.h”和一個名“DRAModel.c”的應用程序文件。
使用Keil ARM-MDK開發微控制器應用程序的一般步驟包括:
1. 創建一個新的μVersion5項目與單片機的選擇和MDK core/ CMSIS core。
執行以下操作來創建這個新的項目DRAModel:
1. 打開我的電腦,在D盤下創建一個名為\ARMClassProjects\Chapter4/DRAModel的新文件夾:
2. 打開Keil μVersion5去Project|new μVersionproject 菜單項創建一個新的μVersion項目。在打開的向導中,瀏覽到我們的新文件夾(在上面的步驟1中創建的DRAModel)。在“文件名”框中輸入DRAModel,然后單擊“保存”按鈕創建該項目。
3.在下一個向導中,您需要為這個項目選擇設備(MCU)。展開:Texas Instruments、Tiva C Series和TM4C123x Series,並選擇TM4C123GH6PM ,單擊OK關閉此向導。
4. 接下來會打開軟件組件向導,您需要使用該向導為您的項目設置軟件開發環境。展開兩個圖標,CMSIS和Startup ,並選中Sel中的CORE和Startup復選框。,然后單擊OK按鈕,因為我們需要這兩個組件來構建項目。
2. 創建用戶的頭文件並將它們添加到項目中。
執行以下操作來創建這個新的頭文件DRAModel.h:
1. 在“Project”窗格中,展開目標文件夾,右鍵單擊“Source Group 1 ”文件夾,並選擇“Add New Item to Group ‘Source Group 1’ ”添加新項。
2. 選擇Header File (.h)並在Name:框中輸入DRAModel,然后單擊Add按鈕將此文件添加到項目中。
3.將下面的代碼輸入到這個頭文件中,然后單擊file |Save菜單項來保存這個文件(或者Ctrl+s)。

1 /**************************************************** 2 ****DRAModel.h-Header file for the sample prcject DRAModel.c ****************************************************/ 3 //System Control registers (SYSCTL) 4 #define SYSCTL_RCGC2_R (*((volatile uint32_t")0x400FE108)) 5 #define SYSCTL RCGC2 GPIOF 0x00000020 // Port F Clock Gating Control 6 //GPIO registers (PORTF) 7 #define GPIO PORTF DIR_R (*((volatlle ulnt32_t*)0x40025400)) 8 #define GPIO_PORTF_DEN_R (*((volatile uint32t ")0x4002551C)) 9 #define GPIO PORTF DATA_R (*((volatile uint32t)0x400253FC)) 10 11
3.創建用戶的C源文件並將它們添加到項目中。
執行以下操作來創建這個新的源文件DRAModel.c:
1. 在“Project”窗格中,展開目標文件夾,右鍵單擊“Source Group 1 ”文件夾,並選擇“Add New Item to Group ‘Source Group 1’ ”添加新項。
2. 選擇C File (.c)並在Name:框中輸入DRAModel,然后單擊Add按鈕將此源文件添加到項目中。
3.將下面的代碼輸入到這個源文件中,然后單擊file |Save菜單項來保存這個文件,(或者Ctrl+s)。

//********************************************* // DRAModel.c -Main Application File for the Sample Project //********************************************* #include <stdint.h> #include "DRAModel.h" int main(void) { volatile uint32 t ui32Loop; SYSCTL_RCGC2_R= SYSCTL RCGC2_GPIOF; // Enable PORTF in RCGC2 //Do a dummy read to insert a few cycles after enabling the peripheral. ui32Loop =SYSCTL RCGC2 R; GPIO PORTF_DIR_R= 0x08;// Set PF3 pin as output pin GPIO PORTF DEN_R= 0x08;// Enable PF3 pin for digital function while(1)//Loop forever. { GPIO PORTF DATA R = 0x08;// Set PF3 pin to turn on LED. for(ui32Loop = 0; ui32Loop < 200000; ui32Loop++)// Delay for a bit { } GPIO_PORTF DATA_R &=~(0x08); // Reset PF3 pin to tum off LED. for(ui32Loop = 0; ui32Loop < 200000; ui32Loop++)// Delay for a bit { } } }
4. 系統頭文件和其他頭文件包含到項目通過將它們添加到項目或使用包括路徑函數ARM-MDKμVersion5。
1. 這個頭文件是一個Keil ARM-MDK C/ c++編譯器系統頭文件,用於定義C/ c++文件中使用的所有整數數據類型。此文件位於MDK μVersion5安裝所在的文件夾中(例如 C:\Keil_v5\ARM\ARMCC\include )。
5. 通過將外部函數、變量和其他C源文件放在當前項目文件夾下,將它們包含到項目中。
6. 鏈接項目庫(靜態庫或動態庫)
在這個示例項目中,我們沒有使用任何靜態或動態鏈接庫,因為我們使用了直接寄存器訪問模型。因此,我們不需要對這一步做任何事情。然而,在其他一些項目中,要么是靜態鏈接庫,要么是動態鏈接庫,比如使用TivaWareTM外圍設備驅動程序庫時,必須執行此步驟。否則,您根本無法運行項目。
去Project | Build Target 菜單項,以編譯此示例項目並將其與系統文件鏈接,以生成項目映像或可執行文件。如果這個示例項目沒有問題,則應該在底部的Build Output窗口中顯示0 Error(s) with 0 Warning(s) 的輸出。
通過使用Flash|Download 菜單項,可以將項目圖像文件下載到閃存中。現在,您可以通過進入Debug| run菜單項來運行這個程序。當程序運行時,你會發現綠色的LED會一直閃爍。確保您使用的調試器是Stellaris ICDI,可以從項目菜單下的“目標1”項選項中的Debug選項卡中選中它。