在我們之前的Nuvoton 微控制器教程中,我們使用了一個基本的 LED 閃爍程序作為入門指南,并將 GPIO 接口作為連接觸覺開關的輸入。通過該教程,我們完全了解如何配置 Keil 項目并設置編程 N76E003 Nuvoton 微控制器的環境。是時候使用微控制器單元的內部外圍設備了,并通過使用N76E003的內置定時器進一步移動一點。在本教程中,我們將學習如何使用定時器延遲功能以及定時器 ISR(中斷服務程序)并閃爍兩個單獨的 LED。
硬件設置和要求
由于本項目的要求是學習Timer ISR 和 timer delay 函數,我們將使用兩個 LED,其中一個在 while 循環中使用 timer delay 閃爍,另一個在 ISR 函數中閃爍。
由于 N76E003 開發板中提供了 LED,因此該項目需要一個額外的 LED 和限流電阻來限制 LED 電流。我們需要的組件 -
LED的任何顏色
100R電阻
更不用說,除了上述組件,我們還需要基于N76E003 微控制器的開發板以及Nu-Link 編程器。此外,還需要面包板和連接線來連接所有組件。
LED與Nuvoton N76E003接口的電路圖
正如我們在下面的示意圖中看到的,測試 LED 在開發板內部可用,它連接在端口 1.4 上。一個額外的 LED 連接到端口 1.5。電阻 R3 用于限制 LED 電流。在最左側,顯示了編程接口連接。
Nuvoton N76E003 上的定時器引腳
N76E003的引腳圖如下圖所示——
正如我們所看到的,每個引腳都有不同的規格,每個引腳都可以用于多種用途。但是,用作 LED 輸出引腳的引腳 1.5 將失去 PWM 和其他功能。但是,這不是問題,因為該項目不需要其他功能。
選擇引腳 1.5 作為輸出和引腳 1.6 作為輸入的原因是因為 GND 和 VDD 引腳最近可用,以便于連接。但是,在這個微控制器的 20 個引腳中,有 18 個引腳可以用作 GPIO 引腳,任何其他 GPIO 引腳都可以用于輸出和輸入相關用途,除了引腳 2.0 專用于復位輸入,不能用作輸出。所有 GPIO 引腳都可以在下面描述的模式下進行配置。
根據數據表,PxM1.n 和 PxM2.n是兩個寄存器,用于確定 I/O 端口的控制操作。由于我們使用的是 LED,并且我們需要該引腳作為通用輸出引腳,因此我們將使用準雙向模式作為引腳。
Nuvoton N76E003 中的定時器寄存器
對于任何微控制器單元來說,定時器都是很重要的。微控制器帶有一個內置的定時器外設。nuvoton N76E003 還配備了16 位定時器外設。然而,每個定時器用于不同的目的,在使用任何定時器接口之前,了解定時器是很重要的。
新唐N76E003中的時間類型
定時器 0 和 1:
這兩個定時器 timer0 和 timer1 與 8051 定時器相同。這兩個定時器可用作通用定時器或計數器。這兩個定時器以四種模式運行。在模式 0中,這些定時器將在 13 位定時器/計數器模式下運行。在模式 1中,這兩個定時器的分辨率位將為 16 位。在模式 2中,定時器配置為具有 8 位分辨率的自動重載模式。在模式 3中,定時器 1 暫停,定時器 0 可同時用作計數器和定時器。
在這四種模式中,大多數情況下使用模式 1。這兩個定時器可以在固定或預分頻模式(Fys / 12)下使用 Fsys(系統頻率)。它也可以由外部時鐘源提供時鐘。
定時器 2:
定時器 2 也是一個 16 位定時器,主要用于波形捕捉。它還使用系統時鐘,并且可以通過使用 8 個不同的比例來劃分時鐘頻率,從而在不同的應用中使用。它也可以用于比較模式或產生 PWM。
與 Timer 0 和 Timer 1 一樣,Timer 2 可以在自動重載模式下使用。
定時器 3:
定時器 3 也用作 16 位定時器,用作 UART 的波特率時鐘源。它還具有自動重新加載功能。如果應用程序需要 UART 通信,請務必將此定時器僅用于串行通信 (UART)。在這種情況下,由于計時器設置中的沖突過程,建議不要將此計時器用于其他目的。
看門狗定時器:
看門狗定時器可用作標準的 6 位定時器,但不用于此目的。看門狗定時器用作通用定時器適用于微控制器大部分處于空閑模式的低功耗應用。
看門狗定時器,顧名思義,總是檢查微控制器是否正常工作。在微控制器掛起或停止的情況下,WDT(看門狗定時器)會自動復位微控制器,確保微控制器在連續的代碼流中運行,而不會出現卡住、掛起或停止的情況。
自喚醒定時器:
這是另一個定時器外設,它提供與看門狗定時器相同的專用定時過程。當微控制器在低功耗模式下運行時,此定時器會定期喚醒系統。
此定時器外設可在內部使用或使用外部外設將微控制器從睡眠模式喚醒。對于這個項目,我們將使用 Timer 1 和 Timer 2。
為定時器編程 Nuvoton N76E003 微控制器
將引腳設置為輸出:
讓我們先從輸出部分開始。我們使用了兩個 LED,一個是板載 LED,命名為 Test,連接到 P1.4 端口,一個外部 LED 連接到引腳 P1.5。
因此,這兩個引腳配置為輸出引腳,以使用以下代碼片段連接這兩個 LED。
?
#define Test_LED P14 #define LED1 P15
?
這兩個引腳在設置函數中設置為準雙向引腳。
?
無效設置(無效){ P14_準模式; P15_準模式; }
?
設置定時器功能:
在設置功能中,需要配置定時器 2 以獲得所需的輸出。為此,我們將 T2MOD 寄存器設置為 1/128 時鐘分頻因子,并在自動重載延遲模式下使用它。這是T2MOD寄存器的概述-
T2MOD 寄存器的第 4、5 和 6 位設置定時器 2 時鐘分頻器,第 7 位設置自動重載模式。這是使用以下行完成的 -
?
TIMER2_DIV_128; TIMER2_Auto_Reload_Delay_Mode;
?
這兩行在Function_define.h文件中定義為
?
#define TIMER2_DIV_128 T2MOD|=0x50; T2MOD&=0xDF #define TIMER2_Auto_Reload_Delay_Mode T2CON&=~SET_BIT0; T2MOD|=SET_BIT7; T2MOD|=SET_BIT3
?
現在,這些行設置了 Timer 2 ISR 所需的時序值。
?
RCMP2L = TIMER_DIV128_VALUE_100ms; RCMP2H = TIMER_DIV128_VALUE_100ms>>8;
?
在 Function_define.h 文件中進一步定義為-
?
TIMER_DIV128_VALUE_100ms 65536-12500 //12500*128/16000000 = 100 ms
?
因此,16000000 是 16 Mhz 的晶振頻率,它設置了 100 ms 的時間延遲。
下面兩行將清空 Timer 2 Low 和 High 字節。
?
TL2 = 0; TH2 = 0;
?
最后,下面的代碼將啟用定時器 2 中斷并啟動定時器 2。
?
設置_ET2;// 啟用 Timer2 中斷 設置_EA; 設置_TR2;// Timer2 運行
?
完整的設置功能可以在下面的代碼中看到 -
?
無效設置(無效){ P14_Quasi_Mode; P15_準模式; TIMER2_DIV_128; TIMER2_Auto_Reload_Delay_Mode; RCMP2L = TIMER_DIV128_VALUE_100ms; RCMP2H = TIMER_DIV128_VALUE_100ms>>8; TL2 = 0; TH2 = 0; 設置_ET2;// 啟用 Timer2 中斷 set_EA; 設置_TR2;// Timer2 運行 }
?
定時器 2 ISR 功能:
Timer 2 ISR 功能可以在下面的代碼中看到。
?
void Timer2_ISR (void) 中斷 5 { clr_TF2; //清除 Timer2 中斷標志 ?? LED1 = ~LED1; // LED1 切換,連接在 P1.5; }
?
Clr_TF2將清除定時器 2 中斷標志??,并且每當調用 ISR 函數時 LED 將被切換。由于中斷設置為 100 ms,LED 將以 100 ms 的時間間隔閃爍。
主函數和while循環:
一個硬件,如果連接電源并且工作正常,那么它應該連續輸出并且應用程序永遠不會停止。它無限次地做同樣的事情。來了函數while循環。while 循環內的應用程序無限運行。首先,調用 setup 函數。
?
設置(); 而(1){ Test_LED = 0; Timer1_Delay10ms(100); 測試_LED = 1; Timer1_Delay10ms(100); } }
?
上面的 while 循環根據 Timer 1 延遲使 LED 閃爍。該值設置為 1 秒。
定時器 1 在板支持包中提供的 delay.c 文件中配置。
?
無效 Timer1_Delay10ms(UINT32 u32CNT){ clr_T1M; //T1M=0, Timer1 時鐘 = Fsys/12 TMOD |= 0x10; //Timer1為16位模式 set_TR1; //啟動 Timer1 while (u32CNT != 0) { TL1 = LOBYTE(TIMER_DIV12_VALUE_10ms); //在 "Function_define.h" "TIMER VALUE" 中找到定義 TH1 = HIBYTE(TIMER_DIV12_VALUE_10ms); 而(TF1!= 1);//檢查Timer1超時標志 clr_TF1; u32CNT——; } clr_TR1; //停止定時器 1 }
?
在上述函數中,定時器 1 的時鐘在 16 位模式下設置為 Fsys/12。計時器啟動并計算 10 毫秒間隔的滴答時間,然后停止。由于定時器配置為 100 次Timer1_Delay10ms(100);它得到 10 毫秒 x 100 = 1 秒的時間。
閃爍代碼和驗證定時器功能的輸出
編譯時的代碼(如下所示)返回 0 個警告和 0 個錯誤,我使用 Keil 中的默認刷新方法對其進行了刷新。閃爍后,LED 按照編程定義的定時器延遲閃爍。
?
#include "N76E003.h"
#include "SFR_Macro.h"
#include "函數定義.h"
#include "Common.h"
#include "延遲.h"
#define Test_LED P14
#define LED1 P15
/************************************************************************************************************
* Timer2 中斷子程序
************************************************************************************************************/
void Timer2_ISR (void) 中斷 5
{
clr_TF2; //清除Timer2中斷標志
LED1 = ~LED1;
// LED1 切換,連接在 P1.5;
}
無效設置(無效);
無效的主要(無效){
設置();
而(1){
測試_LED = 0;
Timer1_Delay10ms(100);
測試_LED = 1;
Timer1_Delay10ms(100);
}
}
//這是應用程序運行前的設置文件
無效設置(無效){
P14_準模式;
P15_準模式;
TIMER2_DIV_128;
TIMER2_Auto_Reload_Delay_Mode;
RCMP2L = TIMER_DIV128_VALUE_100ms;
RCMP2H = TIMER_DIV128_VALUE_100ms>>8;
TL2 = 0;
TH2 = 0;
設置_ET2;// 啟用 Timer2 中斷
設置_EA;
設置_TR2;// Timer2 運行
}
評論