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.

[参考译文] TMDSLCDK138:来自 ARM 的中断在 CCS/Non-OS 项目中不起作用

Guru**** 2837190 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/655609/tmdslcdk138-interrupts-from-arm-are-not-working-in-ccs-non-os-project

器件型号: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
带有中断的计时器测试、结束

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我已通知 RTOS 团队。 他们将直接在此处发布反馈。

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Ad、

    我们提供了计时器中断的示例代码、您可以将其用作参考。 它使用寄存器级 CSL 定义将定时器设置为32位非链模式。

    如果您有任何疑问、请查看并告知我们。

    最棒的

    Sahin

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Sahin、

    感谢您提供相关信息。 示例代码有点旧、因此我必须进行一些更改、但现在它可以正常工作:生成中断并调用 ISR。

    此致、
    广告