一、串口通信原理
UART:Universal Asynchronous Receiver/Transmitter(通用異步收發(fā)送器),用來(lái)傳輸串行數(shù)據(jù),發(fā)送數(shù)據(jù)時(shí),CPU將并行數(shù)據(jù)寫入U(xiǎn)ART,UART按照一定格式在TxD線上串行發(fā)出;接收數(shù)據(jù)時(shí),UART檢測(cè)到RxD線上的信號(hào),將串行收集放到緩沖區(qū)中,CPU即可讀取UART獲得的這些數(shù)據(jù)。
UART最精簡(jiǎn)的連線形式只有3根線,TXD用于發(fā)送,RXD用于接收,GND用于提供參考電平。UART之間以幀作為數(shù)據(jù)傳輸單位,幀由具有完整意義的若干位組成,它包含開始位、數(shù)據(jù)位、校驗(yàn)位和停止位。發(fā)送數(shù)據(jù)之前,互相通信的UART之間要約定好數(shù)據(jù)傳輸速率(波特率的倒數(shù))、數(shù)據(jù)的傳輸格式(多少個(gè)數(shù)據(jù)位、是否使用校驗(yàn)位、奇校驗(yàn)還是偶校驗(yàn)、多少個(gè)停止位)。
二、S3C2440串口介紹
s3c2440提供了三個(gè)UART端口,它們都可以通過(guò)查詢、中斷和DMA方式傳輸數(shù)據(jù),而且每個(gè)UART都分別有一個(gè)64個(gè)字節(jié)的接收FIFO和一個(gè)64個(gè)字節(jié)的發(fā)送FIFO。如下圖所示:每個(gè)UART包含一個(gè)波特率發(fā)生器、發(fā)送器、接收器和一個(gè)控制單元。波特率發(fā)生器可以由PCLK、FCLK/n或UEXTCLK(外部輸入時(shí)鐘)時(shí)鐘驅(qū)動(dòng)。UART通過(guò)使用系統(tǒng)時(shí)鐘可以支持最高115.2Kbps的比特率。如果是使用外部器件提供UEXTCLK的UART,則UART可以運(yùn)行在更高的速度。發(fā)送器和接收器各包含一個(gè)64字節(jié)的FIFO和數(shù)據(jù)移位器。要發(fā)送數(shù)據(jù)時(shí),先將數(shù)據(jù)寫入到FIFO接著在發(fā)送前復(fù)制到發(fā)送移位器中,隨后將數(shù)據(jù)從發(fā)送數(shù)據(jù)引腳(TXDn)移出;接收數(shù)據(jù)時(shí),從接收數(shù)據(jù)引腳(RXDn)移入收到的數(shù)據(jù),接著從移位器復(fù)制到FIFO。
三、S3C2440的串口寄存器配置
3.1 串行數(shù)據(jù)格式設(shè)置
例子:ULCON0=0x03 //8N1(正常模式 8個(gè)數(shù)據(jù)位,無(wú)較驗(yàn),1個(gè)停止位)
3.2 UART控制寄存器
例子:UCON=0x05 //時(shí)鐘使用PLCK,中斷為邊沿觸發(fā),禁止接受和發(fā)送超時(shí),不產(chǎn)生接受錯(cuò)誤中斷,不采用RX、TX直接相連的調(diào)節(jié)模式,rx和tx處于中斷或者查詢模式。
3.3 UART發(fā)送接受狀態(tài)寄存器
當(dāng)程序使用的是查詢方式收發(fā)數(shù)據(jù)時(shí),必須通過(guò)讀取UART寄存器的值來(lái)正確控制UART數(shù)據(jù)的收發(fā)。
#define TXD0READY (1<<2)
#define RXD0READY (1)
//發(fā)送字符
void putc(unsigned char c)
{
/* 等待,直到發(fā)送緩沖區(qū)中的數(shù)據(jù)已經(jīng)全部發(fā)送出去 */
while (!(UTRSTAT0 & TXD0READY));
/* 向UTXH0寄存器中寫入數(shù)據(jù),UART即自動(dòng)將它發(fā)送出去 */
UTXH0 = c;
}
//接受字符
unsigned char getc(void)
{
/* 等待,直到接收緩沖區(qū)中的有數(shù)據(jù) */
while (!(UTRSTAT0 & RXD0READY));
/* 直接讀取URXH0寄存器,即可獲得接收到的數(shù)據(jù) */
return URXH0;
}
3.4 發(fā)送和接受緩沖寄存器
當(dāng)串口有數(shù)據(jù)可讀時(shí),程序直接讀取URXHn,當(dāng)用戶想發(fā)送數(shù)據(jù)時(shí)直接將數(shù)據(jù)寫入到UTXHn即可。
3.5 波特率寄存器
UBRDIVn由下列表達(dá)式確定:
UBRDIVn=(int)(UART時(shí)鐘/(波特率*16))-1
假如uart0采用中斷模式來(lái)收發(fā)數(shù)據(jù)我們必須要做三件事:
1.在程序的啟動(dòng)代碼中開中斷
2.設(shè)置INTMSK和INTSUBMSK,打開uart0中斷
3.配置GPH2,GPH3用作TXD0,RXD0
四、串口中斷控制led燈實(shí)例(tq2440)
啟動(dòng)代碼:初始化時(shí)鐘、led引腳配置、uart0初始化以及中斷相關(guān)設(shè)定
.extern main
.text
.global _start
_start:
@******************************************************************************
@ 異常向量,本程序中,除Reset和HandleIRQ外,其它異常都沒(méi)有使用
@******************************************************************************
b Reset
@ 0x04: 未定義指令中止模式的向量地址
HandleUndef:
b HandleUndef
@ 0x08: 管理模式的向量地址,通過(guò)SWI指令進(jìn)入此模式
HandleSWI:
b HandleSWI
@ 0x0c: 指令預(yù)取終止導(dǎo)致的異常的向量地址
HandlePrefetchAbort:
b HandlePrefetchAbort
@ 0x10: 數(shù)據(jù)訪問(wèn)終止導(dǎo)致的異常的向量地址
HandleDataAbort:
b HandleDataAbort
@ 0x14: 保留
HandleNotUsed:
b HandleNotUsed
@ 0x18: 中斷模式的向量地址
b HandleIRQ
@ 0x1c: 快中斷模式的向量地址
HandleFIQ:
b HandleFIQ
Reset:
ldr sp, =4096 @ 設(shè)置棧指針,以下都是C函數(shù),調(diào)用前需要設(shè)好棧
bl disable_watch_dog @ 關(guān)閉WATCHDOG,否則CPU會(huì)不斷重啟
msr cpsr_c, #0xd2 @ 進(jìn)入中斷模式
ldr sp, =3072 @ 設(shè)置中斷模式棧指針
msr cpsr_c, #0xd3 @ 進(jìn)入管理模式
ldr sp, =4096 @ 設(shè)置管理模式棧指針,
@ 其實(shí)復(fù)位之后,CPU就處于管理模式,
@ 前面的“l(fā)dr sp, =4096”完成同樣的功能,此句可省略
bl clock_init
bl init_led @ 初始化LED的GPIO管腳
bl init_irq @ 調(diào)用中斷初始化函數(shù),在init.c中
msr cpsr_c, #0x53 @ 設(shè)置I-bit=0,開IRQ中斷
ldr lr, =halt_loop @ 設(shè)置返回地址
ldr pc, =main @ 調(diào)用main函數(shù)
halt_loop:
b halt_loop
HandleIRQ:
sub lr, lr, #4 @ 計(jì)算返回地址
stmdb sp!, { r0-r12,lr } @ 保存使用到的寄存器
@ 注意,此時(shí)的sp是中斷模式的sp
@ 初始值是上面設(shè)置的3072
ldr lr, =int_return @ 設(shè)置調(diào)用ISR即EINT_Handle函數(shù)后的返回地址
ldr pc, =EINT_Handle @ 調(diào)用中斷服務(wù)函數(shù),在interrupt.c中
int_return:
ldmia sp!, { r0-r12,pc }^ @ 中斷返回, ^表示將spsr的值復(fù)制到cpsr
啟動(dòng)代碼中使用到的初始化代碼
#define GPB5_out (1<<(5*2))
#define GPB6_out (1<<(6*2))
#define GPB7_out (1<<(7*2))
#define GPB8_out (1<<(8*2))
#define GPB5_msk (3<<(5*2))
#define GPB6_msk (3<<(6*2))
#define GPB7_msk (3<<(7*2))
#define GPB8_msk (3<<(8*2))
/*
* K1,K2,K3,K4對(duì)應(yīng)GPF1、GPF4、GPF2、GPF0
*/
#define GPF0_int (0x2<<(0*2))
#define GPF1_int (0x2<<(1*2))
#define GPF2_int (0x2<<(2*2))
#define GPF4_int (0x2<<(4*2))
#define GPF0_msk (3<<(0*2))
#define GPF1_msk (3<<(1*2))
#define GPF2_msk (3<<(2*2))
#define GPF4_msk (3<<(4*2))
/*
* 關(guān)閉WATCHDOG,否則CPU會(huì)不斷重啟
*/
void disable_watch_dog(void)
{
WTCON = 0; // 關(guān)閉WATCHDOG很簡(jiǎn)單,往這個(gè)寄存器寫0即可
}
void init_led(void)
{
// LED1,LED2,LED3,LED4對(duì)應(yīng)的4根引腳設(shè)為輸出
GPBCON &= ~(GPB5_msk | GPB6_msk | GPB7_msk | GPB8_msk);
GPBCON |= GPB5_out | GPB6_out | GPB7_out | GPB8_out;
}
/*
* 初始化GPIO引腳為外部中斷
* GPIO引腳用作外部中斷時(shí),默認(rèn)為低電平觸發(fā)、IRQ方式(不用設(shè)置INTMOD)
*/
void init_irq( )
{
INTMSK &=~(1<<28); //開啟uart0中斷
INTSUBMSK &=~(3<<0);//開啟uart0的接收和發(fā)送中斷
GPHCON |= 0xa0; // GPH2,GPH3用作TXD0,RXD0
GPHUP = 0x0c; // GPH2,GPH3內(nèi)部上拉
ULCON0 = 0x03; // 8N1(8個(gè)數(shù)據(jù)位,無(wú)較驗(yàn),1個(gè)停止位)
UCON0 = 0x05; // 查詢方式,UART時(shí)鐘源為PCLK
UFCON0 = 0x00; // 不使用FIFO
UMCON0 = 0x00; // 不使用流控
UBRDIV0 = 0x1a; // 波特率為115200
/*
* 設(shè)定優(yōu)先級(jí):
* ARB_SEL0 = 00b, ARB_MODE0 = 0: REQ1 > REQ2 > REQ3,即EINT0 > EINT1 > EINT2
* 仲裁器1、6無(wú)需設(shè)置
* 最終:
* EINT0 > EINT1> EINT2 > EINT4 即K4 > K1 > K3 > K2
*/
PRIORITY = (PRIORITY & ((~0x01) | ~(0x3<<7)));
// EINT0、EINT1、EINT2、EINT4_7使能
INTMSK &= (~(1<<0)) & (~(1<<1)) & (~(1<<2)) & (~(1<<4));
}
/*
* 對(duì)于MPLLCON寄存器,[19:12]為MDIV,[9:4]為PDIV,[1:0]為SDIV
* 有如下計(jì)算公式:
* S3C2410: MPLL(FCLK) = (m * Fin)/(p * 2^s)
* S3C2440: MPLL(FCLK) = (2 * m * Fin)/(p * 2^s)
* 其中: m = MDIV + 8, p = PDIV + 2, s = SDIV
* 對(duì)于本開發(fā)板,F(xiàn)in = 12MHz
* 設(shè)置CLKDIVN,令分頻比為:FCLK:HCLK:PCLK=1:2:4,
* FCLK=200MHz,HCLK=100MHz,PCLK=50MHz
*/
void clock_init(void)
{
CLKDIVN = 0x03; // FCLK:HCLK:PCLK=1:2:4, HDIVN=1,PDIVN=1
/* 如果HDIVN非0,CPU的總線模式應(yīng)該從“fast bus mode”變?yōu)椤癮synchronous bus mode” */
__asm__(
"mrc p15, 0, r1, c1, c0, 0n" /* 讀出控制寄存器 */
"orr r1, r1, #0xc0000000n" /* 設(shè)置為“asynchronous bus mode” */
"mcr p15, 0, r1, c1, c0, 0n" /* 寫入控制寄存器 */
);
MPLLCON =((0x5c<<12)|(0x01<<4)|(0x02)); /* 現(xiàn)在,F(xiàn)CLK=200MHz,HCLK=100MHz,PCLK=50MHz */
}
中斷處理函數(shù)
#include "s3c24xx.h"
void EINT_Handle()
{
/*
* K1,K2,K3,K4對(duì)應(yīng)GPF1、GPF4、GPF2、GPF0
* 即 EINT1, ETIN4, EINT2, EINT0
* oft為 1, 4, 2, 0 (對(duì)應(yīng)INTMSK寄存器)
*/
switch(URXH0)
{
// K1被按下
case '1':
{
GPBDAT |= (0xF<<5); // 所有LED熄滅
GPBDAT &= ~(1<<5); // LED1點(diǎn)亮
break;
}
// K2被按下
case '2':
{
GPBDAT |= (0xF<<5); // 所有LED熄滅
GPBDAT &= ~(1<<6); // LED2點(diǎn)亮
break;
}
// K3被按下
case '3':
{
GPBDAT |= (0xF<<5); // 所有LED熄滅
GPBDAT &= ~(1<<7); // LED3點(diǎn)亮
break;
}
// K4被按下
case '4':
{
上一篇:S3C2440串口學(xué)習(xí)
下一篇:S3C2440開發(fā)板的學(xué)習(xí)使用(一)----串口的安裝
推薦閱讀
史海拾趣
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- 意法半導(dǎo)體推出用于匹配遠(yuǎn)距離無(wú)線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇
- 使用樹莓派進(jìn)行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲(chǔ)html,css,js文件,以及網(wǎng)頁(yè)和arduino的通訊
- ESP32 freeRTOS使用測(cè)試
- API調(diào)用小記(Touchdesigner和ESP32)
- 關(guān)于ESP32/8266使用async-mqtt-client庫(kù)的一些基本介紹
- ?意法半導(dǎo)體大巴窯工廠落地創(chuàng)新冷卻系統(tǒng),提升可持續(xù)發(fā)展能力
- Nordic Semiconductor聯(lián)同Omnispace和Gatehouse Satcom完成5G NB-IoT衛(wèi)星演示
- 英偉達(dá)開啟“攻城略地”模式,擬在歐洲建設(shè)20座AI工廠
- 臺(tái)積電:日本JASM第二晶圓廠預(yù)計(jì)今年下半年動(dòng)工
- 工信部:支持車企“60天賬期”承諾,促進(jìn)產(chǎn)業(yè)健康發(fā)展
- 全球十大芯片代工廠最新排名!中芯國(guó)際沖擊世界第二
- 未來(lái)數(shù)字化工廠:重塑制造業(yè)格局
- 面對(duì)快速演進(jìn)的 GenAI 模型,Gartner發(fā)布中國(guó)企業(yè)需做出的三項(xiàng)基礎(chǔ)設(shè)施關(guān)鍵決策
- 摩爾斯微電子與成都惠利特?cái)y手合作,利用 Wi-Fi HaLow革新物聯(lián)網(wǎng)的連接
- 羅克韋爾自動(dòng)化推出 PharmaSuite 12.00,加速實(shí)現(xiàn)安全、可擴(kuò)展的部署
- 是時(shí)候充充電啦!村田寵粉月重磅開啟!
- 『ADI實(shí)驗(yàn)室電路DIY大賽』正式啟動(dòng)!
- 泰克 MSO6B 探索營(yíng):設(shè)計(jì)資源集錦
- EEWorld邀你來(lái)拆解(第10期)——玩具總動(dòng)員
- 尋寶大冒險(xiǎn),搜索有好禮!
- 直播已結(jié)束【Molex 新能源汽車低壓連接器解決方案】
- 直播已結(jié)束【用于光伏逆變器/儲(chǔ)能系統(tǒng)的歐姆龍繼電器 /開關(guān)/連接器解決方案】
- 下載有禮|是德科技:測(cè)試設(shè)備如何影響產(chǎn)品質(zhì)量調(diào)研報(bào)告
- TI單芯片毫米波傳感器產(chǎn)品組合新品發(fā)布會(huì),誠(chéng)邀參與,預(yù)注冊(cè)贏好禮
- AI實(shí)時(shí)評(píng)估前方道路狀況 向駕駛員發(fā)送潛在事故多發(fā)點(diǎn)警告
- 2019 CES:百度車聯(lián)網(wǎng)發(fā)布網(wǎng)聯(lián)汽車規(guī)范
- 有效距離1600米,發(fā)布多目視覺立體感知技術(shù)智加科技是如何做到的
- 意念駕車、裸眼3D儀表......CES Asia 2019這些不能錯(cuò)過(guò)的黑科技
- 目標(biāo)10分鐘內(nèi)!特斯拉即將“治愈”充電焦慮癥
- 從“實(shí)戰(zhàn)”出發(fā) NVIDIA深度學(xué)習(xí)學(xué)院的本土化進(jìn)程
- STM8 ROP編程
- 關(guān)于stm8l05RB的usart1串口復(fù)用A2,A3配置
- STM8L自帶bootloader使用教程
- STM8L051之蜂鳴器beep--庫(kù)函數(shù)版
- 電壓比較器問(wèn)題~~~~~~~~~~~~~~~~~~
- 關(guān)于剛學(xué)習(xí)CC2420的一些問(wèn)題
- 關(guān)于LCD顯示問(wèn)題的求助
- 針對(duì)DDR2-800和DDR3的PCB信號(hào)完整性設(shè)計(jì)
- 電工測(cè)量與電測(cè)儀表--很基礎(chǔ)很實(shí)用的好書
- 按鍵處理與按鍵防抖動(dòng)例子
- 【平頭哥RVB2601創(chuàng)意應(yīng)用開發(fā)】使用體驗(yàn)06 -- NTP授時(shí)
- 關(guān)于FPGA設(shè)計(jì)資源整和積累問(wèn)題
- 單片機(jī)學(xué)習(xí)深入必要的幾個(gè)步驟
- 用1602LCD碰到的奇怪問(wèn)題(難)