TMPM3HQ MCU Timer 與 RTC 使用實作

一、 前言

東芝 TMPM3HQ 提供兩種 timer:T32A 與 RTC timer。
T32A timer有區間計時器、事件計數器、輸入捕捉、PPG (PWM) 輸出等計時 / 計數功能。
RTC timer則提供包含從西元年、月、日、星期,到時、分、秒的時鐘計時器功能。

本文主要介紹 T32A 區間計時與透過終端機打印出 RTC 所計時的西元年月日以及時分秒的計時功能專案實作。



實作所需的硬體與工具 :
① 編譯工具:Keil C (MDK:v5.32 以上版本) 或 IAR (建議 v8.50 以上版本)
② TMPM3HQ 軟體開發包
③ 開發板:TMPM3HQ EVM Board
④ 終端模擬器:Tera Team


二、 編譯工具

TMPM3HQ 支援 IAR 與 Keil IDE;

若選擇 Keil 做為編譯環境,還需下載並且安裝 Device Family Pack TXZ3 系列的
Device Family Pack 芯片支援包
https://www.keil.com/dd2/toshiba/tmpm3hpfzfg/#!#eula-container



PS:IAR 的環境搭建,請參考此篇博文: TOSHIBA MCU 環境搭建與實作 GPIO


三、 TMPM3HQ 軟體開發包

東芝提供 TMPM3HQA _v113 軟體開發包:TMPM3HQA_V113.zip
請洽 世平興業 東芝產品線 FAE Chad Lee : chad.lee@wpi-group.com

取得開發包並且解壓縮後,裡面有 TMPM3HQA_v133 這個資料夾,使用者可以將這個資料夾解壓到準備開發 TMPM3HQ 程式碼的資料夾中
(建議路徑不要使用中文或過長的檔案夾名稱)

以下是這包軟體提供的應用參考程式:




四、 開發板介紹

AdBun-M3HQ 為 TMPM3HQ 的開發板,提供客戶熟悉 TMPM3HQ MCU 的使用與功能驗證。

AdBun-M3HQ (EVB) :
適用於東芝 TMPM3HQFDFG MCU
2.54mm 間距 3 pin 跳線連接器 (CN18) 用於電源 3.3V 或 5V 選擇
4 個綠色按鈕開關 (S4、S5、S6、S7)
4個LED (D10、D9、D8、D7)
2 可變電阻 (VR1、VR2)
內置 USB 拖放 FLASH 編程器
RAM 大小 (64Kbytes) 和 BACKUP RAM (2Kbytes)。

M3HQ Group(2) EVM – AdBum-M3HQ




五、 使用實作

演示效果:
① 使用 32-bit Timer (T32A,以下稱為 T32A) 控制每一秒 LED 閃燈
② 使用 RTC 計時,並在終端機打印每一秒的時間

以下的實作,將在 Keil 的編譯環境中進行;演示步驟如下:

(1) 開發板線路圖與 Jump 設定
① 連接 CN12 Pin 53-54 與 Pin 55-56, UART0 : TX ( PA1 ),RX ( PA2 )
② 連接 CN5 的 Pin 33-34,將 PK4 及 LED D10 接在一起

評估板的UART TX 及 RX 及 MCU PA1 與 PA2未接通,因此需手動連接起來)

  




(2) 開啟 Keil 的專案檔並進行編譯
開啟 TMPM3HQA _v113 軟體開發包解壓縮的路徑下“\TMPM3HQA_V113\TMPM3HQA\Examples\RTC\RTC\arm”開啟“RTC.uvoptx”專案檔



在 Keil 開啟該專案檔後,用滑鼠點擊“Rebuild”進行編譯



(3) 設定 UART 終端機
終端機工具程式“Tera Term”中 Serial Port 設定Baud rate 設定為“115200”,並且於 Terminal setup 選單中將 Receive 及 Transmi
都設成“LF”,並且勾選
“Local echo”

  

(4) 將程式下載到 MCU Flash 中開始執行程式
在 Keil 視窗中點擊“Load”按鍵將程式載入 MCU Flash 中,之後用滑鼠點擊“Debug”按鍵,或者按下“Ctrl+F5”功能鍵,進入 Debug 模式



[執行結果]

程式開始執行時,LED D10 每一秒閃爍一次 (500ms LED 熄燈,下一個 500ms LED 亮燈);
並且在終端機打印出年月日以及時分秒的時間





[程式討論]
程式流程如下圖所示



(1) 系統與變數初始化時,將控制流程的變數“proc”初始狀態設定為“START”

(2) 在 application_initialize() 中分別設置 T32A timer:

/* 1ms timer */
{
timer_t *p_timer = &instance.timer;

p_timer->init.id = (uint32_t)&instance.timer;
p_timer->init.p_t32a = &instance.t32a;
p_timer->init.type = bsp_get_timer_type(BSP_TIMER_1MS);
p_timer->init.irq = bsp_get_timer_nvic(BSP_TIMER_1MS);
p_timer->init.interval = 1000;
p_timer->init.handler = timer_interval_handler;
timer_initialize(p_timer);
}​

PS:T32A 的計數器每 1us 會累進加“1”;在區間模式下,設定區間值,會在計數器計數到這個區間設定值時,經由比較器發生中斷,
程式就會跳進指定的區間計時處理副程式。

與 RTC 的時鐘時間設定:

/* Horologe */
{
horol_initial_setting_t param;

param.id = USER_ID_HOROL;
param.setting.century = CFG_HOROL_CENTURY;
param.setting.year = CFG_HOROL_YEAR;
param.setting.notation = CFG_HOROL_HOUR_NOTATION;
param.setting.meridiem = CFG_HOROL_MERIDIEM;
param.setting.month = CFG_HOROL_MONTH;
param.setting.date = CFG_HOROL_DATE;
param.setting.day = CFG_HOROL_DAY;
param.setting.hour = CFG_HOROL_HOUR;
param.setting.min = CFG_HOROL_MIN;
param.setting.sec = CFG_HOROL_SEC;
param.clock_update = clock_update;
instance.p_horol = horol_initialize(&param);
}​

(3) 進入程式主迴圈後,會連續判斷控制流程的變數“proc”是否不等於“ERROR”,做為決定持續留在主迴圈的依據。

(4) 主迴圈的敘述主體由控制 switch … case 的變數“proc”決定程式的狀態與流程

void INTT32A00A_IRQHandler(void) {
irq_timer(BSP_TIMER_1MS);
}
//----------------------------------------
void irq_timer(BSPTimer timer) {
:
timer_irq_handler(&instance.timer);
//----------------------------------------
void timer_irq_handler(timer_t *p_instance) {
t32a_t *p_t32a = p_instance->init.p_t32a;

t32a_timer_IRQHandler(p_t32a);
//----------------------------------------
void t32a_timer_IRQHandler(t32a_t *p_obj) {
:
p_obj->init[T32A_TIMERA].handler_T(p_obj->init[T32A_TIMERA].id, status_a, TXZ_SUCCESS);
//----------------------------------------
void timer_initialize(timer_t *p_instance) {
:
p_init->handler_T = timer_driver_match_handler;
//----------------------------------------
static void timer_driver_match_handler(uint32_t id, uint32_t status, TXZ_Result result) {
timer_t *p_instance = (timer_t *)id;
:
p_instance->init.handler(p_instance->init.id);
//----------------------------------------
static TXZ_Result application_initialize(void) {
:
timer_t *p_timer = &instance.timer;
p_timer->init.handler = timer_interval_handler;
//----------------------------------------
static uint32_t count = 0 ;
static void timer_interval_handler(uint32_t id)
{
led_t *p_led = MAIN_NULL ;
p_led = &instance.led[0];

if (id == (uint32_t)&instance.timer)
{
/* Increment Tick. Tick is used to driver's Timeout. */
hal_inc_tick();
}

count ++ ;
if ( count < 500 ) {
led_turn_off(p_led);
} else {
led_turn_on(p_led);
}
}

[RTC 程式相關處]

當每 1 Hz 發生 RTC 中斷時,會直接進入 INTRTC_IRQHandler() 中斷副程式,
透過 irq_rtc() 呼叫 horol_irq_handler(instance.p_horol) function,
在 horol_irq_handler(instance.p_horol) 將包括 Year、Hour、Day、Month、Date、Minute、Second、Century 等時間資訊更新到 instance.p_horol 中

void INTRTC_IRQHandler(void) {
:
irq_rtc();
}
//-----------------------------------------------------------
void irq_rtc(void)
{
/* Call Horologe IRQ Handler. */
horol_irq_handler(instance.p_horol);
}
//-----------------------------------------------------------
void horol_irq_handler(horol_t *p_instance) {
: // 更新時間資訊的程式碼,詳情請參考原始碼
}​

參考資料文檔
1. 東芝 TMPM3HQA _v113 軟件開發包:TMPM3HQA_V113.zip
請洽 世平興業 東芝產品線 FAE Chad Lee : chad.lee@wpi-group.com

2. 東芝 Flash Memory 參考手冊
M3H(2)_RTC-A_application_note_en_20180518.pdf

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★博文作者未開放評論功能