在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            ARM中斷方式串口編程

            作者: 時(shí)間:2016-11-09 來源:網(wǎng)絡(luò) 收藏
            串口編程(UART0)之中斷方式

            ---------------------------------------------------------

            本文引用地址:http://www.biyoush.com/article/201611/317903.htm

            from:blog.csdn.net/tigerjb

            Email:[email protected]

            ---------------------------------------------------------

            三.中斷方式的串口編程

            1.用中斷方式編寫串口程序由那幾部分組成

            2.硬件上的支持

            1>UART0發(fā)送FIFO緩沖區(qū)

            A.UART0含有1個(gè)16字節(jié)的發(fā)送FIFO緩沖區(qū)

            B.U0THR是UART0發(fā)送FIFO的最高字節(jié)

            C.UART的發(fā)送FIFO是一直使能的

            2>UART0接收FIFO緩沖區(qū)

            A.UART0含有一個(gè)16字節(jié)的接收FIFO緩沖區(qū)。

            B.軟件設(shè)置接收FIFO緩沖區(qū)的觸發(fā)字節(jié)。

            3>中斷接口:UART0的中斷接口包含中斷使能寄存器(U0IER)和中斷標(biāo)識(shí)寄存器(U0IIR)。

            lU0IIR:提供狀態(tài)碼用于指示一個(gè)掛起中斷的中斷源和優(yōu)先級(jí)。

            lU0IER可以控制UART0的4個(gè)中斷源。

            4>UART0有4個(gè)中斷源:

            A.RLS(接收線狀態(tài))中斷:

            (1)優(yōu)先級(jí)最高

            (2)它在以下條件發(fā)生時(shí)產(chǎn)生錯(cuò)誤

            l幀錯(cuò)誤(FE)

            l溢出錯(cuò)誤(OE)

            l奇偶錯(cuò)誤(PE)

            l間隔中斷(BI)

            注:

            Ø可以通過查看U0LSR[4:1]中的值看到產(chǎn)生該中斷的錯(cuò)誤條件

            Ø讀取U0LSR寄存器時(shí)清除該中斷。

            B.RDA(接收數(shù)據(jù)可用)中斷:

            (1)與CTI中斷并列第二優(yōu)先級(jí)。

            (2)在以下情況觸發(fā)中斷:

            l當(dāng)接收的有效數(shù)據(jù)到達(dá)接收FIFO設(shè)置寄存器(U0FCR)中設(shè)置的觸發(fā)點(diǎn)時(shí),RDA被激活。當(dāng)接收FIFO中的有效數(shù)據(jù)少于觸發(fā)點(diǎn)時(shí),RDA復(fù)位。

            l中斷過程:

            1>移位寄存器(U0RSR)從RxD引腳接收串行數(shù)據(jù)后,送入接收FIFO中

            2>當(dāng)接收FIFO中的有效數(shù)據(jù)數(shù)量達(dá)到預(yù)定的觸發(fā)點(diǎn)時(shí),置位RDA中斷。

            3>從U0RBR寄存器中讀取FIFO中最早到達(dá)的數(shù)據(jù),當(dāng)FIFO中的有效數(shù)據(jù)小于觸發(fā)點(diǎn)時(shí),清零RDA中斷。

            C.CTI(字符超時(shí)指示)中斷

            (1)優(yōu)先級(jí)為2.

            (2)在以下情況發(fā)生中斷:

            l當(dāng)接收FIFO中的有效數(shù)據(jù)少于預(yù)定的觸發(fā)點(diǎn)數(shù)量時(shí),如果在一定時(shí)間內(nèi)仍沒有接收到新的數(shù)據(jù),那將觸發(fā)該中斷。

            (3)上面的時(shí)間指的是:3.5~4.5個(gè)字節(jié)所需要的時(shí)間。

            (4)對(duì)接收FIFO的任何操作都會(huì)清零該中斷標(biāo)志。

            (5)中斷過程:

            l移位寄存器(U0RSR)從RxD0引腳接收串行數(shù)據(jù)后,送入接收FIFO中。

            l當(dāng)接收FIFO中的有效數(shù)據(jù)少于觸發(fā)個(gè)數(shù),但如果長時(shí)間沒有數(shù)據(jù)到達(dá),則觸發(fā)CTI中斷。

            l從U0RBR中讀取接收FIFO中的數(shù)據(jù),或者有新的數(shù)據(jù)送入接收FIFO,都將清零CTI中斷。

            注:

            Ø3.5~4.5個(gè)字節(jié)的時(shí)間:指在串口當(dāng)前的波特率下,發(fā)送3.5~4.5個(gè)字節(jié)所需要的時(shí)間。

            Ø當(dāng)接收FIFO中存放多個(gè)數(shù)據(jù),從U0RBR讀取數(shù)據(jù),但是沒有讀完所有數(shù)據(jù),那么在經(jīng)過3.5~4.5個(gè)字節(jié)的時(shí)間后觸發(fā)CTI中斷。

            D.THRE(發(fā)送)中斷

            (1)優(yōu)先級(jí)為第三級(jí)優(yōu)先級(jí)。

            (2)當(dāng)FIFO為空并且在以下情況觸發(fā)中斷:

            l系統(tǒng)啟動(dòng)時(shí),雖然發(fā)送FIFO為空,但不會(huì)產(chǎn)生THRE中斷。

            l在上一次發(fā)生THRE中斷后,向發(fā)送FIFO中寫入1個(gè)字節(jié)數(shù)據(jù),將在一個(gè)字節(jié)加上一個(gè)停止位后發(fā)生THRE中斷

            (because:如果發(fā)送移位寄存器為空,那么寫入發(fā)送FIFO的數(shù)據(jù)將直接進(jìn)入發(fā)送移位寄存器。此時(shí)發(fā)送FIFO仍然為空,如果立即產(chǎn)生THRE中斷,就會(huì)影響緊接著寫入發(fā)送FIFO的數(shù)據(jù)。

            所以在發(fā)送完該一個(gè)字節(jié)以及一個(gè)停止位后,才產(chǎn)生THRE中斷。

            l如果在發(fā)送FIFO中有過兩個(gè)字節(jié)以上的數(shù)據(jù),但是現(xiàn)在發(fā)送FIFO為空時(shí),將立即觸發(fā)THRE中斷。

            l當(dāng)THRE中斷為當(dāng)前有效的最高優(yōu)先級(jí)中斷時(shí),往U0THR寫數(shù)或者對(duì)U0IIR的讀操作,將使THRE中斷復(fù)位

            我們來看看這些中斷源與存儲(chǔ)器之間的關(guān)系:

            注:

            Ø由上圖可知:UART0有4個(gè)中斷源:分別是RLS(線狀態(tài))中斷,RDA(接收數(shù)據(jù))中斷,CTI(字符超時(shí))中斷,THRE(發(fā)送數(shù)據(jù))中斷。

            Ø4個(gè)中斷源的優(yōu)先級(jí)如下圖所示:

            3.串口中斷接收初始化

            1>串口中斷接收初始化流程

            l設(shè)置I/O引腳連接到UART0

            l置位除數(shù)鎖存位,配置UART0幀數(shù)據(jù)格式

            l根據(jù)波特率計(jì)算分頻值

            l設(shè)置波特率

            l清除除數(shù)鎖存位,并設(shè)置工作模式

            l使能FIFO,并設(shè)置觸發(fā)點(diǎn)

            l允許RBR中斷

            注:我們可以發(fā)現(xiàn)與輪訓(xùn)方式相比,中斷方式只是增加了使能FIFO,并設(shè)置中斷觸發(fā)點(diǎn)和允許RBR中斷兩步。

            2>中斷串口初始化需要配置的寄存器

            (與輪循方式配置方法相同的寄存器在此處不在涉及)

            lU0FCR(FIFO控制寄存器):U0FCR控制UART0 Rx和Tx FIFO的操作。

            lU0IER(中斷使能寄存器):U0IER用于使能4個(gè)UART0中斷源。

            3>具體寄存器的配置

            (1)U0FCR

            A作用:控制UART0 Rx和Tx的操作。

            B長度:8位寄存器。

            C:每一位的含義:

            l第0位:表示FIFO使能

            置1:表示使能對(duì)UART0 Rx和Tx的FIFO以及U0FCR[7:1]的訪問。

            置0:表示不能使用Rx和Tx的FIFO以及步能對(duì)U0FCR[7:1]的訪問。

            注:該位的任何變化都將使UART0 FIFO清空。

            l第1位:表示Rx FIFO的復(fù)位。

            置1:會(huì)清零UART0 RxFIFO中的所有字節(jié)并復(fù)位指針邏輯。該位自動(dòng)清零。

            l第2位:表示Tx FIFO的復(fù)位。

            置1:會(huì)清零UART0 TxFIFO中的所有字節(jié)并復(fù)位指針邏輯。改位自動(dòng)清零。

            l第[5:3]位:保留位,用戶不能對(duì)其進(jìn)行操作。從保留位讀出的值未被定義。

            l第[7:6]位:表示Rx觸發(fā)選擇

            00:觸發(fā)點(diǎn)為0(默認(rèn)為1字節(jié))

            01:觸發(fā)點(diǎn)為1(默認(rèn)為4字節(jié))

            10:觸發(fā)點(diǎn)為2(默認(rèn)為8字節(jié))

            11:觸發(fā)點(diǎn)為3(默認(rèn)為14字節(jié))

            注:這兩個(gè)位決定在激活中斷之前,接收UART0 FIFO必須寫入個(gè)字符。

            (2)U0IER(中斷使能寄存器)

            A作用:U0IER用于使能4個(gè)UART0中斷源

            B長度:8位寄存器

            C每一位的含義:

            l第0位:表示RBR中斷使能

            置1:使能RDA中斷

            置0:禁止RDA中斷

            注:U0IEER第零位使能UART0接收數(shù)據(jù)可用中斷。它還控制(CTI)字符接收超時(shí)中斷。

            l第1位:表示THRE中斷使能

            置1:使能THRE中斷

            置0:禁止THRE中斷

            l第2位:表示Rx線狀態(tài)中斷使能

            置1:使能Rx線狀態(tài)中斷

            置0:禁止RX線狀態(tài)中斷

            注:U0IER第二位使能UART0 Rx線狀態(tài)中斷。該中斷的狀態(tài)可從U0LSR[4:1]讀出

            l第[7:3]位:是保留位

            注:用戶不能向其寫入1.

            4>串口初始化程序:

            *

            *作者:tiger-john

            *時(shí)間:2011年1月18日

            *名稱:UART0_Init

            *功能:UART0初始化通訊波特率115200,8位數(shù)據(jù)位,1位停止位,無奇偶校驗(yàn)

            *接收FIFO觸發(fā)點(diǎn)為8字節(jié),使能RDR(接收數(shù)據(jù))中斷

            *入口參數(shù):bps串口波特率

            *出口參數(shù):無

            /

            voidUART0_Init(uint32 bps)

            {

            uint16Fdiv;

            PINSEL0 = (PINSEL0 & ~(0xf) | 0x05) ;//設(shè)置UART0的引腳

            U0LCR = 0x83;//置為除數(shù)鎖存位,進(jìn)行配置

            Fdiv = (Fpclk>>4)/bps;

            U0DLM = Fdiv>>8;

            U0DLL = Fdiv%256;

            U0LCR = 0x03;//清除除數(shù)鎖存位,并設(shè)置工作模式

            U0FCR = 0x81;//使能FIFO,并設(shè)置觸發(fā)點(diǎn)為8字節(jié)

            U0IER = 0x01;//允許RBR中斷,即接收中斷

            }

            5.中斷初始化

            先來看一下UART0和VIC之間的關(guān)系:

            1>中斷初始化流程:

            l選擇中斷為向量中斷或快速中斷

            l分配中斷通道

            l設(shè)置UART0向量地址

            l使能UART0中斷

            2>關(guān)于ARM中斷編程方法和寄存器的使用在此不做涉及(如果想知道的話,可以看這篇文章http://blog.csdn.net/tigerjb/archive/2010/11/30/6045409.aspx

            3>中斷初始化程序:

            /

            *作者:tiger-john

            *時(shí)間:2011年1月18日

            *名稱:Interrupt_Init

            *功能:初始化串口中斷,給串口中斷選擇為向量中斷,分配向量通道號(hào)1給串口

            *入口參數(shù):無

            *出口參數(shù):無

            /

            void Interrupt_Init (void)

            {

            VICIntSelect = 0x00000000;//設(shè)置所有通道為IRQ中斷

            VICVectCntl1 = (0x20 | 6);// UART0中斷通道分配到IRQ slot 1

            VICVectAddr1 = (uint32)UART0_Exception; //設(shè)置UART0向量地址

            VICIntEnable = 1 << 6;//使能串口中斷

            }

            6.用中斷編寫接收函數(shù)

            1>中斷服務(wù)函數(shù)流程

            l清除串口中斷標(biāo)識(shí)寄存器(U0IIR)

            l清除中斷標(biāo)志

            l讀取接收FIFO中的數(shù)據(jù)

            2>中斷函數(shù)服務(wù)函數(shù)中需要配置的寄存器

            (1)U0IIR中斷標(biāo)識(shí)寄存器。

            l第0位:表示中斷掛起

            置1:表示沒有掛起的中斷

            置0:表示至少有一個(gè)中斷掛起

            l第[3:1]位:中斷標(biāo)識(shí),這三位表示了對(duì)應(yīng)UART0 Rx FIFO的中斷。

            001:表示發(fā)送中斷(THRE)

            010:表示接收數(shù)據(jù)可用中斷(RDA)

            011:表示接收線狀態(tài)中斷(RLS)

            110:表示字符超時(shí)中斷(CTI)

            l第[7:4]:是保留位

            注:

            1.U0IIR提供的狀態(tài)碼可用于指示一個(gè)掛起中斷的中斷源和優(yōu)先級(jí)。

            2.在訪問U0IIR過程中,中斷被凍結(jié)

            3.如果在訪問U0IIR時(shí),產(chǎn)生了中斷,該中斷被記錄。在下次訪問U0IIR時(shí)可以讀出,避免中斷的丟失。

            3>中斷服務(wù)函數(shù)程序:

            /* *名稱:IRQ_UART0()

            *功能:串口UART0中斷接收8個(gè)字節(jié)的數(shù)據(jù)

            *入口參數(shù):無

            *出口參數(shù):無

            /

            uint8rcv_buf[8];// UART0數(shù)據(jù)接收緩沖區(qū)

            void__irq IRQ_UART0(void)

            {uint8i;

            uint32 data;

            data = U0IIR;//清除中斷表示寄存器標(biāo)志

            VICVectAddr = 0;//清除中斷

            for(i=0; i<8; i++)

            {

            rcv_buf[i] = U0RBR;//讀取FIFO的數(shù)據(jù)

            }

            }

            7.看一個(gè)總程序:

            view plaincopy to clipboardprint?
            1. /Copyright(c)
            2. 西安郵電學(xué)院
            3. graduateschool
            4. XNMS實(shí)驗(yàn)室
            5. Author:冀博
            6. Time:2011年1月20日
            7. http://blog.csdn.net/tigerjb
            8. --------------FileInfo-------------------------------------------------------------------------------
            9. Filename:UART0_while
            10. LastmodifiedDate:2011-01-20
            11. LastVersion:1.0
            12. Descriptions:通過上位機(jī)給串口發(fā)送8字節(jié)數(shù)據(jù),ARM2200接收到串口數(shù)據(jù)后,把數(shù)據(jù)又發(fā)送回上位機(jī)
            13. ------------------------------------------------------------------------------------------------------*/
            14. /
            15. Modifiedby:TIGER0-JOHN
            16. Modifieddate:2011-1-21
            17. Version:2.0
            18. Descriptions:測試成功
            19. 在用中斷的時(shí)候在Startup.S文件中的InitStack子程序中,修改設(shè)置
            20. 系統(tǒng)模式堆棧處的代碼為"MSRCPSR_c,#0x5f"
            21. 測試成功,在上面上發(fā)送16進(jìn)制數(shù)時(shí),每個(gè)之間用空格隔開
            22. 不加前綴
            23. /
            24. #include"config.h"
            25. uint8recver_buffer[8];
            26. uint8rcv_new;
            27. /
            28. *名稱:UART0_Init()
            29. *功能:UART0初始化(通訊波特率115200,8位數(shù)據(jù)位,
            30. 1位停止位,無奇偶校驗(yàn))
            31. *入口參數(shù):bps串口波特率
            32. *出口參數(shù):無
            33. /
            34. voidUART0_Init(uint32bps)
            35. {
            36. uint16Fdiv;
            37. PINSEL0=0x00000005;//設(shè)置串口引腳
            38. U0LCR=0x83;//置為除數(shù)鎖存位,進(jìn)行配置
            39. Fdiv=(Fpclk>>4)/bps;//設(shè)置波特率
            40. U0DLM=Fdiv>>8;
            41. U0DLL=Fdiv&0xff;
            42. U0LCR=0x03;//清除除數(shù)鎖存位,并設(shè)置工作模式模式
            43. U0FCR=0x81;//使能FIFO,并設(shè)置觸發(fā)點(diǎn)為8字節(jié)
            44. U0IER=0x01;//允許RBR中斷,即接收中斷
            45. }
            46. /*
            47. *名稱:IRQ_UART0
            48. *功能:串口UART0中斷接收8個(gè)字節(jié)的數(shù)據(jù)
            49. *入口參數(shù):無
            50. *出口參數(shù):無
            51. /
            52. void__irqIRQ_UART0(void)
            53. {uint8i;
            54. if(0x04==(U0IIR&0x0F))
            55. {
            56. rcv_new=1;//設(shè)置接收到新的數(shù)據(jù)標(biāo)志,并清除中斷標(biāo)志位
            57. for(i=0;i<8;i++)
            58. {
            59. recver_buffer[i]=U0RBR;//讀取FIFO的數(shù)據(jù)
            60. }
            61. VICVectAddr=0;
            62. }//清除中斷
            63. }
            64. /
            65. *名稱:Interrupt_Init
            66. *功能:初始化串口中斷,給串口中斷選擇為向量中斷,
            67. *分配向量通道號(hào)1給串口
            68. *入口參數(shù):無
            69. *出口參數(shù):無
            70. /
            71. voidInterrupt_Init(void)
            72. {
            73. VICIntSelect=0x00000000;//設(shè)置所有通道為IRQ中斷
            74. VICVectCntl0=0x26;//UART0中斷通道分配到IRQslot0,即優(yōu)先級(jí)最高
            75. VICVectAddr0=(int)IRQ_UART0;//設(shè)置UART0向量地址
            76. VICIntEnable=0x00000040;//使能UART0中斷
            77. }
            78. /
            79. *名稱:UART0_SendByte
            80. *功能:向串口發(fā)送字節(jié)數(shù)據(jù),并等待發(fā)送完畢。
            81. *入口參數(shù):data要發(fā)送的數(shù)據(jù)
            82. *出口參數(shù):無
            83. /
            84. voidUART0_SendByte(uint8data)
            85. {
            86. U0THR=data;
            87. while(0==(U0LSR&0x40));
            88. }
            89. /
            90. *名稱:UART0_SendBuf()
            91. *功能:通過串口發(fā)送一幀數(shù)據(jù)
            92. *入口參數(shù):*buffer存放一幀數(shù)據(jù)
            93. *出口參數(shù):無
            94. /
            95. voidUART0_SendBuf(uint8*buffer)
            96. {
            97. uint8*pbuffer;
            98. uint8i;
            99. for(pbuffer=buffer,i=0;i<8;i++)
            100. UART0_SendByte(*(pbuffer++));
            101. }
            102. /
            103. *名稱:main()函數(shù)
            104. *功能:上位機(jī)接收的數(shù)據(jù)開頭兩個(gè)字符為0x10,0x11,
            105. *則原樣輸出,否次輸出0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27
            106. *入口參數(shù):*buffer存放一幀數(shù)據(jù)
            107. *出口參數(shù):無
            108. /
            109. intmain(void)
            110. {
            111. uint8send_buffer[8]={0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27};//定義發(fā)送幀緩沖區(qū)
            112. UART0_Init(115200);
            113. Interrupt_Init();
            114. while(1)
            115. {
            116. if(1==rcv_new)//是否已經(jīng)接收到8Bytes的數(shù)據(jù)
            117. {
            118. rcv_new=0;//清除標(biāo)志
            119. if(0x10==recver_buffer[0]&&0x11==recver_buffer[1])
            120. {
            121. UART0_SendBuf(send_buffer);
            122. }
            123. else
            124. {
            125. UART0_SendBuf(recver_buffer);
            126. }
            127. }
            128. }
            129. return0;
            130. }
            131. /*
            132. EndOfFile
            133. /

            四.用中斷編寫發(fā)送函數(shù)

            1.中斷初始化

            同上和用中斷接收函數(shù)時(shí)的中斷初始化是一樣的

            2.串口初始化

            1>串口初始化流程:

            l設(shè)置I/O引腳連接到UART0

            l置位除數(shù)鎖存位,配置UART0幀格式

            l根據(jù)波特率計(jì)算分頻值

            l設(shè)置波特率

            l清除除數(shù)鎖存位,并設(shè)置工作模式

            l使能FIFO,并使TxFIFO復(fù)位

            l使能THRE中斷

            2>串口初始化函數(shù):

            /

            *名稱:UART0_Init

            *功能:UART0初始化通訊波特率115200,8位數(shù)據(jù)位,1位停止位,無奇偶校驗(yàn)

            *使能TxFIFO,和THRE中斷

            *入口參數(shù):bps串口波特率

            *出口參數(shù):無

            /

            voidUART0_Init(uint32 bps)

            {

            uint16Fdiv;

            PINSEL0 = (PINSEL0 & ~(0xf) | 0x05) ;//設(shè)置UART0的引腳

            U0LCR = 0x83;//置位除數(shù)鎖存位,配置UART0幀格式

            Fdiv = (Fpclk>>4)/bps;//根據(jù)波特率計(jì)算分頻值

            U0DLM = Fdiv>>8;//設(shè)置波特率

            U0DLL = Fdiv%256;

            U0LCR = 0x03;//清除除數(shù)鎖存位,并設(shè)置工作模式

            U0FCR = 0x05;//使能TxFIFO,并使TxFIFO復(fù)位

            U0IER = 0x02;//使能THRE中斷

            }

            3中斷服務(wù)函數(shù):

            1>中斷服務(wù)函數(shù)流程:

            l清除串口中斷標(biāo)識(shí)寄存器

            l清除中斷控制標(biāo)識(shí)寄存器

            2>中斷發(fā)送服務(wù)函數(shù)程序:

            /

            *名稱:UART0_Exception

            *功能:串口發(fā)送中斷

            *入口參數(shù):無

            *出口參數(shù):data發(fā)送的數(shù)據(jù)

            /

            void__irq IRQ_UART0(void)

            {

            uint32 data;

            data = U0IIR;//清除中斷表示寄存器標(biāo)志

            VICVectAddr = 0;//清除中斷

            }

            4.用串口中斷發(fā)送函數(shù)的總程序:

            view plaincopy to clipboardprint?
            1. /Copyright(c)
            2. 西安郵電學(xué)院
            3. graduateschool
            4. XNMS實(shí)驗(yàn)室
            5. Author:冀博
            6. Time:2011年1月20日
            7. http://blog.csdn.net/tigerjb
            8. --------------FileInfo-------------------------------------------------------------------------------
            9. Filename:UART0_while
            10. LastmodifiedDate:2011-01-20
            11. LastVersion:1.0
            12. Descriptions:通過上位機(jī)給串口發(fā)送8字節(jié)數(shù)據(jù),ARM2200接收到串口數(shù)據(jù)后,用中斷方式把數(shù)據(jù)又發(fā)送回上位機(jī)
            13. ------------------------------------------------------------------------------------------------------*/
            14. /
            15. Modifiedby:TIGER0-JOHN
            16. Modifieddate:2011-1-21
            17. Version:2.0
            18. Descriptions:測試成功
            19. 在用中斷的時(shí)候在Startup.S文件中的InitStack子程序中,修改設(shè)置
            20. 系統(tǒng)模式堆棧處的代碼為"MSRCPSR_c,#0x5f"
            21. 測試成功,在上面上發(fā)送16進(jìn)制數(shù)時(shí),每個(gè)之間用空格隔開
            22. 不加前綴
            23. /
            24. #include"config.h"
            25. uint8recver_buffer[8];
            26. uint8rcv_new;
            27. /
            28. *名稱:UART0_Init
            29. *功能:UART0初始化通訊波特率115200,8位數(shù)據(jù)位,1位停止位,無奇偶校驗(yàn)
            30. *使能TxFIFO,和THRE中斷
            31. *入口參數(shù):bps串口波特率
            32. *出口參數(shù):無
            33. /
            34. voidUART0_Init(uint32bps)
            35. {
            36. uint16Fdiv;
            37. PINSEL0=(PINSEL0&~(0xf)|0x05);//設(shè)置UART0的引腳
            38. U0LCR=0x83;//置位除數(shù)鎖存位,配置UART0幀格式
            39. Fdiv=(Fpclk>>4)/bps;//根據(jù)波特率計(jì)算分頻值
            40. U0DLM=Fdiv>>8;//設(shè)置波特率
            41. U0DLL=Fdiv%256;
            42. U0LCR=0x03;//清除除數(shù)鎖存位,并設(shè)置工作模式
            43. U0FCR=0x05;//使能TxFIFO,并使TxFIFO復(fù)位
            44. U0IER=0x02;//使能THRE中斷
            45. }
            46. /
            47. *名稱:UART0_Exception
            48. *功能:串口發(fā)送中斷
            49. *入口參數(shù):無
            50. *出口參數(shù):data發(fā)送的數(shù)據(jù)
            51. /
            52. void__irqIRQ_UART0(void)
            53. {
            54. uint32data;
            55. data=U0IIR;//清除中斷表示寄存器標(biāo)志
            56. VICVectAddr=0;//清除中斷
            57. }
            58. /
            59. *名稱:Interrupt_Init
            60. *功能:初始化串口中斷,給串口中斷選擇為向量中斷,
            61. *分配向量通道號(hào)1給串口
            62. *入口參數(shù):無
            63. *出口參數(shù):無
            64. /
            65. voidInterrupt_Init(void)
            66. {
            67. VICIntSelect=0x00000000;//設(shè)置所有通道為IRQ中斷
            68. VICVectCntl0=0x26;//UART0中斷通道分配到IRQslot0,即優(yōu)先級(jí)最高
            69. VICVectAddr0=(int)IRQ_UART0;//設(shè)置UART0向量地址
            70. VICIntEnable=0x00000040;//使能UART0中斷
            71. }
            72. /
            73. *名稱:UART0_RcvByte
            74. *功能:用查詢方式接收一字節(jié)的數(shù)據(jù)
            75. *入口參數(shù):無
            76. *出口參數(shù):data要接收的數(shù)據(jù)
            77. /
            78. uint8UART0_RcvByte(void)
            79. {
            80. uint8rcv_data;
            81. while((U0LSR&0X01)==0);//等待數(shù)據(jù)到達(dá)
            82. rcv_data=U0RBR;//從U0RBR中讀出接收到的數(shù)據(jù)
            83. returnrcv_data;//返回接收到的數(shù)據(jù)
            84. }
            85. /
            86. *名稱:UART0_RecBuf()
            87. *功能:接收串口發(fā)送過來的幀數(shù)據(jù),
            88. *入口參數(shù):*buffer存放一幀數(shù)據(jù)
            89. *出口參數(shù):無
            90. /
            91. voidUART0_RecBuf(uint8*buffer)
            92. {
            93. uint8*pbuffer;
            94. uint8i;
            95. for(pbuffer=buffer,i=0;i<8;i++)
            96. {
            97. *(pbuffer++)=UART0_RcvByte();
            98. }
            99. }
            100. /
            101. *名稱:main()函數(shù)
            102. *功能:上位機(jī)接收的數(shù)據(jù)開頭兩個(gè)字符為0x10,0x11,
            103. *則原樣輸出,否次輸出0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27
            104. *入口參數(shù):*buffer存放一幀數(shù)據(jù)
            105. *出口參數(shù):無
            106. /
            107. intmain(void)
            108. {
            109. uint8i;
            110. uint8send_buffer[8]={0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27};//定義發(fā)送幀緩沖區(qū)
            111. UART0_Init(115200);
            112. Interrupt_Init();
            113. while(1)
            114. {
            115. UART0_RecBuf(recver_buffer);//接收8字節(jié)數(shù)據(jù)
            116. if(0x10==recver_buffer[0]&&0x11==recver_buffer[1])
            117. {
            118. for(i=0;i<8;i++)
            119. {
            120. U0THR=send_buffer[i];//用中斷發(fā)送每次8字節(jié)
            121. }
            122. }
            123. else
            124. {
            125. for(i=0;i<8;i++)//用中斷發(fā)送每次8字節(jié)
            126. {
            127. U0THR=recver_buffer[i];
            128. }
            129. }
            130. }
            131. return0;
            132. }
            133. /*
            134. EndOfFile
            135. /



            關(guān)鍵詞: ARM中斷方式串口編

            評(píng)論


            技術(shù)專區(qū)

            關(guān)閉