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

📄 pio_drv.c

📁 在ARM7和UC/OSII的平台上实现了GPS自动报站的功能,涉及GPS模块LEA_4S的驱动,位置速寻算法,语音芯片ISD4004的录放音驱动,LED页面管理等等.从启动代码到操作系统的移植以及到业
💻 C
字号:
/****************************************************************
**                                                              *
**  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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -