pio_drv.c

来自「在ARM7和UC/OSII的平台上实现了GPS自动报站的功能,涉及GPS模块LE」· C语言 代码 · 共 120 行

C
120
字号
/****************************************************************
**                                                              *
**  FILE         :  PIO_DRV.C                                    *
**  COPYRIGHT    :  (c) 2004 .Xiamen Yaxon NetWork CO.LTD       *
**                                                              *
**                                                              *
**              2004/10/27                                      *
****************************************************************/
#define PIO_DRV_GLOBAL
#include "includes.h"
#include "target.h"
#include "hardware.h"
#include "pio_drv.h"
#include "bsp.h"
#include "message.h"
#include "almtask.h"


/****************************************************************
* Input Parameters : <mask>   = bit mask identifying the PIOs
*                  : <config> = mask identifying the PIOs config
****************************************************************/ 
void PIO_Config(INT32U mask, INT32U mode)
{
    INT32U x;
    /* config PIO controller according to mode */
     AT91F_PS_EnablePeriphClock(AT91C_BASE_PS,1 << AT91C_ID_PIO);
    
    if (mode & PIO_MODE_OUTPUT)
        *AT91C_PIO_OER = mask;         /* output */
    else
        *AT91C_PIO_ODR = mask;         /* input */

    if (mode & PIO_MODE_FILTER_ON)
        *AT91C_PIO_IFER = mask;        /* filter enable */
    else 
        *AT91C_PIO_IFDR = mask;        /* filter disable */
    
    if (mode & PIO_MODE_INPUT_IRQ_ON) {
        x = *AT91C_PIO_ISR;            /* clear current ISR */
        *AT91C_PIO_IER = mask;         /* input change interrupt */
    }
    else
        *AT91C_PIO_IDR = mask;         /* input change no effect */
    
    *AT91C_PIO_PER = mask;   // enable pio
}

/****************************************************************
* Cancel PIO Controller handling from pins managed by
*                      a peripheral
****************************************************************/ 
void PIO_Close(INT32U mask)
{
    *AT91C_PIO_PDR = mask;
}

/****************************************************************
*   write data to PIO pin
*              <mask>      : PIO pin mask
*              <level>     : PIO_HIGH or PIO_LOW
****************************************************************/ 
void PIO_Write(INT32U mask, INT32U level)
{
    if (level == PIO_OUTPUT_HIGH)
        *AT91C_PIO_SODR = mask;          /* set PIO */
    else 
        *AT91C_PIO_CODR = mask;          /* clear PIO */     
}

/****************************************************************
* Read the state of the PIO pins
****************************************************************/ 
INT32U PIO_Read(void)
{
    INT32U pio_clk;                     /* PIO clock status */
    INT32U ret;
    /* we must enable PIO clock before read the PIO state */    
    if (*AT91C_PS_PCSR & (1<< AT91C_ID_PIO))
        pio_clk = 1;
    else
        pio_clk = 0;
    *AT91C_PS_PCER = 1 << AT91C_ID_PIO;
    
    ret = *AT91C_PIO_PDSR;
    /* restrore previous PIO clock status */
    if (pio_clk == 0)
        *AT91C_PS_PCDR = 1 << AT91C_ID_PIO;          /* disable PIO clock */
    return (ret);
}

#if USEIRQ2 >1
void PIO_ISR(void)
{
     INT32U status;
     INT32U data;
     
      PrintFromUART(1, "进入中断....\n");
      data = PIO_Read();
      status = PIO_GetIntStatus(0);
      
      if ( status & ( 1<<  PORT_RECINT))
      {
          if(!( data & (1<< PORT_RECINT)))
          {
              OSQPost(AlmTaskMsgQue,  MSG_SENSOR_INTRECINT, 0, 0);
          }
      }
}
void InitPIO_Int(INT32U mask,INT32U mode)
{
     PIO_Config(mask,mode);
     AIC_Install(AT91C_ID_PIO,PIO_PRIO,AIC_LEVEL_LOW,PIO_ISR);
     AIC_Int_Enable(AT91C_ID_PIO);

}

#endif

⌨️ 快捷键说明

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