请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:TMDSLCDK138 您好!
我正在使用 CCS v7.2和 PSDK RTOS 4.01创建裸机(非操作系统) CCS 项目、并希望使用计时器测试 ARM 中断。 计时器和 AINTC 看起来工作正常、因为我可以通过检查其 SECRx 寄存器看到中断到达 AINTC、但我注册的回调函数(ISR)从未调用。
我想我缺少一些 ARM 初始化、但我不知道这可能是什么。
如何让 ARM 调用 ISR?
此致、
广告
代码如下所示:
#include
#include
#include
#include
#include
#include
#include
#include "hw_types.h"
#include
extern void CopyVectorTable (void);
static void callback_int_timerp0_12 ();
static void callback_int_timerp0_34 ();
static void callback_int_timerp0_12 ()
{
printf ("中断 P0 12\n");fflush (stdout);
}
静态 void callback_int_timerp0_34 ()
{
printf ("中断 P0 34\n");fflush (stdout);
}
//**
* main.c
*/
int main (void)
{
内部 一;
CSL_TmrContext;
CSL_Status 状态;
CSL_TmrObj tmrObj;
CSL_TmrHandle hTmr;
CSL_TmrHwSetup;
CSL_TmrEnamode enaMode;
uint32_t 国家/地区;
OnTargetConnect();
printf ("带有中断的计时器测试、begin\n");
CopyVectorTable();
//初始化电路板
board_initCfg board_cfg;
Board_cfg = Board_init_module_clock |
BOARD_INIT_PINMUX_CONFIG |
Board_init_uart_stdio;
board_init (board_cfg);
//初始化 AINTC
INTC_Init();
IntGlobalEnable();
IntIRQEnable();
IntFIQEnable();
INTC_IntEnable (0);
INTC_IntRegister (21、callback_int_timerp0_12);
INTC_IntRegister (22、callback_int_timerp0_34);
INTC_SystemEnable (21);
INTC_SystemEnable (22);
IntChannelSet (21、31);
IntChannelSet (22、31);
printf ("中断通道21:%u、通道22:%u\n"、
IntChannelGet (21)、
IntChannelGet (22));
//初始化计时器
cSL_tmrInit (上下文);
//打开计时器0
hTmr = CSL_tmrOpen (_tmrObj、0、NULL、STATUS);
//设置硬件
hwSetup.tmrTimerPeriodLo = 0x00B70000;
hwSetup.tmrTimerPeriodHi = 0x00000000;
hwSetup.tmrTimerCounterLo = 0;
hwSetup.tmrTimerCounterHi = 0;
//内部时钟输入来自 PLLC0,为24MHz
hwSetup.tmrIpGateLo = CSL_TMR_CLOCK INP_NOGATE;
hwSetup.tmrClksrcLo = CSL_TMR_CLKSRC_INTERNAL;
hwSetup.tmrPulseWidthLo = CSL_TMR_PWID_ONECLK;
hwSetup.tmrClockPulseLo = CSL_TMR_CP_CLOCK;
hwSetup.tmrInvInpLo = CSL_TMR_INVINP_UNINVERTED;
hwSetup.tmrInvOutpLo = CSL_TMR_INVOUT_UNINVERTED;
hwSetup.tmrIpGateHi = CSL_TMR_CLOCK INP_NOGATE;
hwSetup.tmrClksrcHi = CSL_TMR_CLKSRC_INTERNAL;
hwSetup.tmrPulseWidthHi = CSL_TMR_PWID_ONECLK;
hwSetup.tmrClockPulseHi = CSL_TMR_CP_CLOCK;
hwSetup.tmrInvInpHi = CSL_TMR_INVINP_UNINVERTED;
hwSetup.tmrInvOutpHi = CSL_TMR_INVOUT_UNINVERTED;
hwSetup.tmrPreScalarCounterHi = 0;
// 2 x 32位未链接
hwSetup.tmrTimerMode = CSL_TMR_TIMMODE_DUAL_UNIchained;
CSL_tmrHwSetup (hTmr、hwSetup);
//在计时器控制器中启用计时器中断
uint32_t reg =hTmr->regs->INTCTL_STAT;
reg |=(CSL_TMR_INTCTL_STAT_CMP_INT_EN_LO_MASK |
CSL_TMR_INTCTL_STAT_CMP_INT_EN_HI_MASK);
hTmr->regs->INTCTL_STAT = reg;
//开始计时器
enaMode = CSL_TMR_ENAMODE_CONT;
CSL_tmrHwControl (hTmr、CSL_TMR_CMD_START_TIMLO、enaMode);
CSL_tmrHwControl (hTmr、CSL_TMR_CMD_START_TIMHI、enaMode);
对于(I = 0;I < 4;I++)
{
CSL_tmrGetHwStatus (hTmr、CSL_TMR_QUEST_COUNT_LO、&countLo);
printf ("第一个计时器计数低:%u \n"、countLo);
printf ("中断:21:原始:%u、已启用:%u、22:原始:%u、已启用:%u\n"、
IntSystemStatusRawGet (21)、
IntSystemStatusEnabledGet (21)、
IntSystemStatusRawGet (22)、
IntSystemStatusEnabledGet (22));
}
//关闭计时器。
cSL_tmrClose (hTmr);
printf ("带有中断的计时器测试、end\n");
返回0;
}
产生以下输出:
[ARM9_0]目标已连接。 ---------------------- PSC 启用完成。 ---------------------- 针对内核:300MHz、EMIFA:25MHz DDR 初始化完成的 PLL0初始化正在进行中.... PLL1 init done for DDR:150MHz VTP 就绪使用 DDR2设置的超时 150MHz 的 DDR2初始化完成 了------------------------------------------------------- DSP 唤醒完成。 ---------------------- 带有中断的定时器测试、开始 中断通道21:31、通道22:31 第一个定时器计数低:108 中断:21:原始:0、启用:0、22:原始:0、启用:0 第一个定时器计数低:10490700 中断:21:原始:1、启用:1、22:原始:0、启用:0 第一个定时器计数低:10336590 中断: 21:RAW:1、ENABLED:1、22:RAW:0、ENABLED:0 FIRST TIMER COUNT LOW:10214893 中断:21:RAW:1、ENABLED:1、22:RAW:0、ENABLED:0 带有中断的计时器测试、结束
