📄 pio_drv.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 + -