C6748的64位定时器模式如何设定时长超过18.8秒的定时?

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);
}

1个回答

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!

相似问题

2
.net定时任务如何实现?
1
定时器编程。初始状态D1以0.2s速率闪烁
1
cc1310不带系统的定时器捕获例程.
1
SpringBoot 定时访问外部接口时Tomcat报404错误.
1
在单片机中 设置pwm时会用到定时器,定时器的作用是什么了 详细一些
0
c语言单线程开启多个定时器,同时去读写同一个文件,需要加锁吗?定时器原理?
3
定时器每隔2秒调用方法a, a方法里面有个延时器,延时5秒执行
1
Vue中三个跑马灯页面,怎样实现只有当前显示页面的定时器会执行 ,其他两个处于关闭状态?
1
vb.net 定时执行一个bat的文件 (定时做备份)
2
为什么我在springboot2.0上面整合quartz做的定时任务,移到springboot1.5上面启动没有反应?
2
quartz做定时任务持久化到数据库,不使用框架自带的11张表可以吗?大概的思路是什么样的.
1
.NET后台监控linux服务器的文件,将新增的内容解析入库如何处理?
2
“System.IO.IOException”类型的异常在 NPOI.dll 中发生
1
关于监控与页面顶端距离启动定时器的问题
1
springboot中注解定时器异常
2
我们服务器上java的war包里写了个springtask的定时器,但是为什么我把war包删除了,定时器还在执行
1
新唐芯片N76E885AT28的定时器/计数器初值计算。
1
dva.js怎么异步获取接口数据
1
关于js中定时器setInterval内导入的函数不是个方法
2
ssm 框架,在本地环境下完美运行,在服务器上定时器执行两次