📄 drvgpio.c
字号:
/*---------------------------------------------------------------------------------------------------------*/
/* */
/* Copyright(c) 2009 Nuvoton Technology Corp. All rights reserved. */
/* */
/*---------------------------------------------------------------------------------------------------------*/
#include <stdio.h>
#include "NUC1xx.h"
#include "DrvGPIO.h"
/*---------------------------------------------------------------------------------------------------------*/
/* Includes of local headers */
/*---------------------------------------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------------------------------------*/
/* Macro, type and constant definitions */
/*---------------------------------------------------------------------------------------------------------*/
#define PORT_OFFSET 0x40
/*---------------------------------------------------------------------------------------------------------*/
/* Global file scope (static) variables */
/*---------------------------------------------------------------------------------------------------------*/
static void (*_pfGPABCallback)(uint32_t u32GPAStatus, uint32_t u32GPBStatus);
static void (*_pfGPCDECallback)(uint32_t u32GPCStatus, uint32_t u32GPDStatus, uint32_t u32GPEStatus);
static void (*_pfEINT0Callback)(void);
static void (*_pfEINT1Callback)(void);
/*---------------------------------------------------------------------------------------------------------*/
/* GPIO A and GPIO B ISR */
/*---------------------------------------------------------------------------------------------------------*/
void GPAB_IRQHandler(void)
{
volatile uint32_t u32GPAStatus, u32GPBStatus;
/* Keep the interrupt source */
u32GPAStatus = GPIOA->ISRC;
u32GPBStatus = GPIOB->ISRC;
/* Avoid to clear EINT0/EINT1 INT flag */
u32GPBStatus = u32GPBStatus & ~(0x3 << 14);
/* Clear the interrupt */
GPIOA->ISRC = u32GPAStatus;
GPIOB->ISRC = u32GPBStatus;
/* Call the callback function of GPIOAB interrupt */
if ( _pfGPABCallback )
_pfGPABCallback(u32GPAStatus, u32GPBStatus);
}
/*---------------------------------------------------------------------------------------------------------*/
/* GPIO C,D,E ISR */
/*---------------------------------------------------------------------------------------------------------*/
void GPCDE_IRQHandler(void)
{
volatile uint32_t u32GPCStatus, u32GPDStatus, u32GPEStatus;
/* Keep the interrupt source */
u32GPCStatus = GPIOC->ISRC;
u32GPDStatus = GPIOD->ISRC;
u32GPEStatus = GPIOE->ISRC;
/* Clear the interrupt */
GPIOC->ISRC = u32GPCStatus;
GPIOD->ISRC = u32GPDStatus;
GPIOE->ISRC = u32GPEStatus;
/* Call the callback function of GPIOAB interrupt */
if ( _pfGPCDECallback )
_pfGPCDECallback(u32GPCStatus, u32GPDStatus, u32GPEStatus);
}
/*---------------------------------------------------------------------------------------------------------*/
/* External INT0 ISR */
/*---------------------------------------------------------------------------------------------------------*/
void EINT0_IRQHandler(void)
{
/* EINT0 = GPB14. Clear the interrupt */
GPIOB->ISRC = 1UL << 14;
if ( _pfEINT0Callback )
_pfEINT0Callback();
}
/*---------------------------------------------------------------------------------------------------------*/
/* External INT1 ISR */
/*---------------------------------------------------------------------------------------------------------*/
void EINT1_IRQHandler(void)
{
/* EINT0 = GPB15. Clear the interrupt */
GPIOB->ISRC = 1UL << 15;
if ( _pfEINT1Callback )
_pfEINT1Callback();
}
/*---------------------------------------------------------------------------------------------------------*/
/* Function: DrvGPIO_Open */
/* */
/* Parameter: */
/* port - [in] */
/* E_DRVGPIO_PORT, specify GPIO port. It could be E_GPA, E_GPB, E_GPC, E_GPD and E_GPE. */
/* i32Bit - [in] */
/* Specify pin of the GPIO port. It could be 0~15. */
/* mode - [in] */
/* E_DRVGPIO_IO, set the specified GPIO pin to be E_IO_INPUT, E_IO_OUTPUT, */
/* E_IO_OPENDRAIN or E_IO_QUASI mode. */
/* Returns: */
/* E_SUCCESS Operation successful */
/* E_DRVGPIO_ARGUMENT Incorrect argument */
/* Description: */
/* Set the specified GPIO pin to the specified GPIO operation mode. */
/*---------------------------------------------------------------------------------------------------------*/
int32_t DrvGPIO_Open(E_DRVGPIO_PORT port, int32_t i32Bit, E_DRVGPIO_IO mode)
{
volatile uint32_t u32Reg;
if ((i32Bit < 0) || (i32Bit > 16))
{
return E_DRVGPIO_ARGUMENT;
}
u32Reg = (uint32_t)&GPIOA->PMD + (port*PORT_OFFSET);
if ((mode == E_IO_INPUT) || (mode == E_IO_OUTPUT) || (mode == E_IO_OPENDRAIN))
{
outpw(u32Reg, inpw(u32Reg) & ~(0x3<<(i32Bit*2)));
if (mode == E_IO_OUTPUT)
{
outpw(u32Reg, inpw(u32Reg) | (0x1<<(i32Bit*2)));
}else
if (mode == E_IO_OPENDRAIN)
{
outpw(u32Reg, inpw(u32Reg) | (0x2<<(i32Bit*2)));
}
}else
if (mode == E_IO_QUASI)
{
outpw(u32Reg, inpw(u32Reg) | (0x3<<(i32Bit*2)));
}else
{
return E_DRVGPIO_ARGUMENT;
}
return E_SUCCESS;
}
/*---------------------------------------------------------------------------------------------------------*/
/* Function: DrvGPIO_Close */
/* */
/* Parameter: */
/* port - [in] */
/* E_DRVGPIO_PORT, specify GPIO port. It could be E_GPA, E_GPB, E_GPC, E_GPD and E_GPE. */
/* i32Bit - [in] */
/* Specify pin of the GPIO port. It could be 0~15. */
/* Returns: */
/* E_SUCCESS Operation successful */
/* E_DRVGPIO_ARGUMENT Incorrect argument */
/* Description: */
/* Close the specified GPIO pin function and set the pin to quasi-bidirectional mode. */
/*---------------------------------------------------------------------------------------------------------*/
int32_t DrvGPIO_Close(E_DRVGPIO_PORT port, int32_t i32Bit)
{
volatile uint32_t u32Reg;
if ((i32Bit < 0) || (i32Bit > 16))
{
return E_DRVGPIO_ARGUMENT;
}
u32Reg = (uint32_t)&GPIOA->PMD + (port*PORT_OFFSET);
outpw(u32Reg, inpw(u32Reg) | (0x3<<(i32Bit*2)));
GPIO_DBNCECON->DBNCECON.ICLK_ON = 0;
return E_SUCCESS;
}
/*---------------------------------------------------------------------------------------------------------*/
/* Function: DrvGPIO_SetBit */
/* */
/* Parameter: */
/* port - [in] */
/* E_DRVGPIO_PORT, specify GPIO port. It could be E_GPA, E_GPB, E_GPC, E_GPD and E_GPE. */
/* i32Bit - [in] */
/* Specify pin of the GPIO port. It could be 0~15. */
/* Returns: */
/* E_SUCCESS Operation successful */
/* E_DRVGPIO_ARGUMENT Incorrect argument */
/* Description: */
/* Set the specified GPIO pin to 1. */
/*---------------------------------------------------------------------------------------------------------*/
int32_t DrvGPIO_SetBit(E_DRVGPIO_PORT port, int32_t i32Bit)
{
GPIO_T * tGPIO;
if ((i32Bit < 0) || (i32Bit > 16))
{
return E_DRVGPIO_ARGUMENT;
}
tGPIO = (GPIO_T *)((uint32_t)GPIOA + (port*PORT_OFFSET));
tGPIO->DOUT |= (1 << i32Bit);
return E_SUCCESS;
}
/*---------------------------------------------------------------------------------------------------------*/
/* Function: DrvGPIO_GetBit */
/* */
/* Parameter: */
/* port - [in] */
/* E_DRVGPIO_PORT, specify GPIO port. It could be E_GPA, E_GPB, E_GPC, E_GPD and E_GPE. */
/* i32Bit - [in] */
/* Specify pin of the GPIO port. It could be 0~15. */
/* Returns: */
/* The specified input pin value 0 / 1 */
/* E_DRVGPIO_ARGUMENT Incorrect argument */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -