This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

c6748定时器中断中断标志没有置位



各位前辈,小弟在看广州创龙的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_BREAKPOINT   asm(" 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

	// 核心板 LED
    GPIODirModeSet(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);

    // 使能 定时器 / 计数器 1
    TimerEnable(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);
}