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

UART0串口編程(三):中斷方式;用中斷編寫發送函數

發布者:mb5362443最新更新時間:2019-09-23 來源: eefocus關鍵字:UART0  串口編程  中斷方式  發送函數 手機看文章 掃描二維碼
隨時隨地手機看文章

一:中斷方式的串口編程


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

2.硬件上的支持


1>UART0 發送FIFO緩沖區


A.UART0含有1個16字節的發送FIFO緩沖區


B.U0THR是UART0發送FIFO的最高字節


C.UART的發送FIFO是一直使能的

2>UART0接收FIFO緩沖區


A. UART0含有一個16字節的接收FIFO緩沖區。


B. 軟件設置接收FIFO緩沖區的觸發字節。

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


第一:U0IIR:提供狀態碼用于指示一個掛起中斷的中斷源和優先級。


第二:U0IER可以控制UART0的4個中斷源。


4> UART0有4個中斷源:


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


(1) 優先級最高


(2) 它在以下條件發生時產生錯誤


第一:幀錯誤(FE)


第二:溢出錯誤(OE)


第三:奇偶錯誤(PE)


第四:間隔中斷(BI)


注:可以通過查看U0LSR[4:1]中的值看到產生該中斷的錯誤條件,讀取U0LSR寄存器時清除該中斷。


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


(1)與CTI中斷并列第二優先級。


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


第一:當接收的有效數據到達接收FIFO設置寄存器(U0FCR)中設置的觸發點時,RDA被激活。當接收FIFO中的有效數據少于觸發點時,RDA復位。


第二:中斷過程:


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


2>  當接收FIFO中的有效數據數量達到預定的觸發點時,置位RDA中斷。


3>  從U0RBR寄存器中讀取FIFO中最早到達的數據,當FIFO中的有效數據小于觸發點時,清零RDA中斷。


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


(1) 優先級為2.


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


當接收FIFO中的有效數據少于預定的觸發點數量時,如果在一定時間內仍沒有接收到新的數據,那將觸發該中斷。


(3) 上面的時間指的是:3.5~4.5個字節所需要的時間。


(4)  對接收FIFO的任何操作都會清零該中斷標志。


(5) 中斷過程:


第一:移位寄存器(U0RSR)從RxD0引腳接收串行數據后,送入接收FIFO中。


第二:當接收FIFO中的有效數據少于觸發個數,但如果長時間沒有數據到達,則觸發CTI中斷。


第三:從U0RBR中讀取接收FIFO中的數據,或者有新的數據送入接收FIFO,都將清零CTI中斷。


注:3.5~4.5個字節的時間:指在串口當前的波特率下,發送3.5~4.5個字節所需要的時間。


當接收FIFO中存放多個數據,從U0RBR讀取數據,但是沒有讀完所有數據,那么在經過3.5~4.5個字節的時間后觸發CTI中斷。


D.  THRE(發送)中斷


(1) 優先級為第三級優先級。


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


第一:系統啟動時,雖然發送FIFO為空,但不會產生THRE中斷。


第二:在上一次發生THRE中斷后,向發送FIFO中寫入1個字節數據,將在一個字節加上一個停止位后發生THRE中斷


(because:如果發送移位寄存器為空,那么寫入發送FIFO的數據將直接進入發送移位寄存器。此時發送FIFO仍然為空,如果立即產生THRE中斷,就會影響緊接著寫入發送FIFO的數據。所以在發送完該一個字節以及一個停止位后,才產生THRE中斷。)


如果在發送FIFO中有過兩個字節以上的數據,但是現在發送FIFO為空時,將立即觸發THRE中斷。當THRE中斷為當前有效的最高優先級中斷時,往U0THR寫數或者對U0IIR的讀操作,將使THRE中斷復位


我們來看看這些中斷源與存儲器之間的關系:

注:由上圖可知:UART0有4個中斷源:分別是RLS(線狀態)中斷,RDA(接收數據)中斷,CTI(字符超時)中斷,THRE(發送數據)中斷。4個中斷源的優先級如下圖所示:


 

3.串口中斷接收初始化


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


l  設置I/O引腳連接到UART0


l  置位除數鎖存位,配置UART0幀數據格式


l  根據波特率計算分頻值


l  設置波特率


l  清除除數鎖存位,并設置工作模式


l  使能FIFO,并設置觸發點


l  允許RBR中斷


注:我們可以發現與輪訓方式相比,中斷方式只是增加了使能FIFO,并設置中斷觸發點和允許RBR中斷兩步。


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


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


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


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


3>具體寄存器的配置


(1) U0FCR


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


B長度:8位寄存器。


C:每一位的含義:


l  第0位:表示FIFO使能


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


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


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


l  第1位:表示Rx FIFO的復位。


置1:會清零UART0 RxFIFO中的所有字節并復位指針邏輯。該位自動清零。


l  第2位:表示Tx FIFO的復位。


置1:會清零UART0 TxFIFO中的所有字節并復位指針邏輯。改位自動清零。


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


l  第[7:6]位:表示Rx觸發選擇


00:觸發點為0(默認為1字節)


01:觸發點為1(默認為4字節)


10:觸發點為2(默認為8字節)


11: 觸發點為3(默認為14字節)


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


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


A 作用:U0IER用于使能4個UART0中斷源


B 長度:8位寄存器


C每一位的含義:


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


置1:使能RDA中斷


置0:禁止RDA中斷


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


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


置1:使能THRE中斷


置0:禁止THRE中斷


l  第2位:表示Rx線狀態中斷使能


置1:使能Rx線狀態中斷


置0:禁止RX線狀態中斷


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


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


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


4>串口初始化程序:void   UART0_Init(uint32 bps)


4.  中斷初始化


先來看一下UART0和VIC之間的關系:


1>中斷初始化流程:


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


l  分配中斷通道


l  設置UART0向量地址


l  使能UART0中斷


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


3>中斷初始化程序:void Interrupt_Init (void)


5.用中斷編寫接收函數


1>  中斷服務函數流程


l  清除串口中斷標識寄存器(U0IIR)


l  清除中斷標志


l  讀取接收FIFO中的數據


2>  中斷函數服務函數中需要配置的寄存器


(1) U0IIR中斷標識寄存器。


l  第0位:表示中斷掛起


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


置0:表示至少有一個中斷掛起


l  第[3:1]位:中斷標識,這三位表示了對應UART0 Rx FIFO的中斷。


001:表示發送中斷(THRE)


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


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


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


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


注:


1.    U0IIR提供的狀態碼可用于指示一個掛起中斷的中斷源和優先級。


2.    在訪問U0IIR過程中,中斷被凍結


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


3>  中斷服務函數程序:void   __irq IRQ_UART0(void)


6.總程序:通過上位機給串口發送8字節數據,ARM2200接收到串口數據后,把數據又發送回上位機。


(在用中斷的時候在Startup.S文件中的InitStack子程序中,修改設置系統模式堆棧處的代碼為"MSR CPSR_c,#0x5f",

測試成功 ,在上面上發送16進制數時,每個之間用空格隔開不加前綴。)



#include "config.h"

uint8 recver_buffer[8];    

uint8 rcv_new;     

/**********************************************************

* 名稱: UART0_Init()

* 功能: UART0初始化(通訊波特率115200,8位數據位,

1位停止位,無奇偶校驗)

* 入口參數: bps     串口波特率

* 出口參數: 無

**********************************************************/

void  UART0_Init(uint32 bps)

{  

    uint16 Fdiv;

    PINSEL0 = 0x00000005;               //設置串口引腳

    U0LCR = 0x83; //置為除數鎖存位,進行配置

    Fdiv = (Fpclk >> 4) / bps;     // 設置波特率

    U0DLM = Fdiv >> 8;

    U0DLL = Fdiv & 0xff;

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

    U0FCR = 0x81;                     // 使能FIFO,并設置觸發點為8字節

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

 

}

/*********************************************************  

* 名    稱:    IRQ_UART0

* 功    能: 串口UART0中斷接收8個字節的數據

* 入口參數: 無

* 出口參數: 無

**********************************************************/ 

void   __irq IRQ_UART0(void)

{   uint8  i;

    if( 0x04 == (U0IIR&0x0F) ) 

    {

     rcv_new = 1; // 設置接收到新的數據標志,并清除中斷標志位

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

    {

        recver_buffer[i] = U0RBR;       // 讀取FIFO的數據

    }

      VICVectAddr = 0;

     }                           //清除中斷

}  

/**********************************************************

* 名稱:          Interrupt_Init

* 功能:          初始化串口中斷,給串口中斷選擇為向量中斷,

*                 分配向量通道號1給串口                        

* 入口參數:      無

* 出口參數:      無

**********************************************************/

void Interrupt_Init (void)

{

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

    VICVectCntl0 = 0x26;        // UART0中斷通道分配到IRQ slot 0,即優先級最高

    VICVectAddr0 = (int)IRQ_UART0;        // 設置UART0向量地址

    VICIntEnable = 0x00000040;            // 使能UART0中斷

               

}

/**********************************************************

* 名    稱:            UART0_SendByte

* 功    能:            向串口發送字節數據,并等待發送完畢。

* 入口參數:            data              要發送的數據

* 出口參數:            無

**********************************************************/

void   UART0_SendByte(uint8 data)

{

U0THR = data;                 

while(0 == (U0LSR & 0x40));

}

/**********************************************************

* 名稱: UART0_SendBuf()

* 功能: 通過串口發送一幀數據

* 入口參數: *buffer  存放一幀數據

* 出口參數: 無

**********************************************************/

void UART0_SendBuf(uint8 *buffer)

{

uint8 *pbuffer;

    uint8 i;

for(pbuffer = buffer,i = 0;i < 8; i++)

UART0_SendByte(*(pbuffer++));

}

 

/**********************************************************

* 名稱: main()函數

* 功能: 上位機接收的數據開頭兩個字符為0x10,0x11,

* 則原樣輸出,否次輸出0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27

* 入口參數: *buffer  存放一幀數據

* 出口參數: 無

**********************************************************/

 

int main (void)

                                    

    uint8 send_buffer[8] ={0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27};  //定義發送幀緩沖區

    UART0_Init(115200);

    Interrupt_Init();

    while(1)

    {

      if(1 == rcv_new)  // 是否已經接收到8 Bytes的數據

      {  

            rcv_new = 0;        // 清除標志

      if(0x10 ==recver_buffer[0] && 0x11 == recver_buffer[1])

      {

      UART0_SendBuf(send_buffer);

      }

          else

      {

      UART0_SendBuf(recver_buffer);

      }

          } 

      }        

     return 0;

}

 


二.用中斷編寫發送函數

1.中斷初始化

同上和用中斷接收函數時的中斷初始化是一樣的

2.串口初始化

 1>串口初始化流程:

l  設置I/O引腳連接到UART0

l  置位除數鎖存位,配置UART0幀格式

l  根據波特率計算分頻值

l  設置波特率

l  清除除數鎖存位,并設置工作模式

l  使能FIFO,并使TxFIFO復位

l  使能THRE中斷

  2>串口初始化函數:void   UART0_Init(uint32 bps)


3.中斷服務函數:

  1>中斷服務函數流程:

l  清除串口中斷標識寄存器

l  清除中斷控制標識寄存器

  2>中斷發送服務函數程序:void   __irq IRQ_UART0(void)


4.用串口中斷發送函數的總程序:通過上位機給串口發送8字節數據,ARM2200接收到串口數據后,用中斷方式把數據又發送回上位機。


#include "config.h"

uint8 recver_buffer[8];    

uint8 rcv_new;     

/****************************************************************************

* 名稱: UART0_Init

* 功能: UART0初始化 通訊波特率115200,8位數據位,1位停止位,無奇偶校驗

* 使能TxFIFO,和THRE中斷

* 入口參數: bps 串口波特率

* 出口參數: 無

****************************************************************************/

void  UART0_Init(uint32 bps)

{

 

    uint16  Fdiv;

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

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

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

[1] [2]
關鍵字:UART0  串口編程  中斷方式  發送函數 引用地址:UART0串口編程(三):中斷方式;用中斷編寫發送函數

上一篇:嵌入式處理器的體系架構與內核詳解
下一篇:UART0串口編程(二):硬件原理;輪訓方式的串口編程

推薦閱讀最新更新時間:2025-05-30 01:58

STM32基礎設計(5)---ADC轉換(中斷方式
本文簡單介紹了STM32F103C8,通過中斷方式讀取電壓,不過最后樓主讀取參考電壓失敗,還沒有找到錯誤,所以讀取的電壓只能十六進制顯示,如有不便請忽略本文! 本文的介紹按照一般流程來走: 1,串口的初始化 2,ADC初始化 3,中斷初始化 4,編寫中斷函數 5,編寫主函數 接下來詳細介紹: 1,串口的初始化: void usart_init() { GPIO_InitTypeDef Uart_A; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA ,ENABLE); Uart_A.GPIO_Pin = GPIO_Pin_9; Uar
[單片機]
TMS320F28x上RTOS移植關鍵技術研究
  TMS320F28x上RTOS移植關鍵技術研究    摘要 詳細分析TT公司TMS320F28x系列DSP的啟動過程;說明BootROM中程序的運行過程,介紹C編譯器和DSP/BIOS的工作細節;探討DSP的中斷處理及從RAM中執行代碼等問題。最后分析如何在TMS320F28x系列DSP上移植實時操作系統。    關鍵詞 數字信號處理器 TMS320F28x BootRoM 實時操作系統   TMS320F28x(簡稱“F28x”)數字信號處理器是TI公司推出的32位定點DSP控制器,其頻率高達150 MHz,大大提高了控制系統的精度和芯片的處理能力。在F28x系列DSP上移植實時操作系統,需要對編澤器、系統啟動過程、中
[嵌入式]
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

隨便看看

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京B2-20211791 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 新邵县| 新安县| 黄陵县| 亳州市| 万宁市| 尼玛县| 曲周县| 呼和浩特市| 濮阳市| 高安市| 昌乐县| 蒲城县| 承德市| 扶沟县| 铁力市| 开原市| 股票| 交口县| 永嘉县| 三门峡市| 长葛市| 玛曲县| 历史| 东乡族自治县| 金阳县| 辽宁省| 板桥市| 科技| 阳春市| 泰兴市| 分宜县| 曲沃县| 兴隆县| 定结县| 锡林浩特市| 介休市| 鄂托克前旗| 海淀区| 濉溪县| 赣榆县| 元氏县|