音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網(wǎng)
技術交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術 | 電源技術 | 測控之家 | EMC技術 | ARM技術 | EDA技術 | PCB技術 | 嵌入式系統(tǒng)
驅動編程 | 集成電路 | 器件替換 | 模擬技術 | 新手園地 | 單 片 機 | DSP技術 | MCU技術 | IC 設計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe

俺寫的lpc2132的串口驅動(中斷方式)

作者:vcvcvcvc 欄目:ARM技術
俺寫的LPC2132的串口驅動(中斷方式)

#include "lpc213x.h"
#include "Includes.h"

#define BIT(x)  (1<<x)
#define SET_BIT(x, y)   (x|=(1<<y))
#define CLR_BIT(x, y)   (x&=~(1<<y))
#define GET_BIT(x, y)   (x&(1<<y))

volatile struct
{
    INT8U  rd_buf[32];
    INT8U  td_buf[2048];
    INT16U rd_max;
    INT16U td_max;
    INT16U rd_cnt;
    INT16U td_cnt;
} uart0;

OS_EVENT *uart0_rd_ok;
OS_EVENT *uart0_td_ok;

extern void UART0_Handler(void);

void UART0_Exception(void)
{  
       unsigned CHAR i, k;
       
       k = U0IIR&0x0F;
    SWITCH(k)
    {
        case 0x02:            
            for (i=0; i<16; i++)
            {
                if (uart0.td_cnt < uart0.td_max)
                {
                    U0THR = uart0.td_buf[uart0.td_cnt];
                    uart0.td_cnt++;
                }
                else
                {
                    U0IER = U0IER & (~0x02);        
                    OSSemPost(uart0_td_ok);
                    goto UART0_Exception_RET;
                }
            }
            break;
        case 0x04:
            for (i=0; i<8; i++)
            {
                uart0.rd_buf[uart0.rd_cnt] = U0RBR;
                if (uart0.rd_buf[0] == 0xFD)
                {
                    uart0.rd_cnt++;
                    if (uart0.rd_cnt == uart0.rd_max)
                    {
                        OSSemPost(uart0_rd_ok);
                        goto UART0_Exception_RET;
                    }   
                    else if (uart0.rd_cnt > 31)
                    {
                        uart0.rd_cnt = 31;
                    }                    
                }
            }
            break;
        case 0x0C:
            uart0.rd_buf[uart0.rd_cnt] = U0RBR;
            if (uart0.rd_buf[0] == 0xFD)
            {
                uart0.rd_cnt++;                       
                if (uart0.rd_cnt == uart0.rd_max)
                {
                    OSSemPost(uart0_rd_ok);
                    goto UART0_Exception_RET;
                }   
                else if (uart0.rd_cnt > 31)
                {
                    uart0.rd_cnt = 31;
                }                    
            }
            break;
        default:
            break;
    }
UART0_Exception_RET:
      VICVectAddr = 0x00;                         
}

void UART0_init(void)
{  
    INT16U i;
    
    for (i=0; i<32; i+
2樓: >>參與討論
ARM白菜
謝謝啦
中斷看了幾天都不明白,這下好了,雖然我的是2104

3樓: >>參與討論
pubstar
在多任務中,串口驅動,當一個設備想使用串口時,
必須保證當時串口是空閑,如果不空閑,必須等待,直到空間,或者指定時間內(nèi)串口設備未空閑,提示信息,

樓上的串口驅動采用結構,比較不錯

但是要是用在多任何中,如果用多個任何使用此串口,估計會有問題

4樓: >>參與討論
pubstar
采用信號量太占用資源,不如用 Uart0Status=OSFlagCreate表示狀
態(tài),另外,其實完全可以將串口的忙閑狀態(tài)等信息一塊封裝在結構中,這樣不斷模塊化,同時,一個狀態(tài)只占用一個信息,

5樓: >>參與討論
vcvcvcvc
呵呵,改了一下

#include "lpc213x.h"
#include "Includes.h"

#define BIT(x)  (1<<x)
#define SET_BIT(x, y)   (x|=(1<<y))
#define CLR_BIT(x, y)   (x&=~(1<<y))
#define GET_BIT(x, y)   (x&(1<<y))

volatile struct
{
    INT8U  rd_buf[32];
    INT8U  td_buf[2048];
    INT16U rd_max;
    INT16U td_max;
    INT16U rd_cnt;
    INT16U td_cnt;
    OS_EVENT *rd_ok;
    OS_EVENT *td_ok;
} uart0;

extern void UART0_Handler(void);

void UART0_Exception(void)
{  
       unsigned CHAR i, k;
       
       k = U0IIR&0x0F;
    SWITCH(k)
    {
        case 0x02:            
            for (i=0; i<16; i++)
            {
                if (uart0.td_cnt < uart0.td_max)
                {
                    U0THR = uart0.td_buf[uart0.td_cnt];
                    uart0.td_cnt++;
                }
                else
                {
                    U0IER = U0IER & (~0x02);        
                    OSSemPost(uart0.td_ok);
                    goto UART0_Exception_RET;
                }
            }
            break;
        case 0x04:
            for (i=0; i<8; i++)
            {
                uart0.rd_buf[uart0.rd_cnt] = U0RBR;
                if (uart0.rd_buf[0] == 0xFD)
                {
                    uart0.rd_cnt++;
                    if (uart0.rd_cnt == uart0.rd_max)
                    {
                        OSSemPost(uart0.rd_ok);
                        goto UART0_Exception_RET;
                    }   
                    else if (uart0.rd_cnt > 31)
                    {
                        uart0.rd_cnt = 31;
                    }                    
                }
            }
            break;
        case 0x0C:
            uart0.rd_buf[uart0.rd_cnt] = U0RBR;
            if (uart0.rd_buf[0] == 0xFD)
            {
                uart0.rd_cnt++;                       
                if (uart0.rd_cnt == uart0.rd_max)
                {
                    OSSemPost(uart0.rd_ok);
                    goto UART0_Exception_RET;
                }   
                else if (uart0.rd_cnt > 31)
                {
                    uart0.rd_cnt = 31;
                }                    
            }
            break;
        default:
            break;
    }
UART0_Exception_RET:
      VICVectAddr = 0x00;                         
}

void UART0_init(void)
{  
    INT16U i;
    
    for (i=0;
6樓: >>參與討論
jft
好,一直想用雙串口的驅動
 
參與討論
昵稱:
討論內(nèi)容:
 
 
相關帖子
我的程序老是停在;取數(shù)據(jù)中止處,該怎么解決?
用什么軟件可以將圖片轉換成16進制?
請問zlg老師,如何清除2210的Uart0的接收中斷
在easyARM2200上成功移植eCos
改動《深入淺出ARM7—LPC213X/214X(上)》第163頁的程序4.11?
免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號