1、定时器设定的是64位模式,设定时间25秒,低32位定义#define TMR_PERIOD_LSB32 0x53BF1900 高32位定义#define TMR_PERIOD_MSB32 0X1
2、此时会出现6.2秒时进入一次定时器中断,然后18.8秒又进入一次定时器中断,相当于25秒进了两次中断。低32位计数达到FFFFFFFF时又正好是18.8秒
这个可能是什么问题导致的呢?定时器时间配置有问题还是中断的问题?
#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 中断相关应用程序接口函数声明及系统事件号定义
#include <c6x.h>
#include<stdio.h>
/****************************************************************************/
/* */
/* 宏定义 */
/* */
/****************************************************************************/
// 软件断点
#define SW_BREAKPOINT asm(" SWBP 0 ");
#define TMR_PERIOD_LSB32 0x53BF1900
#define TMR_PERIOD_MSB32 0X1
unsigned char Flag = 0;
unsigned int beforeL , beforeH;
unsigned int afterL , afterH;
unsigned long long a;
unsigned int b;
unsigned long long before;
unsigned long long after;
unsigned int i = 0;
// 外设使能配置
void PSCInit(void);
// GPIO 管脚复用配置
void GPIOBankPinMuxSet();
// GPIO 管脚初始化
void GPIOBankPinInit();
// 定时器 / 计数器初始化
void TimerInit(void);
// 定时器 / 计数器中断初始化
void TimerInterruptInit(void);
// DSP 中断初始化
void InterruptInit(void);
// 中断服务函数
void TimerIsr(void);
int main(void)
{
// 外设使能配置
PSCInit();
// GPIO 管脚复用配置
GPIOBankPinMuxSet();
// GPIO 管脚初始化
GPIOBankPinInit();
// 定时器 / 计数器初始化
TimerInit();
// DSP 中断初始化
InterruptInit();
// 定时器 / 计数器中断初始化
TimerInterruptInit();
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();
}
/****************************************************************************/
/* */
/* 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]
}
/****************************************************************************/
/* */
/* 定时器 / 计数器初始化 */
/* */
/****************************************************************************/
void TimerInit(void)
{
// 配置 定时器 / 计数器 2 为 64 位模式
TimerConfigure(SOC_TMR_2_REGS, TMR_CFG_64BIT_CLK_INT);
// 设置周期
TimerPeriodSet(SOC_TMR_2_REGS, TMR_TIMER12, TMR_PERIOD_LSB32);
TimerPeriodSet(SOC_TMR_2_REGS, TMR_TIMER34, TMR_PERIOD_MSB32);
// 使能 定时器 / 计数器 2
TimerEnable(SOC_TMR_2_REGS, TMR_TIMER12, TMR_ENABLE_CONT);
}
/****************************************************************************/
/* */
/* 定时器 / 计数器中断初始化 */
/* */
/****************************************************************************/
void TimerInterruptInit(void)
{
// 注册中断服务函数
IntRegister(C674X_MASK_INT4, TimerIsr);
// 映射中断到 DSP 可屏蔽中断
IntEventMap(C674X_MASK_INT4, SYS_INT_T64P2_TINTALL);
// 使能 DSP 可屏蔽中断
IntEnable(C674X_MASK_INT4);
// 使能 定时器 / 计数器 中断
TimerIntEnable(SOC_TMR_2_REGS, TMR_INT_TMR12_NON_CAPT_MODE);
}
/****************************************************************************/
/* */
/* DSP 中断初始化 */
/* */
/****************************************************************************/
void InterruptInit(void)
{
// 初始化 DSP 中断控制器
IntDSPINTCInit();
// 使能 DSP 全局中断
IntGlobalEnable();
}
/****************************************************************************/
/* */
/* 中断服务函数 */
/* */
/****************************************************************************/
void TimerIsr(void)
{
// 禁用定时器 / 计数器中断
TimerIntDisable(SOC_TMR_2_REGS, TMR_INT_TMR12_NON_CAPT_MODE);
// 清除中断标志
IntEventClear(SYS_INT_T64P2_TINTALL);
TimerIntStatusClear(SOC_TMR_2_REGS, TMR_INT_TMR12_NON_CAPT_MODE);
// 改变 LED 状态
GPIOPinWrite(SOC_GPIO_0_REGS, 109, Flag);
Flag=!Flag;
GPIOPinWrite(SOC_GPIO_0_REGS, 110, Flag);
// 使能 定时器 / 计数器 中断
TimerIntEnable(SOC_TMR_2_REGS, TMR_INT_TMR12_NON_CAPT_MODE);
}