PASII/CandeII_1.4/Driver/gpio.c

268 lines
6.3 KiB
C
Raw Normal View History

#include "gpio.h"
//<2F>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>
PIN_CONFIG_TYPE * PIN_CONFIG = ((PIN_CONFIG_TYPE *) PIN_CONFIG_BASE); //<2F>ܽſ<DCBD><C5BF>ƼĴ<C6BC><C4B4><EFBFBD>
GPIO_CTRL_TYPE * GPIO_CTRL = ((GPIO_CTRL_TYPE *) GPIO_CTRL_BASE); //GPIO<49><4F><EFBFBD>ƼĴ<C6BC><C4B4><EFBFBD>
GPO_CTRL_TYPE * GPO_CTRL = ((GPO_CTRL_TYPE *) GPO_CTRL_BASE); //GPIO<49><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƼĴ<C6BC><C4B4><EFBFBD>
GPI_CTRL_TYPE * GPI_CTRL = ((GPI_CTRL_TYPE *) GPI_CTRL_BASE); //GPIO<49><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƼĴ<C6BC><C4B4><EFBFBD>
GPIO_IRQ_CTRL_TYPE * GPIO_IRQ_CTRL = ((GPIO_IRQ_CTRL_TYPE *) GPIO_IRQ_CTRL_BASE);
static void (*gpio_callback)(void);
static uint8_t pinmuxtab48[24] = {
0,1,2,3,4,5,6,7,8,9,10,17,18,19,20,21,22,23,24,25,26,27,30,31,
};
static uint8_t pinmuxtab32[24] = {
0,1,2,3,4,5,6,9,10,7,8,17,21,18,22,23,24,19,25,20,26,27,30,31,
};
void PIN_Set_GPIO(uint32_t io,uint8_t fun)
{
uint32_t i;
for(i=0; i<32; i++)
{
if(io & (0x01<<i))
{
PIN_CONFIG->PINSEL[i] = fun;
io &= ~(0x01<<i);
if(io == 0)
break;
}
}
}
void PIN_Pullup_Enable(enum _QFN_TYPE_ type, uint32_t io)
{
uint32_t i;
uint32_t *addr32 = (uint32_t *)0x50001080;
uint8_t *addr8 = (uint8_t *)0x50001084;
uint8_t *p = 0;
if(type == T_QFN_48)
{
p = pinmuxtab48;
}
else if(type == T_QFN_32)
{
p = pinmuxtab32;
}
if(p!=0)
{
uint32_t tmp;
for(i=0; i<24; i++)
{
tmp = 0x01<<i;
if(io & tmp)
{
*addr32 |= (0x01 << p[i]);
io &= ~tmp;
if(io == 0)
break;
}
}
for(i=24; i<32; i++)
{
tmp = 0x01<<i;
if(io & tmp)
{
*addr8 |= (0x01<<(i-24));
io &= ~tmp;
if(io == 0)
break;
}
}
}
}
void PIN_Pullup_Disable(enum _QFN_TYPE_ type, uint32_t io)
{
uint32_t i;
uint32_t *addr32 = (uint32_t *)0x50001080;
uint8_t *addr8 = (uint8_t *)0x50001084;
uint8_t *p = 0;
if(type == T_QFN_48)
{
p = pinmuxtab48;
}
else if(type == T_QFN_32)
{
p = pinmuxtab32;
}
if(p!=0)
{
uint32_t tmp;
for(i=0; i<24; i++)
{
tmp = 0x01<<i;
if(io & tmp)
{
*addr32 &= ~(0x01 << p[i]);
io &= ~tmp;
if(io == 0)
break;
}
}
for(i=24; i<32; i++)
{
tmp = 0x01<<i;
if(io & tmp)
{
*addr8 &= ~(0x01<<(i-24));
io &= ~tmp;
if(io == 0)
break;
}
}
}
}
/*********************************************************************************
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>: GPIO<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD>PIN<EFBFBD><EFBFBD>ΪGPIO)
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
uint32_t io Ҫ<EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>gpio<EFBFBD>ܽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>λ
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>GPIO_Set_Output(BIT0|BIT1|BIT2|BIT3); <EFBFBD><EFBFBD><EFBFBD><EFBFBD>gpio0~gpio3Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*********************************************************************************/
void GPIO_Set_Output(uint32_t io)
{
GPIO_CTRL->GPIODIR &= ~io;
}
/***************************************************************************************
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>: GPIO<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD>PIN<EFBFBD><EFBFBD>ΪGPIO)
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
uint32_t io: Ҫ<EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>GPIO<EFBFBD>ܽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>λ
uint32_t invert_bits: <EFBFBD><EFBFBD>bit<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>ȡ<EFBFBD><EFBFBD>: 0-<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>,1-ȡ<EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GPIO_Set_Input(BIT0|BIT1|BIT2|BIT3, BIT0|BIT1); //gpio0~3<><33><EFBFBD><EFBFBD>,gpio0<6F><30>gpio1ȡ<31><C8A1>
***************************************************************************************/
void GPIO_Set_Input(uint32_t io, uint32_t invert_bits)
{
GPIO_CTRL->GPIODIR |= io;
GPI_CTRL->GPI_InE |= io;
GPI_CTRL->GPI_POL &= (~io);
GPI_CTRL->GPI_POL |= invert_bits;
}
void GPIO_Set_Input_DIR(uint32_t io)
{
GPIO_CTRL->GPIODIR |= io;
}
void GPIO_Input_Enable(uint32_t io)
{
GPI_CTRL->GPI_InE |= io;
}
void GPIO_Input_Disable(uint32_t io)
{
GPI_CTRL->GPI_InE &= ~io;
}
/*********************************************************************************
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <EFBFBD>ܽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>ߵ<EFBFBD>ƽ
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>: uint32_t io Ҫ<EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>gpio<EFBFBD>ܽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>λ
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GPIO_Set_Input(BIT0 | BIT1 | BIT2 | BIT3); <EFBFBD><EFBFBD><EFBFBD><EFBFBD>gpio0~gpio4<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD>ƽ
*********************************************************************************/
void GPIO_Pin_Set(uint32_t io)
{
GPO_CTRL->GPO |= io;
}
/*********************************************************************************
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <EFBFBD>ܽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>͵<EFBFBD>ƽ
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>: uint32_t io Ҫ<EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>gpio<EFBFBD>ܽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>λ
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GPIO_Set_Input(BIT0 | BIT1 | BIT2 | BIT3); <EFBFBD><EFBFBD><EFBFBD><EFBFBD>gpio0~gpio4<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>ƽ
*********************************************************************************/
void GPIO_Pin_Clear(uint32_t io)
{
GPO_CTRL->GPO &= ~io;
}
/*********************************************************************************
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <EFBFBD><EFBFBD><EFBFBD>ùܽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>: uint32_t io Ҫ<EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>gpio<EFBFBD>ܽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>λ
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GPIO_Pin_Turn(BIT0 | BIT1 | BIT2 | BIT3); <EFBFBD><EFBFBD><EFBFBD><EFBFBD>gpio0~gpio4<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>
*/
void GPIO_Pin_Turn(uint32_t io)
{
GPO_CTRL->GPO ^= io;
}
/*********************************************************************************
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>GPIO<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>ֵ
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>: Ҫ<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>GPIO<EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD>صĹܽ<EFBFBD>״̬
*********************************************************************************/
uint32_t GPIO_Pin_Read(uint32_t io)
{
return GPI_CTRL->GPI & io;
}
/*********************************************************************************
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>: GPIO<EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ʹ<EFBFBD>ܺ<EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint32_t io<EFBFBD><EFBFBD>Ҫʹ<EFBFBD>ܵ<EFBFBD>IO<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>λ
void * p_callback<EFBFBD><EFBFBD>GPIO<EFBFBD><EFBFBD><EFBFBD>жϵĻص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*********************************************************************************/
void io_irq_enable(uint32_t io, void * p_callback)
{
// clear interrupt
GPIO_IRQ_CTRL->GPIO_INT_CLR = GPIO_IRQ_CTRL->GPIO_INT & io;
// unmask gpio interrupt
GPIO_IRQ_CTRL->GPIO_INT_MSK &= ~io;
GPIO_IRQ_CTRL->GPIO_TOP_INT_MSK = 0;
gpio_callback = ((void (*)(void))p_callback);
// enable IRQ
NVIC_EnableIRQ(GPIO_IRQn);
}
/*********************************************************************************
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>: GPIO<EFBFBD><EFBFBD><EFBFBD>жϽ<EFBFBD>ֹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint32_t io<EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD>ֹ<EFBFBD>жϵ<EFBFBD>IO<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>λ
*********************************************************************************/
void io_irq_disable(uint32_t io)
{
GPIO_IRQ_CTRL->GPIO_INT_MSK |= io;
}
/*********************************************************************************
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>ֹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>GPIO<EFBFBD>ж<EFBFBD>
*********************************************************************************/
void io_irq_disable_all(void)
{
NVIC_DisableIRQ(GPIO_IRQn);
GPIO_IRQ_CTRL->GPIO_INT_MSK = 0xffffffff;
GPIO_IRQ_CTRL->GPIO_TOP_INT_MSK = 1;
}
/********************************************************************************
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>: GPIO<EFBFBD><EFBFBD><EFBFBD>жϷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ûص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*********************************************************************************/
void GPIO_IRQHandler(void)
{
// check interrupt
if((GPIO_IRQ_CTRL->GPIO_INT & (~GPIO_IRQ_CTRL->GPIO_INT_MSK)))
{
if(gpio_callback != 0)
(*gpio_callback)();
// clear interrupt
GPIO_IRQ_CTRL->GPIO_INT_CLR = GPIO_IRQ_CTRL->GPIO_INT;
}
}