⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uart0.c

📁 S3C2410学习的基础资料 大部分实验源码及工程
💻 C
字号:
/*
*********************************************************************************************************
* 文件: UART0.C
* 描述: 串口 0 服务函数.
* 编写: bobey
*********************************************************************************************************
*/
#include  "Includes.H"

#define  Uart0Bps  57600                                    // UART0 波特率.

/*
********************************************************************************************************
* 函数: void Init_Uart0 (void).
* 描述: 初始化 UART0, 请明确调用此函数初始化 Uart0 .
********************************************************************************************************
*/
void Init_Uart0 (void)
{
    rULCON0  = ((0<<6)+(0<<3)+(0<<2)+(3<<0));				//UART0每帧收发8bits
    rUCON0   = ((0<<10)+(0<<9)+(0<<8)+(0<<7)+(0<<6)+(0<<5)+(0<<4)+(1<<2)+(1<<0));//UART0收发模式是中断请求或者注册
    rUFCON0  = ((0<<6)+(0<<4)+(0<<2)+(0<<1)+(1<<0));		//FIFO Enable	
    rUMCON0  = ((0<<4)+(0<<0));								//Activate nRTS
    rUBRDIV0 = ((int)(PCLK/(Uart0Bps*16))-1);				//Baud rate(54) 57600

    Uart0.Wr  = 0;                                          // 初始化自定义缓冲区.
    Uart0.Rd  = 0;
    Uart0.Sem = OSSemCreate (1);                            // 建立一个信号量,避免冲突.

    rINTMOD    &= ~(BIT_UART0);                             // IRQ mode.
    rINTMSK    &= ~(BIT_UART0);                             // 开 UART0 发送中断屏蔽位.
    rINTSUBMSK &= ~(BIT_SUB_TXD0);							// 开UART0子发送中断屏蔽位。
}

/*
********************************************************************************************************
* 函数: void __irq ISR_Uart0 (void).
* 描述: UART0 中断服务程序.
********************************************************************************************************
*/
void  __irq ISR_Uart0 (void)
{
    OSIntEnter();

    if (rSUBSRCPND & BIT_SUB_TXD0) {
        while ((rUFSTAT0 & (1<<9)) == 0) {                  // 塞满 FIFO 为止.
            if (Uart0.Rd != Uart0.Wr) {
                rUTXH0 = Uart0.Buffer[Uart0.Rd++];
                if (Uart0.Rd >= Uart0BufSize) {
                    Uart0.Rd = 0x00;
                }
            } else    break;                                // 发送完毕.
        }
        rSUBSRCPND=(BIT_SUB_TXD0);		                    // Clear Sub int pending.
    } else {
        while (1) ;                                         // 未定义中断,请检查中断原因.
    }

    OSIntExit();

    ClearPending(BIT_UART0);		                        // Clear master pending.
}

/*
********************************************************************************************************
* End.
********************************************************************************************************
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -