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

📄 uart.c

📁 hreadx实时嵌入式操作系统源代码,ARM移植. threadx是一个很好的多任务实时嵌入式操作系统
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************Copyright (c)****************************************************
**                            Guangzhou ZHIYUAN electronics Co.,LTD.
**                                      
**                                 http://www.embedtools.com
**
**--------------File Info---------------------------------------------------------------------------------
** File name:               uart.c
** Last modified Date:      2007-09-16
** Last Version:            1.0.0
** Descriptions:            S3C2410 UART 基础驱动
**
**--------------------------------------------------------------------------------------------------------
** Created by:              Hanhui
** Created date:            2007-09-16
** Version:                 1.0.0
** Descriptions:            S3C2410 UART 基础驱动
**
**--------------------------------------------------------------------------------------------------------
** Modified by:             Hanhui
** Modified date:           2007-12-19
** Version:                 1.0.0
** Descriptions:            S3C2440 UART 基础驱动
**
*********************************************************************************************************/
#include "config.h"
#include "uart.h"
/*********************************************************************************************************
  宏定义
*********************************************************************************************************/
#define __COM0_CLKBIT       (1 << 10)                                   /*  COM0 在 CLKCON 中的位置     */
#define __COM1_CLKBIT       (1 << 11)                                   /*  COM1 在 CLKCON 中的位置     */
#define __COM2_CLKBIT       (1 << 12)                                   /*  COM2 在 CLKCON 中的位置     */

#define __COM0_GPIO         ((1 << 2) | (1 << 3))                       /*  COM0 在 IO 口线中的位置     */
#define __COM1_GPIO         ((1 << 4) | (1 << 5))                       /*  COM1 在 IO 口线中的位置     */
#define __COM2_GPIO         ((1 << 6) | (1 << 7))                       /*  COM2 在 IO 口线中的位置     */

#define __COM0_GPHCON       ((0x2 <<  4) | (0x2 <<  6))                 /*  COM0 在 GPHCON 中的设置     */
#define __COM1_GPHCON       ((0x2 <<  8) | (0x2 << 10))                 /*  COM1 在 GPHCON 中的设置     */
#define __COM2_GPHCON       ((0x2 << 12) | (0x2 << 14))                 /*  COM1 在 GPHCON 中的设置     */

#define __COM0_MASK         ((0x3 <<  4) | (0x3 <<  6))                 /*  COM0 在 GPHCON 中的区域     */
#define __COM1_MASK         ((0x3 <<  8) | (0x3 << 10))                 /*  COM1 在 GPHCON 中的区域     */
#define __COM2_MASK         ((0x3 << 12) | (0x3 << 14))                 /*  COM2 在 GPHCON 中的区域     */
/*********************************************************************************************************
** Function name:           uartInit
** Descriptions:            初始化 UART
** input parameters:        iCom                串口号
**                          iInFrared           是否使用红外模式
**                          iData               数据位数
**                          iStopBit            结束位
**                          iCheck              校验方法
**                          iBaud               波特率
**                          pvIsrRoutine        中断服务函数, 为NULL表示不允许中断
** output parameters:       NONE
** Returned value:          正确返回 0,  错误返回 -1
** Created by:              Hanhui
** Created Date:            2007/09/18
**--------------------------------------------------------------------------------------------------------
** Modified by:				LIXINTIAN
** Modified date:			2008.04.03
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
int     uartInit (int   iCom,
                  int   iInFrared,
                  int   iData,
                  int   iStopBit,
                  int   iCheck,
                  int   iBaud,
                  void *pvIsrRoutine)
{
    unsigned int        uiUBRDIVn;                                      /*  波特率发生器值              */
    unsigned int        uiULCONn;                                       /*  线控制器值                  */
    unsigned int        uiUCONn;                                        /*  串口控制寄存器值            */
    unsigned int        uiUFCONn;                                       /*  FIFO 控制寄存器值           */
    
    unsigned int        uiInterEn;                                      /*  是否允许中断                */
    
    if (iData < 5) {                                                    /*  数据位数错误                */
        return  (-1);
    }
    iData -= 5;                                                         /*  确定寄存器中的值            */
    
    uiInterEn = (pvIsrRoutine == (void *)0) ? 0 : 1;                    /*  确定是否需要中断            */
    
    iBaud = (iBaud << 4);                                               /*  baud = baud * 16            */
    iBaud = PCLK / iBaud;
    iBaud = (int)(iBaud - 0.5);
	
    uiUBRDIVn = iBaud;                                                  /*  波特率                      */
    
    uiULCONn  = ((iInFrared << 6)
              |  (iCheck    << 3)
              |  (iStopBit  << 2)
              |  (iData));                                              /*  基本控制信息                */
    
    uiUCONn   = ((0x00 << 10)                                           /*  PCLK                        */
              |  (1 << 9)                                               /*  Tx Interrupt Type LEVEL     */
              |  (1 << 8)                                               /*  Rx Interrupt Type LEVEL     */
              |  (1 << 7)                                               /*  Rx Time Out Enable          */
              |  (0 << 6)                                               /*  Rx Error Status             */
                                                                        /*  Interrupt Disable           */
              |  (0 << 5)                                               /*  Loopback Mode Disable       */
              |  (0 << 4)
              |  (1 << 2)                                               /*  Tx Interrupt or poll        */
              |  (1));                                                  /*  Rx Interrupt or poll        */
    
    uiUFCONn  = ((0x3 << 6)                                             /*  Tx FIFO Trigger Level 12    */
              |  (0x2 << 4)                                             /*  Rx FIFO Trigger Level 12    */
              |  (1 << 2)                                               /*  Tx FIFO Reset               */
              |  (1 << 1)                                               /*  Rx FIFO Reset               */
              |  (1));                                                  /*  FIFO Enable                 */

    if (iCom == COM0) {                                                 /*  设置 UART0 的 管脚          */

        rGPHCON &= ~(__COM0_MASK);
        rGPHCON |=   __COM0_GPHCON;
        rGPHUP  |=   __COM0_GPIO;                                       /*  不使用上拉电阻              */
        
        rCLKCON |=   __COM0_CLKBIT;                                     /*  时钟挂接                    */

        rUCON0   = 0;
        rUFCON0  = uiUFCONn;
        rUMCON0  = 0;                                                   /*  关闭流控                    */
        rULCON0  = uiULCONn;
        rUCON0   = uiUCONn;
        rUBRDIV0 = uiUBRDIVn;
		
        if (uiInterEn) {                                                /*  链接中断服务函数            */
             HandleUART0 = (int)pvIsrRoutine;
   /*  changed by lixintian 2008.4.2    */
   //         vicIrqSet(VIC_CHANNEL_UART0, VIC_CHANNEL_UART0, 
   //                   (unsigned long)pvIsrRoutine);                     /*  允许中断                    */
            INTER_CLR_SUBMSK(BIT_SUB_RXD0);                             /*  打开接收中断                */
        }
    
    } else if (iCom == COM1) {                                          /*  设置 UART1 的 管脚          */
    
        rGPHCON &= ~(__COM1_MASK);
        rGPHCON |=   __COM1_GPHCON;

⌨️ 快捷键说明

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