📄 gpio.c
字号:
****************************************************************/
void GPIO_SetDataOut_High(Gpio_Num_t gpio_num)
{
switch(gpio_num/32)
{
case 0: /* GPIO group 1 */
GPIO_SetOutPin(GPIO_MODULE1, gpio_num%32);
break;
case 1: /* GPIO group 2 */
GPIO_SetOutPin(GPIO_MODULE2, gpio_num%32);
break;
default:
;
}
return;
}
/****************************************************************
Function Name:Get_GPIODataIn
Description: Get gpio's input data
Usage: gpio_num: 0 to 63
Return value: Gpio input pin's data
****************************************************************/
signed char GPIO_GetDataIn(Gpio_Num_t gpio_num)
{
switch(gpio_num/32)
{
case 0: /* GPIO group 1 */
return GPIO_GetInputPin(GPIO_MODULE1, gpio_num%32);
case 1: /* GPIO group 2 */
return GPIO_GetInputPin(GPIO_MODULE1, gpio_num%32);
default:
return -1;
}
}
/****************************************************************
Function Name:Set_GPIOEdgeCtrl
Description: Set GPIO Edge Control
Usage: gpio_num: 0 to 63
edge_control: Select edge detection type
0 - low level detection
1 - high level detection
2 - Rising edge detection
3 - Falling edge detection
Return value: void
****************************************************************/
void GPIO_SetEdgeCtrl(Gpio_Num_t gpio_num, GPIO_Edge_Level_Ctrl_t edge_level_ctrl)
{
switch(gpio_num/32)
{
case 0: /* GPIO group 1 */
{
switch(edge_level_ctrl)
{
case LOW_LEVEL_DETECT:
{
GPIO_SetLevelDetect0Bit(GPIO_MODULE1, gpio_num%32);
break;
}
case HIGH_LEVEL_DETECT:
{
GPIO_SetLevelDetect1Bit(GPIO_MODULE1, gpio_num%32);
break;
}
case RISING_EDGE_DETECT:
{
GPIO_SetRisingDetectBit(GPIO_MODULE1, gpio_num%32);
break;
}
case FALLING_EDGE_DETECT:
{
GPIO_SetFallingDetectBit(GPIO_MODULE1, gpio_num%32);
break;
}
default:
;
}
}
case 1: /* GPIO group 2 */
switch(edge_level_ctrl)
{
case LOW_LEVEL_DETECT:
{
GPIO_SetLevelDetect0Bit(GPIO_MODULE2, gpio_num%32);
break;
}
case HIGH_LEVEL_DETECT:
{
GPIO_SetLevelDetect1Bit(GPIO_MODULE2, gpio_num%32);
break;
}
case RISING_EDGE_DETECT:
{
GPIO_SetRisingDetectBit(GPIO_MODULE2, gpio_num%32);
break;
}
case FALLING_EDGE_DETECT:
{
GPIO_SetFallingDetectBit(GPIO_MODULE2, gpio_num%32);
break;
}
default:
;
}
default:
;
}
}
/****************************************************************
Function Name:GPIO_ClearEdgeCtrl
Description: Clear GPIO Edge Control
Usage: gpio_num: 0 to 63
edge_control: Select edge detection type
0 - low level detection
1 - high level detection
2 - Rising edge detection
3 - Falling edge detection
Return value: void
****************************************************************/
void GPIO_ClearEdgeCtrl(Gpio_Num_t gpio_num, GPIO_Edge_Level_Ctrl_t edge_level_ctrl)
{
switch(gpio_num/32)
{
case 0: /* GPIO group 1 */
{
switch(edge_level_ctrl)
{
case LOW_LEVEL_DETECT:
{
GPIO_ClearLevelDetect0Bit(GPIO_MODULE1, gpio_num%32);
break;
}
case HIGH_LEVEL_DETECT:
{
GPIO_ClearLevelDetect1Bit(GPIO_MODULE1, gpio_num%32);
break;
}
case RISING_EDGE_DETECT:
{
GPIO_ClearRisingDetectBit(GPIO_MODULE1, gpio_num%32);
break;
}
case FALLING_EDGE_DETECT:
{
GPIO_ClearFallingDetectBit(GPIO_MODULE1, gpio_num%32);
break;
}
default:
;
}
}
case 1: /* GPIO group 2 */
switch(edge_level_ctrl)
{
case LOW_LEVEL_DETECT:
{
GPIO_ClearLevelDetect0Bit(GPIO_MODULE2, gpio_num%32);
break;
}
case HIGH_LEVEL_DETECT:
{
GPIO_ClearLevelDetect1Bit(GPIO_MODULE2, gpio_num%32);
break;
}
case RISING_EDGE_DETECT:
{
GPIO_ClearRisingDetectBit(GPIO_MODULE2, gpio_num%32);
break;
}
case FALLING_EDGE_DETECT:
{
GPIO_ClearFallingDetectBit(GPIO_MODULE2, gpio_num%32);
break;
}
default:
;
}
default:
;
}
}
//-------------------------------------------------------------------------
// NAME : GPIO_SetOnePinInterruptMask
// DESCRIPTION : Mask or unmask the interrupt generation of one pin
// PARAMETERS : gpio_num is the specific pin and mask is either it_enable or it_disable
// RETURN VALUE: None
// LIMITATIONS : None
//-------------------------------------------------------------------------
void GPIO_SetOnePinInterruptMask(Gpio_Num_t gpio_num, GPIO_IT_Mask_t mask)
{
switch (gpio_num/32)
{
case 0:
{
switch(mask)
{
case IT_ENABLE:
{
GPIO_SetIrqEnable1Bit(GPIO_MODULE1, gpio_num%32);
break;
}
case IT_DISABLE:
{
GPIO_ClearIrqEnable1Bit(GPIO_MODULE1, gpio_num%32);
break;
}
default:
;
}
break;
}
case 1:
{
switch(mask)
{
case IT_ENABLE:
{
GPIO_SetIrqEnable1Bit(GPIO_MODULE2, gpio_num%32);
break;
}
case IT_DISABLE:
{
GPIO_ClearIrqEnable1Bit(GPIO_MODULE2, gpio_num%32);
break;
}
default:
;
}
break;
}
default:
;
}
}
//-------------------------------------------------------------------------
// NAME : GPIOGetInterruptStatus
// DESCRIPTION : Read the interrupt status register
// PARAMETERS : None
// RETURN VALUE: Interrupt status register value
// LIMITATIONS : None
//-------------------------------------------------------------------------
UWORD16 GPIO_GetInterruptStatus(Gpio_Num_t gpio_num)
{
switch (gpio_num/32)
{
case 0:
return GPIO_GetIrqStatusPin(GPIO_MODULE1, gpio_num%32);
case 1:
return GPIO_GetIrqStatusPin(GPIO_MODULE2, gpio_num%32);
default:
return 0;
}
}
/*************************************************************************************
******* func : read the gpio interrupt line number
******* return value : 0~63 gpio number
******* return value : =65 indicate no gpio irq
**************************************************************************************/
UWORD16 GPIO_ReadIRQNum(int module_num)
{
unsigned int temp;
unsigned int num;
unsigned int gpio_irq_num;
int shift_num;
int shift_data=0x1;
switch(module_num)
{
case 1:
temp = GPIO_GetIrqStatus1(GPIO_MODULE1);
break;
case 2:
temp = GPIO_GetIrqStatus1(GPIO_MODULE2);
break;
default:
return 0;
}
// temp=gpio_irqstatus1_reg(module_num);
for(shift_num=0;shift_num<31;shift_num++)
{
num= (shift_data&temp);
shift_data = (shift_data<<1);
if(num>0)
{
gpio_irq_num=shift_num;
if(module_num==1) return(gpio_irq_num);
else return(gpio_irq_num+32);
}
//else return 65 ;
}
if(num==0)return 65;
}
//-------------------------------------------------------------------------
// NAME : GPIO_AcknoledgeInterrupt
// DESCRIPTION : Acknoledge one interrupt, query mode
// PARAMETERS : pin_index is the specific pin
// RETURN VALUE: None
// LIMITATIONS : None
//-------------------------------------------------------------------------
void GPIO_AcknoledgeInterrupt(Gpio_Num_t gpio_num)
{
switch (gpio_num/32)
{
case 0:
GPIO_SetIrqStatus1Bit(GPIO_MODULE1, gpio_num%32);
break;
case 1:
GPIO_SetIrqStatus1Bit(GPIO_MODULE2, gpio_num%32);
break;
}
}
//-------------------------------------------------------------------------
// NAME : GPIO_ConfigureInterruptEnable
// DESCRIPTION : Acknoledge one interrupt, query mode
// PARAMETERS : pin_index is the specific pin
// RETURN VALUE: None
// LIMITATIONS : None
//-------------------------------------------------------------------------
void GPIO_ConfigureInterruptEnable(Gpio_Num_t gpio_num, GPIO_Edge_Level_Ctrl_t edge_level_ctrl, isrpointer isrHandlerName)
{
int temp;
int int_dex;
if(gpio_num <32)
{
int_dex = IRQ1_GPIO1_INT;
IsrRegister(int_dex, GPIO1_IRQ);
}
else if(gpio_num >=32)
{
int_dex = IRQ1_GPIO2_INT;
IsrRegister(int_dex, GPIO2_IRQ);
}
GPIOIsrRegister(gpio_num, isrHandlerName);
GPIO_SetDirection(gpio_num, GPIO_INPUT);
GPIO_SetEdgeCtrl(gpio_num, edge_level_ctrl);
GPIO_SetOnePinInterruptMask(gpio_num, IT_ENABLE);
GPIO_AcknoledgeInterrupt(gpio_num);
//clear interrupt status register.
EnableNewInterrupt(INTH_IRQ_MODE);
ConfInterrupt(int_dex, 0, //0:IRQ, 1:FIQ.
1, //// 0:fall edge, 1:low level.
0);
}
unsigned int GPIOIsrRegister( unsigned int inthIndex , isrpointer isrHandlerName )
{
if ( (inthIndex < 0) ||( inthIndex > 64) ){
return INTH_REQ_FAILED ; // errocde is the parameter is error.
}
else{
gpioirq[inthIndex] = isrHandlerName; // fill the arry with the handler function
// function's pointer.
}
return INTH_REQ_OK;
}
void GPIO1_IRQ (void)
{
int inthIndex;
isrpointer isrProcess;
inthIndex = GPIO_ReadIRQNum(GPIO_MODULE_1);
// inthIndex = gpio_readirq(GPIO_MODULE_1);
if( (inthIndex >= 32 )||(inthIndex<0) ){
while( 1 );
}
else {
isrProcess = gpioirq[inthIndex];
(*isrProcess)();
}
GPIO_AcknoledgeInterrupt(inthIndex);
//*(unsigned int *)0xfffecb18 = 0x00000001;
}
void GPIO2_IRQ (void)
{
int inthIndex;
isrpointer isrProcess;
inthIndex = GPIO_ReadIRQNum(GPIO_MODULE_2);
if( (inthIndex > 64 )||(inthIndex<32) ){
while( 1 );
}
else {
isrProcess = gpioirq[inthIndex];
(*isrProcess)();
}
GPIO_AcknoledgeInterrupt(inthIndex);
//*(unsigned int *)0xfffecb18 = 0x00000001;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -