一、问题的引入
// Configure PIN_13 for GPIOOinput
//
MAP_PinTypeGPIO(PIN_04, PIN_MODE_0, false);
MAP_GPIODirModeSet(GPIOA1_BASE, 0x20, GPIO_DIR_MODE_IN);
//
先看输入配置方法和输入差不多,只是MAP_GPIODirModeSet(GPIOA1_BASE, 0x20, GPIO_DIR_MODE_IN);不一样。
GPIOA1_BASE:GPIOA1组的GPIO
参数0x20,为位权。25-1=0x20.
GPIO_DIR_MODE_OUT:输入模式
输入值的读取函数:MAP_GPIOPinRead(GPIOA1_BASE,0x20);
GPIOA1_BASE:GPIOA1组的GPIO
参数0x20,为位权。25-1=0x20.
二、中断
1、设置引脚为GPIO。
2、使能时钟。
3、设置引脚电流的强度,上拉或者下拉等等。
4、设置GPIO为输入模式。
5、设置成边沿触发。
6、编写中断处理函数:1、判断哪个GPIO触发,2、清除中断标志。
7、使能中断触发。
CC3200有4组GPIO,每组的GPIO共用一个中断处理函数,既然有多个GPIO共用一个中断处理函数,当然要在中断函数查询哪个GPIO触发中断的(可以查询中断状态寄存器)。
现在作重介绍中断配置需要的库函数:
GPIOIntTypeSet(GPIOA1_BASE,GPIO_PIN_5,GPIO_RISING_EDGE);
配置GPIO A1组的pin 5设置成上升边沿触发中断,类似的还有下拉。
GPIOIntRegister(GPIOA1_BASE,GPIO13_handle);
配置GPIOA1组的中断处理函数GPIO13_handle.
GPIOIntEnable(GPIOA1_BASE,GPIO_INT_PIN_5);
使能GPIOA1的pin5触发中断。
中断函数需要调用的函数。
GPIOIntStatus(GPIOA1_BASE,true);
查询GPIOA1的中断状态寄存器:注意查询的是组内的GPIO的中断状态。获得的值跟GPIO_INT_PIN_5相与,就可以获取是不是pin5触发中断的。
GPIOIntClear(GPIOA1_BASE,GPIO_INT_PIN_5);
清除GPIOA1的pin5的中断标志。
例程如下:
Void PinMuxConfig(void)
{
//
// Enable Peripheral Clocks
//
//使能GPIOA1、GPIOA2时钟
MAP_PRCMPeripheralClkEnable(PRCM_GPIOA1, PRCM_RUN_MODE_CLK);
MAP_PRCMPeripheralClkEnable(PRCM_GPIOA2, PRCM_RUN_MODE_CLK);
//
// Configure PIN_64 for GPIOOutput
//
MAP_PinTypeGPIO(PIN_64, PIN_MODE_0, false);
MAP_GPIODirModeSet(GPIOA1_BASE, 0x2, GPIO_DIR_MODE_OUT);
//
// Configure PIN_01 for GPIOOutput
//
MAP_PinTypeGPIO(PIN_01, PIN_MODE_0, false);
MAP_GPIODirModeSet(GPIOA1_BASE, 0x4, GPIO_DIR_MODE_OUT);
//
// Configure PIN_02 for GPIOOutput
//
MAP_PinTypeGPIO(PIN_02, PIN_MODE_0, false);
MAP_GPIODirModeSet(GPIOA1_BASE, 0x8, GPIO_DIR_MODE_OUT);
//
// Configure PIN_13 for GPIOOinput
//
// MAP_PinTypeGPIO(PIN_04, PIN_MODE_0, false);
// MAP_GPIODirModeSet(GPIOA1_BASE, 0x20, GPIO_DIR_MODE_IN);
//设置引脚4为GPIO模式,标准模式,2ma
PinModeSet(PIN_04,PIN_MODE_0);
PinConfigSet(PIN_04,PIN_STRENGTH_2MA,PIN_TYPE_STD);
//设置成输入,引脚4对应于GPIOA1的pin5.
GPIODirModeSet(GPIOA1_BASE, GPIO_PIN_5, GPIO_DIR_MODE_IN);
//设置成上升沿触发中断
GPIOIntTypeSet(GPIOA1_BASE,GPIO_PIN_5,GPIO_RISING_EDGE);
//设置中断处理函数
GPIOIntRegister(GPIOA1_BASE,GPIO13_handle);
//中断使能
GPIOIntEnable(GPIOA1_BASE,GPIO_INT_PIN_5);
//
// Configure PIN_22 for GPIOOinput
//
// MAP_PinTypeGPIO(PIN_15, PIN_MODE_0, false);
// MAP_GPIODirModeSet(GPIOA2_BASE, 0x40, GPIO_DIR_MODE_IN);
PinModeSet(PIN_15,PIN_MODE_0);
PinConfigSet(PIN_15,PIN_STRENGTH_2MA,PIN_TYPE_STD);
GPIODirModeSet(GPIOA2_BASE, GPIO_PIN_6, GPIO_DIR_MODE_IN);
GPIOIntTypeSet(GPIOA2_BASE,GPIO_PIN_6,GPIO_RISING_EDGE);
GPIOIntRegister(GPIOA2_BASE,GPIO13_handle);
GPIOIntEnable(GPIOA2_BASE,GPIO_INT_PIN_6);
}
//中断处理函数,所有的中断处理都可以在此处进行。
void GPIO13_handle(void)
{
// int i;
#if 1
//i = MAP_GPIOIntStatus(GPIOA1_BASE,true);
if(MAP_GPIOIntStatus(GPIOA1_BASE,true)&GPIO_INT_PIN_5)
{
MAP_GPIOIntClear(GPIOA1_BASE,GPIO_INT_PIN_5);
if(ulCount > 1000000)
ulCount -= 1000000;
}
if(MAP_GPIOIntStatus(GPIOA2_BASE,true)&GPIO_INT_PIN_6)
{
MAP_GPIOIntClear(GPIOA2_BASE,GPIO_INT_PIN_6);
if(ulCount < 8000000)
ulCount += 1000000;
}
#endif
}
void LEDBlinkyRoutine()
{
//
// Toggle the lines initially to turn off the LEDs.
// The values driven are as required by the LEDs on the LP.
//
GPIO_IF_LedOff(MCU_ALL_LED_IND);
while(1)
{
//
// Alternately toggle hi-low each of the GPIOs
// to switch the corresponding LED on/off.
//
MAP_UtilsDelay(ulCount);
GPIO_IF_LedOn(MCU_RED_LED_GPIO);
MAP_UtilsDelay(ulCount);
GPIO_IF_LedOff(MCU_RED_LED_GPIO);
MAP_UtilsDelay(ulCount);
GPIO_IF_LedOn(MCU_ORANGE_LED_GPIO);
MAP_UtilsDelay(ulCount);
GPIO_IF_LedOff(MCU_ORANGE_LED_GPIO);
MAP_UtilsDelay(ulCount);
GPIO_IF_LedOn(MCU_GREEN_LED_GPIO);
MAP_UtilsDelay(ulCount);
GPIO_IF_LedOff(MCU_GREEN_LED_GPIO);
}
}