各位前辈,小弟在看广州创龙的GPIO_KEY_TIMER_EventCombine例程时碰到一点问题,很纠结。程序里使能了GPIObank6中断(GPIO_B6INT,#62),以及定时器1的timer34部分中断(T64P1_TINT34,#48),但是郁闷的是,发生定时器1中断T64P1_TINT34的时候,事件标志寄存器1(EVTFLAG1)的EF48位没有置为1,而发生GPIO中断GPIO_B6INT时,事件标志寄存器1(EVTFLAG1)的EF62位却置为了1。按照下面两图,发生任何4~128的系统中断,EVTFLAG的相应标志都应置为1才对啊,这是怎么回事?
附上C源代码:
/****************************************************************************/ /**/ /*按键及定时器中断组合事件测试*/ /**/ /*2014年10月24日*/ /**/ /****************************************************************************/ #include "TL6748.h"// 创龙 DSP6748 开发板相关声明 #include "hw_types.h"// 宏命令 #include "hw_syscfg0_C6748.h"// 系统配置模块寄存器 #include "soc_C6748.h"// DSP C6748 外设寄存器 #include "psc.h"// 电源与睡眠控制宏及设备抽象层函数声明 #include "gpio.h"// 通用输入输出口宏及设备抽象层函数声明 #include "timer.h"// 通用输入输出口宏及设备抽象层函数声明 #include "interrupt.h"// DSP C6748 中断相关应用程序接口函数声明及系统事件号定义 /****************************************************************************/ /**/ /*宏定义*/ /**/ /****************************************************************************/ // 软件断点 #define SW_BREAKPOINTasm(" SWBP 0 "); // 32位 定时器 / 计数器周期 // 定时时间 5 秒 #define TMR_PERIOD_32(5 * 24 * 1000 * 1000) /****************************************************************************/ /**/ /*全局变量*/ /**/ /****************************************************************************/ /****************************************************************************/ /**/ /*函数声明*/ /**/ /****************************************************************************/ // 外设使能配置 void PSCInit(void); // GPIO 管脚复用配置 void GPIOBankPinMuxSet(); // GPIO 管脚初始化 void GPIOBankPinInit(); // 组合事件中断初始化 void EventCombineInterruptInit(void); // 定时器 / 计数器初始化 void TimerInit(void); // 定时器 / 计数器中断初始化 void TimerInterruptInit(void); // DSP 中断初始化 void InterruptInit(void); // 中断服务函数 void USER1KEYIsr(void); void TimerIsr(void); /****************************************************************************/ /**/ /*主函数*/ /**/ /****************************************************************************/ int main(void) { // 外设使能配置 PSCInit(); // GPIO 管脚复用配置 GPIOBankPinMuxSet(); // GPIO 管脚初始化 GPIOBankPinInit(); // DSP 中断初始化 InterruptInit(); // 组合事件中断初始化 EventCombineInterruptInit(); // 定时器 / 计数器初始化 TimerInit(); // 主循环 for(;;) { } } /****************************************************************************/ /**/ /*PSC 初始化*/ /**/ /****************************************************************************/ void PSCInit(void) { // 使能 GPIO 模块 // 对相应外设模块的使能也可以在 BootLoader 中完成PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_GPIO, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE); } /****************************************************************************/ /**/ /*GPIO 管脚复用配置*/ /**/ /****************************************************************************/ void GPIOBankPinMuxSet(void) { // 配置相应的 GPIO 口功能为普通输入输出口 // 核心板 LED GPIOBank6Pin12PinMuxSetup(); GPIOBank6Pin13PinMuxSetup(); // 底板按键 GPIOBank6Pin1PinMuxSetup(); } /****************************************************************************/ /**/ /*GPIO 管脚初始化*/ /**/ /****************************************************************************/ void GPIOBankPinInit(void) { // 配置 LED 对应管脚为输出管脚// OMAPL138 及 DSP C6748 共有 144 个 GPIO // 以下为各组 GPIO BANK 起始管脚对应值// 范围 1-144 // GPIO0[0] 1// GPIO1[0] 17 // GPIO2[0] 33// GPIO3[0] 49 // GPIO4[0] 65// GPIO5[0] 81 // GPIO6[0] 97 // GPIO7[0] 113 // GPIO8[0] 129 // 核心板 LEDGPIODirModeSet(SOC_GPIO_0_REGS, 109, GPIO_DIR_OUTPUT); // GPIO6[12]GPIODirModeSet(SOC_GPIO_0_REGS, 110, GPIO_DIR_OUTPUT); // GPIO6[13] // 底板按键GPIODirModeSet(SOC_GPIO_0_REGS, 98, GPIO_DIR_INPUT);// USER1 KEY GPIO6[1] } /****************************************************************************/ /**/ /*定时器 / 计数器初始化*/ /**/ /****************************************************************************/ void TimerInit(void) {// 配置 定时器 / 计数器 1 为 32 位模式TimerConfigure(SOC_TMR_1_REGS, TMR_CFG_32BIT_UNCH_CLK_BOTH_INT);// 设置周期TimerPeriodSet(SOC_TMR_1_REGS, TMR_TIMER34, TMR_PERIOD_32);// 使能 定时器 / 计数器 1TimerEnable(SOC_TMR_1_REGS, TMR_TIMER34, TMR_ENABLE_CONT); } /****************************************************************************/ /**/ /*组合事件中断初始化*/ /**/ /****************************************************************************/ void EventCombineInterruptInit(void) {// 底板按键中断// 配置 USER1 KEY GPIO6[1] 为上升沿及下降沿触发GPIOIntTypeSet(SOC_GPIO_0_REGS, 98, GPIO_INT_TYPE_BOTHEDGE);// 使能 GPIO BANK 中断GPIOBankIntEnable(SOC_GPIO_0_REGS, 6);// USER1 KEY GPIO6 // 使能 定时器 / 计数器 中断 TimerIntEnable(SOC_TMR_1_REGS, TMR_INT_TMR34_NON_CAPT_MODE); // 映射中断到 DSP 可屏蔽中断 IntEventCombineInit(ECM0_UNUSED, C674X_MASK_INT4, ECM2_UNUSED, ECM3_UNUSED); // 注册中断服务函数IntEventCombineRegister(SYS_INT_GPIO_B6INT, USER1KEYIsr);IntEventCombineRegister(SYS_INT_T64P1_TINT34, TimerIsr); // 添加事件 IntEventCombineAdd(SYS_INT_GPIO_B6INT); IntEventCombineAdd(SYS_INT_T64P1_TINT34); } /****************************************************************************/ /**/ /*DSP 中断初始化*/ /**/ /****************************************************************************/ void InterruptInit(void) { // 初始化 DSP 中断控制器 IntDSPINTCInit(); // 使能 DSP 全局中断 IntGlobalEnable(); } /****************************************************************************/ /**/ /*中断服务函数*/ /**/ /****************************************************************************/ void USER1KEYIsr(void) {// 禁用 GPIO BANK 6 中断GPIOBankIntDisable(SOC_GPIO_0_REGS, 6);// 清除 GPIO BANK 6 中断事件IntEventClear(SYS_INT_GPIO_B6INT);if(GPIOPinIntStatus(SOC_GPIO_0_REGS, 98) == GPIO_INT_PEND){ // 清除中断状态 GPIOPinIntClear(SOC_GPIO_0_REGS, 98); // 核心板 LED unsigned int i; GPIOPinWrite(SOC_GPIO_0_REGS, 109, GPIO_PIN_HIGH); for(i=0x00FFFFFF;i>0;i--);// 延时 GPIOPinWrite(SOC_GPIO_0_REGS, 109, GPIO_PIN_LOW);} // 使能 GPIO BANK 6 中断GPIOBankIntEnable(SOC_GPIO_0_REGS, 6); } void TimerIsr(void) { // 禁用定时器 / 计数器中断 TimerIntDisable(SOC_TMR_1_REGS, TMR_INT_TMR34_NON_CAPT_MODE); // 清除 定时器 / 计数器 1 中断事件 IntEventClear(SYS_INT_T64P1_TINT34); // 清除中断状态 // TimerIntStatusClear(SOC_TMR_1_REGS, TMR_INT_TMR12_NON_CAPT_MODE); TimerIntStatusClear(SOC_TMR_1_REGS, TMR_INT_TMR34_NON_CAPT_MODE); // 核心板 LED unsigned int i; GPIOPinWrite(SOC_GPIO_0_REGS, 110, GPIO_PIN_HIGH); for(i=0x00FFFFFF;i>0;i--);// 延时 GPIOPinWrite(SOC_GPIO_0_REGS, 110, GPIO_PIN_LOW); // 重新设置初始值 // 设置周期 //TimerPeriodSet(SOC_TMR_1_REGS, TMR_TIMER12, TMR_PERIOD_32); TimerPeriodSet(SOC_TMR_1_REGS, TMR_TIMER34, TMR_PERIOD_32); // 使能 定时器 / 计数器 中断 TimerIntEnable(SOC_TMR_1_REGS, TMR_INT_TMR34_NON_CAPT_MODE); }
Shine:
先不要使能GPIO中断,先单独调试定时器中断看能否产生中断。