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