268 lines
6.3 KiB
C
268 lines
6.3 KiB
C
|
#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;
|
|||
|
}
|
|||
|
}
|
|||
|
|