使用CSL库的API函数配置DSP显然比逐一配置寄存器方面且容易理解。下面介绍一下如何使用CSL库把DSP的GPIO4配置成中断模式。
第一步:使能GPIO模块
使能之前,首先要解除锁,即向PERLOCK寄存器写入0x0F0A0B00,然后把PERCFG0寄存器中GPIO对应位置1。代码如下:
Bool gpioEn;
CSL_FINST(((CSL_DevRegs*)CSL_DEV_REGS)->PERLOCK,DEV_PERLOCK_LOCKVAL, UNLOCK);
CSL_FINST(((CSL_DevRegs*)CSL_DEV_REGS)->PERCFG0, DEV_PERCFG0_GPIOCTL, ENABLE);
do {
gpioEn = (Bool)CSL_FEXT(((CSL_DevRegs*)CSL_DEV_REGS)->PERSTAT0,
DEV_PERSTAT0_GPIOSTAT);
} while (gpioEn != TRUE);
第二步:初始化GPIO模块
CSL_Status status;
CSL_GpioContext pContext;
status = CSL_gpioInit(&pContext);
第三步:打开GPIO模块
第四步:使能GPIO管脚作为中断源的功能
第五步:配置GPIO-PIN4的属性:方向,中断触发方式
完整的配置代码如下所示:
/*-----------------------------------------------------------------------------------
*
* 初始化GPIO
*
-----------------------------------------------------------------------------------*/
void Init_GPIO()
{
Bool gpioEn;
CSL_Status status;
CSL_GpioContext pContext;
CSL_GpioHandle hGpio;
CSL_GpioObj gpioObj;
CSL_GpioHwSetup hwSetup;
CSL_GpioPinConfig config;
// CSL_GpioPinNum pinNum;
/* Unlock the control register */
CSL_FINST(((CSL_DevRegs*)CSL_DEV_REGS)->PERLOCK, DEV_PERLOCK_LOCKVAL,
UNLOCK);
/* Enable the GPIO */
CSL_FINST(((CSL_DevRegs*)CSL_DEV_REGS)->PERCFG0, DEV_PERCFG0_GPIOCTL,
ENABLE);
do {
gpioEn = (Bool) CSL_FEXT(((CSL_DevRegs*)CSL_DEV_REGS)->PERSTAT0,
DEV_PERSTAT0_GPIOSTAT);
} while (gpioEn != TRUE);
/* Initialize the GPIO CSL module */
status = CSL_gpioInit(&pContext);
#ifdef SHOW_PRINTF
if (status != CSL_SOK) {
printf("GPIO: Initialization error.\n");
return;
}
else {
printf("GPIO: Module Initialized.\n");
}
#endif
/* Open the CSL module */
hGpio = CSL_gpioOpen(&gpioObj, CSL_GPIO, NULL, &status);
#ifdef SHOW_PRINTF
if ((hGpio == NULL) || (status != CSL_SOK)) {
printf("GPIO: Error opening the instance.\n");
return;
}
else {
printf("GPIO: Module instance opened.\n");
}
#endif
/* Setup hardware parameters */
hwSetup.extendSetup = NULL;
/* Setup the General Purpose IO */
status = CSL_gpioHwSetup(hGpio, &hwSetup);
/* Enable the bank interrupt */
status = CSL_gpioHwControl(hGpio, CSL_GPIO_CMD_BANK_INT_ENABLE, NULL);
#ifdef SHOW_PRINTF
if (status != CSL_SOK) {
printf("GPIO: Command to enable bank interrupt... Failed.\n");
}
else {
printf("GPIO: Command to enable bank interrupt... successful.\n");
}
#endif
/* Configure pin 4 to generate an interrupt on Rising Edge, and
* configure it as an input, then set the data High (Low->High).
* Set Trigger:
*/
config.pinNum = CSL_GPIO_PIN4;
config.trigger = CSL_GPIO_TRIG_RISING_EDGE;
config.direction = CSL_GPIO_DIR_INPUT;
/* configure the gpio pin 4 */
status = CSL_gpioHwControl(hGpio, CSL_GPIO_CMD_CONFIG_BIT, &config);
#ifdef SHOW_PRINTF
if (status != CSL_SOK) {
printf("GPIO: GPIO pin configuration error.\n");
return;
}
else {
printf("GPIO: GPIO pin configuration successful.\n");
}
#endif
}
|