DS89C430和其他高速微控制器具有兩個相同的串行端口。本應用筆記向用戶介紹微控制器中使用的通用異步接收器/發送器。應用筆記討論了波特時鐘源、中斷模式、波特率生成、異步10位操作和雙串行端口操作。代碼示例重點介紹了如何使用定時器 1 和定時器 2 作為串行端口的波特率發生器。
介紹
DS89C430高速微控制器的串行接口與其他8051處理器的串行接口相同。
本應用筆記介紹了該接口最常用的工作模式(10位異步或標準全雙工異步通信模式1)的設置和操作。將提供港口運行的總體概述,特別是模式1操作和波特率生成。將介紹詳細的軟件示例。示例說明了使用具有不同計時器配置的雙串行端口。DS89C430用戶指南和下面的附錄A描述了DS89C430寄存器在系統時鐘頻率設置、波特率產生和串行端口操作中涉及的所有寄存器。
波特率生成
每種模式都有一個與之關聯的波特率發生器。對于每個 UART,此生成器通常是相同的。幾種波特率生成技術具有獨立于兩個UART的選項。以下波特率描述特定于為模式 1 操作配置的串行端口使用的計時器和波特率生成公式。
使用定時器 1 生成波特率
要使用定時器1作為波特率發生器,通常將其置于8位自動重新加載模式。這樣,CPU 就不參與波特率生成。請注意,不應啟用計時器中斷。在 8 位自動重新加載模式(定時器 1、模式 2)中,重新加載值存儲在 TH1 中。因此,定時器1輸入時鐘頻率和TH1的組合決定了波特率。定時器1輸入時鐘相對于外部晶體時鐘,可以通過兩種方式改變:
更改系統時鐘,或
更改定時器輸入時鐘分頻比。
通過使用 PMR 特殊功能寄存器中的時鐘分頻位 (CD1:0) 來修改系統時鐘。定時器1輸入時鐘分頻比可使用T1M (CKCON.4)和T1MH (CKMOD.4)寄存器位進行配置。將 T1MH 位設置為邏輯 1 會導致系統時鐘用于時鐘定時器 1。當 T1MH 清除 (= 0) 時,將 T1M 位設置為邏輯 1 可為定時器 4 提供系統時鐘除以 1 的輸入。當T1M和T1MH均為邏輯0時,定時器1輸入時鐘固定在振蕩器頻率除以12。使用電源管理模式時,將 T1MH 或 T1M 設置為邏輯 1 會導致系統時鐘 (OSC/1024) 用作定時器 1 的輸入時鐘。如果在電源管理模式下兩個位都為清除 (= 0),則系統時鐘除以 3 (OSC/3072) 提供給定時器 1。
表1總結了每種不同配置的外部晶體頻率與定時器1輸入時鐘之間的關系。
系統時鐘模式 |
PMR 寄存器位 (4x/2x、CD1、CD0) |
定時器1輸入時鐘頻率 | ||
T1MH, T1M = 00 | T1MH, T1M = 01 | T1MH, T1M = 1X | ||
晶體乘法模式 4X | 100 | OSC/12 | OSC/1 | OSC/0.25 |
晶體乘法模式 2X | 000 | OSC/12 | OSC/2 | OSC/0.5 |
除以 1(默認值) | X01, X10 | OSC/12 | OSC/4 | OSC/1 |
電源管理模式 (/1024) | X11 | OSC/3072 | OSC/1024 | OSC/1024 |
使用定時器 1 的波特率公式
表2列出了TH1寄存器的重載值,用于生成一些更常見的波特率。
波特率 | 斯莫德 | 輸入時鐘頻率(1分頻) | |
TH1 - 重新加載值 | |||
OSC = 11.05MHz | OSC = 22.11MHz | ||
115200 | 0/1 | FD/FA | FA/F4 |
57600 | 0/1 | FA/F4 | F4/E8 |
38400 | 0/1 | F7/EE | 電波/直流電 |
28800 | 0/1 | F4/E8 | E8/D0 |
19200 | 0/1 | 電波/直流電 | 直流/B8 |
14400 | 0/1 | E8/D0 | D0/A0 |
9600 | 0/1 | 直流/B8 | B8/70 |
1200 | 0/1 | 不適用 | 不適用 |
使用定時器 2 生成波特率
要將定時器 2 用作串行端口 0 的波特率發生器,定時器配置為自動重新加載模式。然后,TCLK 或 RCLK 位(或兩者)設置為邏輯 1。TCLK = 1 選擇定時器 2 作為發射器的波特率發生器;RCLK = 1 為接收器選擇計時器 2。因此,串行端口 0 可以通過為一個數據方向選擇定時器 1,為另一個數據方向選擇定時器 2,使發射器和接收器以不同的波特率運行。RCLK 和 TCLK 分別位于 T2CON.4 和 TCON.5 中。
雖然定時器2輸入時鐘的配置可以類似于定時器1,但必須將其置于波特率發生器模式才能由串行端口0使用。將 RCLK 或 TCLK 設置為邏輯 1 會選擇定時器 2 進行波特率生成。完成此操作后,定時器2的輸入時鐘固定為振蕩器頻率除以2。唯一的例外是當定時器2用于在電源管理模式(PMM)下生成波特率時。對于 PMM,系統時鐘 (OSC/1024) 用作計時器 2 的輸入時鐘。設置 RCLK 或 TCLK 時,定時器 2 中斷將自動禁用。此外,TF2 (TCON.7) 標志未在計時器滾動更新時設置。下表3總結了各種配置的外部晶體頻率與定時器2輸入時鐘之間的關系。
系統時鐘模式 |
PMR 寄存器位 (4x/2x、CD1、CD0) |
定時器2輸入時鐘頻率 波特率發生器模式 (RCLK或TCLK = 1) |
晶體乘法模式 4X | 100 | OSC/2 |
晶體乘法模式 2X | 000 | OSC/2 |
除以 1(默認值) | X01, X10 | OSC/2 |
電源管理模式 (/1024) | X11 | OSC/1024 |
使用定時器 2 的波特率公式
表4顯示了RCAP2H和RCAP2L寄存器的重載值,用于生成一些更常見的波特率。
波特率 | 輸入時鐘頻率(1分頻) | |
RCAP2H/RCAP2L - 重新加載值 | ||
OSC = 11.05MHz | OSC = 22.11MHz | |
115200 | FF/FD | FF/FA |
57600 | FF/FA | FF/F4 |
38400 | FF/F7 | FF/EE |
28800 | FF/F4 | FF/E8 |
19200 | FF/EE | FF/直流 |
14400 | FF/E8 | FF/D0 |
9600 | FF/直流 | FF/B8 |
1200 | 鐵/E0 | FD/C0 |
串行端口初始化
要使用UART函數,必須初始化串行端口。此過程包括選擇模式和時基,然后初始化波特率發生器。然后可以使用串行通信。見表5。波特率發生器運行后,UART可以發送/接收數據。大多數串行端口控制由 SCON0 和 SCON1 寄存器提供。有關這些寄存器的詳細位說明,請參考上文引用的DS89C430用戶指南。
SM0 | SM1 | SM2 | 模式 | 功能 | 長度(位) | 時期 |
0 | 0 | 0 | 0 | 同步 | 8 | 參見 PMR 寄存器 |
0 | 0 | 1 | 0 | 同步 | 8 | 參見 PMR 寄存器 |
0 | 1 | X | 1 | 異步 | 10 |
定時器 1 或 2(僅限端口 0) 波特率方程 |
1 | 0 | 0 | 2 | 異步 | 11 | 參見 PMR 寄存器 |
1 | 0 | 1 | 2 | 與多處理器通信異步 | 11 | 參見 PMR 寄存器 |
1 | 1 | 0 | 3 | 異步 | 11 |
定時器 1 或 2(僅限端口 0) 波特率方程 |
1 | 1 | 1 | 3 | 與多處理器通信異步 | 11 |
定時器 1 或 2(僅限端口 0) 波特率方程 |
模式 1
如前所述,我們只對異步模式 1 操作感興趣。此異步模式通常用于與 PC、調制解調器和其他類似接口進行通信。此模式提供標準的全雙工異步通信。總共傳輸 10 位,包括 1 個起始位、8 個數據位和 1 個停止位。接收到的停止位存儲在相關SCON寄存器的位位置RB8中。
在模式 1 中,波特率是定時器溢出的函數。這使得波特率可由用戶編程。兩個UART在模式1配置方面存在的一個區別是:串行端口1只能使用計時器1。相反,串行端口 0 可以使用定時器 1 或定時器 2 來生成波特率。如果兩個串行端口使用相同的計時器,則它們以相同的波特率運行。或者,一個定時器的運行速度可以是另一個定時器的兩倍(當波特率倍增器位 PCON.7 和 WDCON.7 的配置不同時)。如果兩個UART使用不同的定時器,則彼此相關的波特率配置不會那么嚴格。模式 1 的波特率生成在上面定時器 1 和定時器 2 的波特率生成部分中進行了討論。以下示例提供了更多詳細信息。
串行通信中斷
每個UART都可以生成一個中斷,每個UART都有自己的中斷使能、向量和優先級。每個UART中斷都有兩個標志(RI,TI),ISR使用它來確定中斷是來自接收的字還是傳輸的字。當UART完成字的傳輸時,將設置TI位并生成中斷(如果啟用)。同樣,UART 設置 RI 位,并在完全接收到字時生成中斷。在完全接收或傳輸字之前,不會通知 CPU。或者,如果啟用了中斷,則這些標志中的任何一個的設置都會導致跳轉到串行通道的關聯中斷向量。DS89C430的中斷向量表見表6。
中斷 | 中斷向量 | 自然秩序 | 中斷標志 | 使 | 優先級控制 |
電源故障 | 0033H | 0(最高) | PFI (WDCON.4) | EPFI (WDCON.5) | 不適用 |
外部中斷 0 | 0003H | 1 | IE0 (TCON.1) | EX0 (IE.0) | MPX0 (IP1.0)/LPX0 (IP0.0) |
計時器 0 溢出 | 000Bh | 2 | TF0 (TCON.5) | ET0 (IE.1) | MPT0 (IP1.1)/LPT0 (IP0.1) |
外部中斷 1 | 0013H | 3 | IE1 (TCON.3) | EX1 (IE.2) | MPX1 (IP1.2)/LPX1 (IP0.2) |
計時器 1 溢出 | 001Bh | 4 | TF1 (TCON.7) | ET1 (IE.3) | MPT1 (IP1.3)/LPT1 (IP0.3) |
串行端口 0 | 0023H | 5 | RI_0 (SCON0.0)/TI_0 (SCON0.1) | ES0 (IE.4) | MPS0 (IP1.4)/LPS0 (IP0.4) |
計時器 2 溢出 | 002Bh | 6 | TF2 (T2CON.7)/EXF2 (T2CON.6) | ET2 (IE.5) | MPT2 (IP1.5)/LPT2 (IP0.5) |
串行端口 1 | 003Bh | 7 | RI_1 (SCON1.0)/TI_1 (SCON1.1) | ES1 (IE.6) | MPS1 (IP1.6)/LPS1 (IP0.6) |
外部中斷 2 | 0043H | 8 | IE2 (EXIF.4) | EX2 (EIE.0) | MPX2 (EIP1.0)/LPX2 (EIP0.0) |
外部中斷 3 | 004Bh | 9 | IE3 (EXIF.5) | EX3 (EIE.1) | MPX3 (EIP1.1)/LPX3 (EIP0.1) |
外部中斷 4 | 0053H | 10 | IE4 (EXIF.6) | EX4 (EIE.2) | MPX4 (EIP1.2)/LPX4 (EIP0.2) |
外部中斷 5 | 005Bh | 11 | IE5 (EXIF.7) | EX5 (EIE.3) | MPX5 (EIP1.3)/LPX5 (EIP0.3) |
看門狗中斷 | 0063H | 12 | WDIF (WDCON.3) | EWDI (EIE.4) | MPWDI (EIP1.4)/LPWDI (EIP0.4) |
為了使用Keil?編譯器開發C代碼,我們需要將DS89C430的中斷向量與其中斷號相匹配。表 7 顯示了中斷的 Keil C 編譯器編號。
中斷編號 | 地址 | 中斷編號 | 地址 |
0(外部中斷 0) | 0003H | 16 | 0083H |
1(定時器/計數器 0) | 000Bh | 17 | 008Bh |
2(外部中斷 1) | 0013H | 18 | 0093H |
3(定時器/計數器 1) | 001Bh | 19 | 009Bh |
4(串行端口) | 0023H | 20 | 00A3h |
5(定時器/計數器 2) | 002Bh | 21 | 00ABh |
6 | 0033H | 22 | 00B3小時 |
7 | 003Bh | 23 | 00BBh |
8 | 0043H | 24 | 00C3h |
9 | 004Bh | 25 | 00立方比 |
10 | 0053H | 26 | 00D3h |
11 | 005Bh | 27 | 00分貝 |
12 | 0063H | 28 | 00E3h |
13 | 006Bh | 29 | 00EBh |
14 | 0073H | 30 | 00F3h |
15 | 007Bh | 31 | 00聯邦小時 |
從表 7 中,串行端口 0 分配了中斷號 4,串行端口 1 分配了中斷號 7。
使用 Keil C編譯器創建和編譯 C 應用程序
假設讀者已經擁有 Keil C 編譯器。本應用筆記解釋了如何使用Keil μVision?工具套件為Maxim的超高速閃存微控制器系列(包括DS89C430)構建C應用。本文還介紹了使用Maxim微控制器工具包(MTK)應用將編譯的應用加載到微控制器的過程。DS89C430插入DS89C450評估(EV)板。有關該板DIP開關的設置和位置,請查看完整的DS89C450數據資料。要使用串行端口 1,請將 SW1.6 和 SW1.7 放在 ON 位置。
雙串行端口示例
以下示例演示了DS89C430上兩個串行端口的使用。它們說明了如何以不同計時器生成的不同波特率初始化和使用兩個串行端口。如前所述,有關串行端口 0 的許多信息同樣適用于串行端口 1。但是,這些示例將有助于澄清有關使用串行端口的任何混淆。
在所有示例中,軟件只需將消息輸出到分別連接到端口 0 和端口 1 的終端應用程序(此處顯示的 MTK)。然后,軟件等待輸入。當任一端子向DS89C430發送字符時,設置相關的RI位。中斷使軟件識別出此位已設置。然后,軟件讀取接收到的字符并將其傳輸到兩個串行端口的傳輸緩沖區。為了便于說明,字符通過串行端口 0 回顯到終端 0,并在通過串行端口 1 傳輸到終端 1 之前增加 1。
在示例中,輸入時鐘頻率設置為默認值 1 分頻;兩個 SMOD 位被清除;計時器的中斷被禁用;定時器的模式已初始化;并加載計數和重新加載寄存器。這完全配置了波特時鐘生成。將兩個串行控制寄存器設置為所需模式后,定時器啟動并開始串行通信。所有軟件應用程序示例都包括包含中斷子例程和其他實用程序函數的 DualPort.h 頭文件。
結論
本應用筆記展示了使用兩個標準串行端口在軟件中實現10位異步UART是多么容易。同樣的技術可用于實現超高速閃存系列微控制器中的任何串行端口,包括DS89C430、DS89C450或其他高速8051兼容器件。定時器的時鐘倍頻器和可選高速時鐘會直接影響串行端口的波特率生成。用戶可以設置直接由所選定時器的速度得出的串行端口波特率。不同串口模式的波特率公式請參考DS89C430用戶指南。
審核編輯:郭婷
-
微控制器
+關注
關注
48文章
7542瀏覽量
151316 -
定時器
+關注
關注
23文章
3246瀏覽量
114719 -
編譯器
+關注
關注
1文章
1623瀏覽量
49108
發布評論請先 登錄
相關推薦
評論