娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年06月11日(星期三)

2020年06月11日 | s3c2440串口使用

發(fā)布者:文江桂青 來(lái)源: elecfans關(guān)鍵字:s3c2440  串口使用 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

一、串口通信原理


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':

        {   

[1] [2]
關(guān)鍵字:s3c2440  串口使用 引用地址:s3c2440串口使用

上一篇:S3C2440串口學(xué)習(xí)
下一篇:S3C2440開發(fā)板的學(xué)習(xí)使用(一)----串口的安裝

推薦閱讀

在經(jīng)歷了去年市場(chǎng)的沉寂、低迷之后,彩電廠商在今年一季度回暖升溫形勢(shì)鼓舞之下,終于按捺不住了。  近日,有媒體報(bào)道稱,伴隨著液晶面板價(jià)格的“滑坡”,彩電行業(yè)新一輪價(jià)格戰(zhàn)已經(jīng)打響。此次價(jià)格戰(zhàn)部分電視品牌已經(jīng)開始在挑戰(zhàn)電視價(jià)格的底線,而且這種勢(shì)頭不只停留在小尺寸段,還蔓延到了大尺寸段。  對(duì)此,《中國(guó)經(jīng)營(yíng)報(bào)》記者深入走訪了解到,在“61...
對(duì)華為不利的消息,現(xiàn)在又多了一條。路透社日前報(bào)導(dǎo)稱,社交巨頭Facebook似乎已經(jīng)做出決定,未來(lái)會(huì)禁止華為裝置預(yù)裝他們旗下的主要應(yīng)用。 這就意味著華為新出廠產(chǎn)品的潛在用戶,以后會(huì)需要自己想辦法去安裝Facebook、Instagram和WhatsApp了。當(dāng)然,現(xiàn)有裝置上的這些app并不會(huì)受到影響。在Google停掉Android支持前的寬限期內(nèi),用戶也可以去Play商店...
硬件看門狗是利用了一個(gè)定時(shí)器,來(lái)監(jiān)控主程序的運(yùn)行,也就是說(shuō)在主程序的運(yùn)行過(guò)程中,我們要在定時(shí)時(shí)間到之前對(duì)定時(shí)器進(jìn)行復(fù)位如果出現(xiàn)死循環(huán),或者說(shuō)PC指針不能回來(lái)。那么定時(shí)時(shí)間到后就會(huì)使單片機(jī)復(fù)位。常用的WDT芯片如MAX813,5045,IMP 813等,價(jià)格4~10元不等。軟件看門狗軟件看門狗技術(shù)的原理和這差不多,只不過(guò)是用軟件的方法實(shí)現(xiàn),我們還是以51系列...
簡(jiǎn)介:uC/OS在手持?jǐn)?shù)據(jù)采集系統(tǒng)的成功應(yīng)用為手持設(shè)備軟件系統(tǒng)的設(shè)計(jì)探索了一條新的道路。使用uC/OS設(shè)計(jì)嵌入式軟件克服了傳統(tǒng)的前后臺(tái)式的軟件設(shè)計(jì)方法的弊端,提高了系統(tǒng)的實(shí)時(shí)性和穩(wěn)定性,使得軟件系統(tǒng)代碼模塊化,更進(jìn)一步增強(qiáng)了系統(tǒng)升級(jí)擴(kuò)展的能力。未來(lái),在嵌入式系統(tǒng)軟件設(shè)計(jì)中uC/OS的應(yīng)用領(lǐng)域必將變得更加的廣泛。本數(shù)據(jù)采集系統(tǒng)主要是使用TI公司的M...

史海拾趣

小廣播
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號(hào) 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 吕梁市| 临颍县| 灵台县| 商南县| 乐业县| 杭州市| 昌乐县| 武隆县| 永宁县| 阿拉善右旗| 七台河市| 大悟县| 林芝县| 广西| 平陆县| 和静县| 阿坝| 盘山县| 临海市| 嘉定区| 浙江省| 景宁| 博客| 凉山| 芦山县| 遂溪县| 谷城县| 邹平县| 南乐县| 东丰县| 高邑县| 称多县| 白朗县| 美姑县| 红安县| 富蕴县| 贵州省| 英山县| 图木舒克市| 长岭县| 望谟县|