/**
* @brief 初始化GPIO为指定功能
*
* @param function
* @arg FUNC_GPIO: 使能所有 GPIO
* @arg FUNC_CLKO: 使能 CLKO 函数
* @arg FUNC_I2C: 使能 I2C 函数
* @arg FUNC_SPI: 使能 API 函数
* @arg FUNC_ADC0: 使能 ADC0 函数
* @arg FUNC_ADC1: 使能 ADC1 函数
* @arg FUNC_ADC2: 使能 ADC2 函数
* @arg FUNC_ADC3: 使能 ADC3 函数
* @arg FUNC_ADC4: 使能 ADC4 函数
* @arg FUNC_ADC5: 使能 ADC5 函数
* @arg FUNC_ADC6: 使能 ADC6 函数
* @arg FUNC_ADC7: 使能 ADC7 函数
* @arg FUNC_EXTINT0: 使能外部中断0函数
* @arg FUNC_EXTINT1: 使能外部中断1函数
* @arg FUNC_TMR0: 使能定时器0函数
* @arg FUNC_TMR1: 使能定时器1函数
* @arg FUNC_UART: 使能 UART 函数
* @arg FUNC_UART_FULL: 使能全 UART 函数
* @arg FUNC_PWM0: 使能 PWM0 函数
* @arg FUNC_PWM1: 使能 PWM1 函数
* @arg FUNC_PWM2: 使能 PWM2 函数
* @arg FUNC_PWM3: 使能 PWM3 函数
* @arg FUNC_PWM4: 使能 PWM4 函数
* @arg FUNC_PWM5: 使能 PWM5 函数
* @arg FUNC_ICE: 使能 ICE 函数
* @arg FUNC_ACMP0: 使能 ACMP0 函数
* @arg FUNC_ACMP1: 使能 ACMP1 函数
* @arg FUNC_T0EX: 使能定时器0 TEX 函数
* @arg FUNC_T1EX: 使能定时器1 TEX 函数
*
* @retval E_SUCCESS 成功
*/
int32_t DrvGPIO_InitFunction(uint32_t function)
{
uint32_t shift0, shift1;
uint32_t mask0, mask1;
uint32_t val0, val1;
uint32_t port0, port1;
uint32_t base, value;
if (function == FUNC_GPIO)
{
GCR->P0_MFP = 0;
GCR->P1_MFP = 0;
GCR->P2_MFP = 0;
GCR->P3_MFP = 0;
GCR->P4_MFP = 0;
GCR->P5_MFP = 0;
}
port0 = (function & 0xF000000) >> 24;
port1 = (function & 0xF0000000) >> 28;
if (port0 != 0xF)
{
base = (GCR_BASE + 0x30) + (port0 << 2);
shift0 = (function & 0xF0000) >> 16;
mask0 = (function & 0xF00) >> 8;
val0 = (((function & 0xC) << 6) | (function & 0x3)) << shift0;
if (mask0 & 0x2)
val0 |= (val0 << 1);
if (mask0 & 0x4)
val0 |= (val0 << 2);
if (mask0 & 0x8)
val0 |= (val0 << 3);
mask0 |= (mask0 << 8);
value = inpw(base);
value &= ~(mask0 << shift0);
outpw(base, value|val0);
}
if (port1 != 0xF)
{
base = (GCR_BASE + 0x30) + (port1 << 2);
shift1 = (function & 0xF00000) >> 20;
mask1 = (function & 0xF000) >> 12;
val1 = (((function & 0xC0) << 2) | ((function & 0x30) >> 4)) << shift1;
if (mask1 & 0x2)
val1 |= (val1 << 1);
if (mask1 & 0x4)
val1 |= (val1 << 2);
if (mask1 & 0x8)
val1 |= (val1 << 3);
mask1 |= (mask1 << 8);
value = inpw(base);
value &= ~(mask1 << shift1);
outpw(base, value|val1);
}
return E_SUCCESS;
}
|