UART 代表通用異步接收器/發(fā)送器,它是任何微控制器單元中有用的硬件功能。微控制器需要接收數(shù)據(jù)、處理數(shù)據(jù)并將其發(fā)送到其他設(shè)備。微控制器中有不同類(lèi)型的通信協(xié)議可用,但是,UART 是 SPI 和 I2C 等其他通信協(xié)議中最常用的一種。如果有人需要串行接收或發(fā)送數(shù)據(jù),UART 始終是最簡(jiǎn)單和常見(jiàn)的選擇。UART的優(yōu)點(diǎn)是它只需要兩條線在設(shè)備之間傳輸數(shù)據(jù)。繼續(xù)我們的Nuvoton 微控制器教程,在本文中,我們將學(xué)習(xí)如何使用 N76E003 微控制器執(zhí)行串行通信。
UART通信基礎(chǔ)
現(xiàn)在,既然我們知道了什么是 UART,那么了解 UART 的相關(guān)參數(shù)很重要。
兩個(gè) UART 設(shè)備以相同的頻率接收和發(fā)送數(shù)據(jù)。當(dāng)接收 UART 設(shè)備檢測(cè)到一個(gè)起始位時(shí),它開(kāi)始以稱為波特率的特定頻率讀取傳入的位。波特率對(duì)于 UART 通信很重要,它用于測(cè)量數(shù)據(jù)傳輸?shù)乃俣龋悦棵胛粩?shù) (bps) 為單位。這個(gè)波特率速度,對(duì)于發(fā)送和接收來(lái)說(shuō),必須是相同的波特率。在位時(shí)序偏離太遠(yuǎn)之前,發(fā)送和接收 UART 之間的波特率速度差異只能約為 10%。最流行的波特率速度是 4800、9600、115200 bps 等。
N76E003 有兩個(gè) UART—— UART0 和 UART1。在本教程中,我們將使用N76E003 微控制器單元上的 UART 外設(shè)。在不浪費(fèi)太多時(shí)間的情況下,讓我們?cè)u(píng)估一下這個(gè)應(yīng)用程序需要什么樣的硬件設(shè)置。
硬件要求和設(shè)置
該項(xiàng)目所需的主要組件是USB 到 UART 或 TTL 轉(zhuǎn)換器模塊,它將在 PC 或筆記本電腦與微控制器模塊之間建立所需的接口。對(duì)于這個(gè)項(xiàng)目,我們將使用基于CP2102的 USB 轉(zhuǎn) UART 模塊,如下所示。
更不用說(shuō),除了上述組件,我們還需要基于N76E003 微控制器的開(kāi)發(fā)板以及Nu-Link 編程器。如果編程器不用作電源,則可能需要額外的 5V 電源單元。
Nuvoton N76E003 UART通信電路圖
正如我們?cè)谙旅娴拈_(kāi)發(fā)板示意圖中看到的,微控制器單元的第 2 和第 3 引腳分別用作 UART0 Tx 和 Rx。在最左側(cè),顯示了編程接口連接。
Nuvoton N76E003 微控制器上的 UART 引腳
N76E003 有 20 個(gè)引腳,其中 4 個(gè)引腳可用于 UART 通信。下圖顯示了紅色方框 (Rx) 和藍(lán)色方框 (Tx) 中突出顯示的 UART 引腳。
對(duì)于 UART0,引腳 2 和 3 用于 UART 通信,對(duì)于 UART1,引腳 8 和 18 用于通信。
Nuvoton N76E003 微控制器中的 UART 寄存器
N76E003 具有兩個(gè)增強(qiáng)型全雙工 UART,具有自動(dòng)地址識(shí)別和幀錯(cuò)誤檢測(cè)功能 - UART0 和 UART1。這兩個(gè) UART 使用分類(lèi)為兩個(gè)不同 UART 的寄存器進(jìn)行控制。N76E003 中有兩對(duì) RX 和 TX 引腳可用于 UART 操作。因此,第一步是選擇所需的 UART 端口進(jìn)行操作。
在本教程中,我們將使用UART0,因此僅顯示 UART0 的配置。UART1 將具有相同的配置,但寄存器將不同。
選擇一個(gè) UART(本例中為 UART0)后,需要將需要用于 RX 和 TX 通信的 I/O 引腳配置為輸入和輸出。UART0 的 RX 引腳是微控制器的引腳 3,即端口 0.7。由于這是一個(gè)串口接收引腳,需要將端口 0.7 設(shè)置為輸入。另一方面,作為微控制器的第二個(gè)引腳的端口 0.6 是發(fā)送引腳或輸出引腳。需要設(shè)置為準(zhǔn)雙向模式。這些可以使用 PxM1 和 PxM2 寄存器進(jìn)行選擇。這兩個(gè)寄存器設(shè)置 I/O 模式,其中 x 代表端口號(hào)(例如,端口 P1.0 寄存器將是 P1M1 和 P1M2,對(duì)于 P3.0 它將是 P3M1 和 P3M2 等)配置可以如下圖所示 -
N76E003 中的 UART 操作模式
然后,下一步是確定UART 操作的模式。兩個(gè) UART 可以在 4 種模式下運(yùn)行。模式是-
我們可以看到,SM0 和 SM1(SCON 寄存器的第 7 位和第 6 位)選擇了 UART 操作模式。模式 0 是同步操作,其他三種模式是異步操作。但是,每種串行端口模式的波特率發(fā)生器和幀位都不同。可以根據(jù)應(yīng)用要求選擇任何一種模式,UART1 也是如此。本教程使用 10 位運(yùn)算,定時(shí)器 3 溢出率除以 32 或 16。
現(xiàn)在,是時(shí)候獲取信息并為 UART0 配置SCON 寄存器(UART1 的 SCON_1)了。
第 6 位和第 7 位將設(shè)置 UART 模式,如前所述。位 5 用于設(shè)置多處理器通信模式以啟用選項(xiàng)。但是,該過(guò)程取決于選擇的 UART 模式。除此之外,REN 位將設(shè)置為 1 以啟用接收,TI 標(biāo)志將設(shè)置為 1 以使用printf功能代替自定義 UART0 發(fā)送功能。
下一個(gè)重要的寄存器是電源控制寄存器 (PCON)(UART1 的定時(shí)器 3 位 7 和 6)寄存器。如果您不熟悉計(jì)時(shí)器,請(qǐng)查看 Nuvoton N76E003 計(jì)時(shí)器教程以了解如何在 N76E003 微控制器上使用計(jì)時(shí)器。
SMOD 位對(duì)于選擇 UART0 模式 1 中的雙波特率很重要。現(xiàn)在,由于我們使用的是定時(shí)器 3,因此需要配置定時(shí)器 3 控制寄存器 T3CON。但是,第 7 位和第 6 位保留用于 UART1 的雙倍數(shù)據(jù)速率設(shè)置。
和定時(shí)器 3 預(yù)分頻器值-
第 5 位 BRCK 將定時(shí)器 3 設(shè)置為 UART1 的波特率時(shí)鐘源。現(xiàn)在,N76E003 的數(shù)據(jù)表給出了計(jì)算所需波特率的公式以及定時(shí)器 3(16 位)高低寄存器的采樣設(shè)置值。
16 Mhz 時(shí)鐘源的樣本值 -
因此需要使用上述公式在定時(shí)器 3 寄存器中配置波特率。對(duì)于我們的例子,它將是公式 4。之后,通過(guò)將 TR3 寄存器設(shè)置為 1 來(lái)啟動(dòng)定時(shí)器 3 將完成 UART0 初始化定時(shí)器 3。要接收和發(fā)送 UART0 數(shù)據(jù),請(qǐng)使用以下寄存器 -
SBUF 寄存器自動(dòng)配置為接收和發(fā)送。要從 UART 接收數(shù)據(jù),等待RI 標(biāo)志置 1 并讀取 SBUF 寄存器并將數(shù)據(jù)發(fā)送到 UART0,將數(shù)據(jù)發(fā)送到 SBUF 并等待 TI 標(biāo)志置 1 以確認(rèn)數(shù)據(jù)傳輸成功。
為 UART 通信編程 Nuvoton N76E003
編碼部分很簡(jiǎn)單,本教程中使用的完整代碼可以在本頁(yè)底部找到。代碼解釋如下,使用主函數(shù)中的語(yǔ)句將UART0初始化為9600波特率-
?
初始UART0_Timer3(9600);
?
上述函數(shù)在common.c文件中定義,它配置UART0,定時(shí)器3作為波特率源,模式1,波特率9600。函數(shù)定義如下-
?
void InitialUART0_Timer3(UINT32 u32Baudrate) //使用 timer3 作為波特率發(fā)生器 { P06_Quasi_Mode; //設(shè)置UART引腳為準(zhǔn)模式傳輸 P07_Input_Mode; //將UART引腳設(shè)置為接收 SCON = 0x50的輸入模式;//UART0 Mode1,REN=1,TI=1 set_SMOD; //UART0 雙倍速率使能 T3CON &= 0xF8; //T3PS2=0,T3PS1=0,T3PS0=0(Prescale=1) set_BRCK; //UART0 波特率時(shí)鐘源 = Timer3 #ifdef FOSC_160000 RH3= HIBYTE(65536 - (1000000/u32Baudrate)-1); /*16 MHz */ RL3= LOBYTE(65536 - (1000000/u32Baudrate)-1); /*16 MHz */ #endif #ifdef FOSC_166000 RH3= HIBYTE(65536 - (1037500/u32Baudrate)); /*16.6 兆赫*/ RL3 = LOBYTE(65536 - (1037500/u32Baudrate)); /*16.6 MHz */ #endif set_TR3; //觸發(fā)Timer3 set_TI; //對(duì)于 printf 函數(shù)必須設(shè)置 TI = 1 }
?
如前所述,聲明是一步一步完成的,寄存器也相應(yīng)地配置。但是,在N76E003的BSP庫(kù)中,有一個(gè)bug,就是代替P07_Input_Mode;有P07_Quasi_Mode。因此,UART 接收功能將不起作用。
波特率也根據(jù)波特率輸入并使用數(shù)據(jù)表中給出的公式進(jìn)行配置。現(xiàn)在,在 main 函數(shù)或while 循環(huán)中,使用了 printf 函數(shù)。要使用printf函數(shù),TI 需要設(shè)置為 1。除此之外,在while 循環(huán)中,使用 switch case 并根據(jù)接收到的 UART 數(shù)據(jù)打印該值。
?
while(1) { printf("\r\n按 1 或按 2 或按 3 或按 4"); 操作 = Receive_Data_From_UART0(); switch (oper) { case '1': printf("\r\n1 被按下"); 休息; case '2': printf("\r\n2 被按下"); 休息; case '3': printf("\r\n3 被按下"); 休息; case '4': printf("\r\n4 被按下"); 休息; 默認(rèn)值: printf("\r\n按錯(cuò)鍵"); } Timer0_Delay1ms(300); } }
?
好吧,對(duì)于 UART0 接收Receive_Data_From_UART0();?? 使用功能。它也在common.c庫(kù)中定義。
?
UINT8 Receive_Data_From_UART0(void) { UINT8 c; 而(!RI); c = SBUF; RI = 0; 返回(c); }
?
它將等待 RI 標(biāo)志為 1 并使用變量 c 返回接收數(shù)據(jù)。
閃爍代碼和輸出
該代碼返回 0 個(gè)警告和 0 個(gè)錯(cuò)誤,并使用 Keil 的默認(rèn)閃爍方法進(jìn)行閃爍。如果您不確定如何編譯和上傳代碼,請(qǐng)查看nuvoton 入門(mén)文章。以下幾行確認(rèn)我們的代碼已成功上傳。
?
重建開(kāi)始:項(xiàng)目:printf_UART0 重建目標(biāo)'GPIO' 正在編譯PUTCHAR.C... 正在編譯Print_UART0.C...正在 編譯Delay.c...正在 編譯Common.c...正在 組裝STARTUP.A51...正在 鏈接... 程序大小:數(shù)據(jù)=54.2 xdata=0 代碼=2341 從“.\Output\Printf_UART1”... “.\Output\Printf_UART1”創(chuàng)建十六進(jìn)制文件 - 0 個(gè)錯(cuò)誤,0 個(gè)警告。 構(gòu)建時(shí)間已用:00:00:02 加載“G:\\n76E003\\software\\N76E003_BSP_Keil_C51_V1.0.6\\Sample_Code\\UART0_Printf\\Output\\Printf_UART1” 閃存擦除完成。 Flash 寫(xiě)入完成:已編程 2341 字節(jié)。 Flash 驗(yàn)證完成:已驗(yàn)證 2341 字節(jié)。 閃存加載于 15:48:08 完成
?
開(kāi)發(fā)板通過(guò)編程器和筆記本電腦使用 USB 轉(zhuǎn) UART 模塊連接到電源。要顯示或發(fā)送 UART 數(shù)據(jù),需要串行監(jiān)控軟件。我在這個(gè)過(guò)程中使用了tera 術(shù)語(yǔ)。
如下圖所示,我能夠顯示從我們的 nuvoton 控制器發(fā)送的字符串,并將其顯示在串行監(jiān)視器軟件上。還能夠從串行監(jiān)視器讀取值。
#include "N76E003.h"
#include "SFR_Macro.h"
#include "函數(shù)定義.h"
#include "Common.h"
#include "延遲.h"
/*================================================= ============================*/
無(wú)效主要(無(wú)效)
{
字符操作;
初始UART0_Timer3(9600);
TI = 1; // 使用了 printft 函數(shù)。
printf("Hello CircuitDigest\r\n");
而(1)
{
printf("\r\n按 1 或按 2 或按 3 或按 4");
操作 = Receive_Data_From_UART0();
開(kāi)關(guān)(操作){
情況1':
printf("\r\n1 被按下");
休息;
案例“2”:
printf("\r\n2 被按下");
休息;
案例“3”:
printf("\r\n3 被按下");
休息;
案例“4”:
printf("\r\n4 被按下");
休息;
默認(rèn):
printf("\r\n按錯(cuò)鍵");
}
Timer0_Delay1ms(300);
}
}
?
評(píng)論
查看更多