一、 序言
TPMP34x 是東芝 TX03 系列的 MCU,核心採用 ARM Cortex-M3,最高時脈為 50MHz,主要應用在Surveillance cameras、Digital video cameras、Digital still cameras、Camera lens 上。
東芝提供 TMPM34x Peripheral Driver (以下簡稱為驅動程式),方便客戶使用驅動程式存取底層硬體資源。此外也包含使用 API 所需的巨集、每個 API 所需的自定義資料結構型別和存取相關暫存器的定義值。
以下內容我們以 TMPM341 來進行介紹,而這些使用方式也同樣適用於其他 TMPM34x MCU系列,如 TMPM342 與 TMPM343。
二、 東芝 TMPM34x 周邊驅動程式的檔案架構
\Libraries
這個資料夾包含了所有 CMSIS 檔案和 TMPM34x 周邊驅動程式
\Libraries\TX03_CMSIS
這個資料夾包含了所有 TMPM34x 器件周邊存取層的 CMSIS 檔案
\Libraries\TX03_Periph_Driver
這個資料夾包含了 TMPM34x 的所有周邊驅動程式的源代碼及標頭檔的資料夾
\Libraries\TX03_Periph_Driver\inc
這個資料夾包含了所有 TMPM34x 的各個驅動程式的標頭檔
\Libraries\TX03_Periph_Driver\src
這個資料夾包含了所有 TMPM34x 各個驅動程式的源代碼檔案
\Project_EWARM
這個資料夾包含了 sample code 的 IAR 專案檔案
\Project\Examples
這個資料夾包含了東芝所提供使用 TMPM34x 各個硬體資源的範例程式
三、 應用層、驅動層、硬體層運作架構說明
以下中間紅色框線的部分是 TMPM34x 的 TX03 CMSIS 驅動程式 (即 Driver),
Driver 使用說明:
使用者的 應用層 透過呼叫 TX03 CMSIS 驅動層 Driver去存取 TMPM34x 硬體層
(1) 應用層 ( Application Program ) :
使用者依照產品各項功能所需開發的應用程式,如 IP CAM 的 Zoom / Focus 等功能
(2) 驅動層 ( CMSIS Driver Layer ) :
東芝所提供 TX03 TMPM34x 的 ARM CMSIS 驅動程式,如 GPIO、PHC、ADC、CG、DAC、WDT、OFD、DMAC、
UART、TMRB、TMRD ... 等 API。
(3) 硬體層 ( HW Layer ) :
TMPM34x MCU 所提供的各項周邊裝置,包含 GPIO、PHC、ADC、CG、DAC、WDT、OFD、DMAC、UART、
TMRB、TMRD ... 等硬體資源。
四、 TMPM34x 周邊驅動程式使用方式
(1) 硬體層
在 \Libraries\TX03_CMSIS 這個資料夾底下,包含了東芝“TMPM34x”MCU 的
CMSIS Cortex-M3 內核周邊存取層標頭檔 TMPM34x.h
其所對應的正是 TMPM34x MCU 的所有硬體資源;
諸如各個硬體中斷號碼的定義,對應存取各個硬體資源的暫存器內容的自定義結構型別,
以及每個資源所對應的暫存器在記憶體的直接存取位置。
這個部分,我們可以將之視為第二章節“應用層、驅動層、硬體層運作架構說明”中所提到的硬體層這個部分。
(2) 驅動層
在 \Libraries\TX03_Periph_Driver 這個資料夾底下,包含了 兩個重要的資料夾,
..\inc 與 ..\src
\Libraries\TX03_Periph_Driver\inc
這個資料夾包含了所有 TMPM34x 的各個支援驅動程式 API 所需的標頭檔
這些標頭檔主要支援使用各個 API 時,
♦ 所需設定的參數的自定義資料結構型別,
♦ 要寫入暫存器的對應定義值
\Libraries\TX03_Periph_Driver\src 這個資料夾則包含了所有 TMPM34x 的各個驅動程式的 API 程式碼檔案
這些驅動程式 API 與支援這些 API 的標頭檔合起來,即為驅動層。
當要使用各個驅動程式的 API 時,使用前常需要預先準備許多的參數設定;
以 TMRB 的 Timer 為例,在使用 ..\src\tmpm341_tmrb.c 檔案中的
void TMRB_Init(TSB_TB_TypeDef * TBx, TMRB_InitTypeDef * InitStruct)
這個 API 進行 TMRB 的初始化時,需要帶入兩個引數。
第一個引數是 *TBx 結構變數指標,用以傳遞 TMRB 的暫存器結構資料的位置;
*TBx 指標結構變數以 TSB_TB_TypeDef 這個型別去宣告變數,此型別就定義在
\Libraries\TX03_CMSIS\TMPM341.h
這個標頭檔中所定義的各個資料型別,
真正的意義則是指向該 TMRB 各個暫存器的記憶體存取位置,此即為硬體層
第二個引數是 *InitStruct 結構變數指標,以 TMRB_InitTypeDef 這個型別去宣告;
用以描述將要初始化的這個 TMRB 的各項參數,這些參數將寫入對應的暫存器中。
此結構資料型別定義在 \Libraries\TX03_Periph_Driver\inc\tmpm341_tmrb.h
這個標頭檔裡。
將這兩個引數帶入
void TMRB_Init(TSB_TB_TypeDef * TBx, TMRB_InitTypeDef * InitStruct)
這個 API 中,就可完成 TMRB 的初始化。
其他的 API 的使用方式,同樣也可參照這樣的使用方式運作。
五、 TMPM34x Timer 範例程式
TMPM34x 提供了諸多的周邊驅動程式範例,接下來我們以 TMRB Timer 範例程式碼進行說明。
這是一個基於 TX03 周邊驅動程式(使用到 TMRB、GPIO 硬體資源)的簡單範例。
該範例主要包括:
(1) TMRB0 初始化
(2) 1ms 通用定時器 (這部分非本文所討論的範圍,還請讀者自行參考原代碼程式)
[主程式流程圖]
主程式碼如下:
我們省略 CG 與 LED GPIO 的設定說明,直接介紹 TMRB Timer 的設定
第一個部分:
為準備 TMRB_Init() 這個 API 所需要的重要引數:TMRB_InitTypeDef m_tmrb;
該結構變數的資料成員可參考以下所定義的型別內容
第二個部分:
將 m_tmrb 這個結構變數以指標的方式,連同 “TSB_TB0” 帶入 TMRB_Init() 中完成
TMRB0 Timer 的初始化。
TMRB_Init(TSB_TB0, &m_tmrb);
至於
TMRB_Enable(TSB_TB0);
NVIC_EnableIRQ(INTTB0_IRQn);
及
TMRB_SetRunState(TSB_TB0, TMRB_RUN);
這三行程式碼,
TMRB_Enable(TSB_TB0);
是使用 API 將“TMRB0” enable,
NVIC_EnableIRQ(INTTB0_IRQn);
是使用 API 將 TB0 的中斷 enable,所傳的是 TB0 的中斷號碼,這也是屬於硬體層的。
TMRB_SetRunState(TSB_TB0, TMRB_RUN);
則是使用 API 讓 TB0 的 Timer 功能開始運行;
TMRB_RUN 這個引數,對應到 TBPRUN 及 TBRUN 在 TB0RUN 暫存器所對應的 bit 位置,
因此,在這個暫存器位置寫入 0x00000005 這個數值,即令 TB0 開始運行。
以下為 TMRB0 的中斷副程式,因本篇博文主要在介紹驅動程式 API 的使用方式,以下的程式碼不在本次的討論範圍; 就不予以詳加說明,僅作為附錄提供參考。
參考資料:
東芝 TMPM343 datasheet
東芝 TX03 Peripheral Driver Usage Example (TMPM341)_EN.pdf
東芝 TOSHIBA TX03 Peripheral Driver User Guide (TMPM343)_EN.pdf