主题:SysConfig 中讨论的其他器件
工具/软件:
我遵循此论坛示例启用 EXT_REFCLK1 输入
这似乎是有效的、但我设置为每 10us 放弃一次 ISR 的计时器只有一个中断。 我使用 25MHz HF_OSC0 的计时器时钟输入尝试了相同的固件、并按预期每 10us 以连续周期运行一次。
我可以使用一对级联计时器并计数 10 μ s 周期、或使用单个计时器和 ISR 方法、但这两种方法都需要使用 EXT_REFCLK1 作为同步时钟源。
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.
工具/软件:
我遵循此论坛示例启用 EXT_REFCLK1 输入
这似乎是有效的、但我设置为每 10us 放弃一次 ISR 的计时器只有一个中断。 我使用 25MHz HF_OSC0 的计时器时钟输入尝试了相同的固件、并按预期每 10us 以连续周期运行一次。
我可以使用一对级联计时器并计数 10 μ s 周期、或使用单个计时器和 ISR 方法、但这两种方法都需要使用 EXT_REFCLK1 作为同步时钟源。
Tushar、
您的理解是正确的。 首次初始化计时器后、我得到一个 10us IRQ、当使用 EXT_REFCLK1 (48MHz) 作为计时器源时钟时、不会超过该值。 然后、我只将计时器源时钟切换到 HF_OSC (25MHz)、并且按照预期每 25us 就会得到中断一次。 我附加了 SYSCFG 为 EXT_REFCLK1 计时器设置生成的代码、以及设置 PinMux 和我的 ISR 的代码片段。
更多的细节: 整个程序使用 FreeRTOS、并在其中一个 R%F 内核 (R5FSS1-0) 上运行
计数值 TwoWayTimerTick 仅在我的程序执行时递增一次。 如果我只将 clocke sourec 更改为 HFOSC、则计数会正常增加。
==================================================
代码生成的 ti_DPL_config.c 文件
void TimerP_isr0 (void *args)
{
void DECODETIMER_TwoWayCallback (void *args);
DECODETIMER_TwoWayCallback (args);
TimerP_clearOverflowInt (gTimerBaseAddr[twoway_timer]);
HwiP_clearInt (twoway_timer_INT_NUM);
}
void TimerP_init ()
{
TimerP_Params timerParams;
HwiP_Params timerHwiParams;
int32_t 状态;
/*设置计时器时钟源*/
SoC_controlModuleUnlockMMR (SOC_DOMAIN_ID_MAIN、2);
*(volatile uint32_t *) AddrTranslateP_getLocalAddr (twoway_timer_clock_SRC_MUX_ADDR)= twoway_timer_clock_SRC_EXT_REFCLK1;
SoC_controlModuleLockMMR (SOC_DOMAIN_ID_MAIN、2);
gTimerBaseAddr[twoway_TIMER]=(uint32_t) AddrTranslateP_getLocalAddr (twoway_timer_base_ADDR);
TimerP_Params_init (&timerParams);
timerParams.inputPreScaler = twoway_timer_input_pre_piscaler;
timerParams.inputClkHz = twoway_timer_input_CLK_Hz;
timerParams.periodInNsec = twoway_timer_nsec_per_tick;
timerParams.oneshotMode = 0;
timerParams.enableOverflowInt = 1;
timerParams.enableDmaTrigger = 0;
TimerP_SETUP (gTimerBaseAddr[twoway_TIMER]、&timerParams);
HwiP_Params_init (&timerHwiParams);
timerHwiParams.intNum = twoway_timer_INT_NUM;
timerHwiParams.callback = TimerP_isr0;
timerHwiParams.isPulse = 0;
timerHwiParams.priority = 4;
Status = HwiP_Construct (&gTimerHwiObj[twoway_timer]、&timerHwiParams);
DebugP_assertNoLog (STATUS==SystemP_Success);
TimerP_start( gTimerBaseAddr[twoway_timer]);
}
===================================================
我的 Pinmux 代码在 main() fright 中的 System_init() 之后执行;
void ExtRefClk1_config ()
{
PinMuxMainDomainCfg_Cfg_t gPinMuxMainDomainCfg[]={Pinmux_Per
/* MySYSTEM1 -> EXT_REFCLK1 -> A19 */
{
PIN_EXT_REFCLK1、
PIN_MODE (0)|((PIN_PULL_DISABLE | PIN_INPUT_ENABLE) 和 (~Ω PIN_PULL_DIRECTION))
}、
{ PINMUX_END、PINMUX_END }
};
Pinmux_config (gPinMuxMainDomainCfg、PINMUX_domain_ID_MAIN);
}
======================================
只对中断进行计数的中断服务处理程序:
void DECODETIMER_TwoWayCallback ( void * args )
{
TwoWayTimerTick++;
}
您好 Bruce、
感谢您的确认。 如果时钟配置正确、则时钟应按预期工作。
请再尝试一个实验、不要在配置后启动计时器。
拆下 TimerP_start( gTimerBaseAddr[twoway_timer]); 中的一行 TimerP_INIT_() 测量输出。 如果这是通过 SysConfig 生成的、则取消选中 Start timer 选项。

引脚多路复用完成后启动计时器。 (即在 ExtRefClk1_config() 函数调用后)
void TimerP_init()
{
TimerP_Params timerParams;
HwiP_Params timerHwiParams;
int32_t status;
/* set timer clock source */
SOC_controlModuleUnlockMMR(SOC_DOMAIN_ID_MAIN, 2);
*(volatile uint32_t*)AddrTranslateP_getLocalAddr(TWOWAY_TIMER_CLOCK_SRC_MUX_ADDR) = TWOWAY_TIMER_CLOCK_SRC_EXT_REFCLK1;
SOC_controlModuleLockMMR(SOC_DOMAIN_ID_MAIN, 2);
gTimerBaseAddr[TWOWAY_TIMER] = (uint32_t)AddrTranslateP_getLocalAddr(TWOWAY_TIMER_BASE_ADDR);
TimerP_Params_init(&timerParams);
timerParams.inputPreScaler = TWOWAY_TIMER_INPUT_PRE_SCALER;
timerParams.inputClkHz = TWOWAY_TIMER_INPUT_CLK_HZ;
timerParams.periodInNsec = TWOWAY_TIMER_NSEC_PER_TICK;
timerParams.oneshotMode = 0;
timerParams.enableOverflowInt = 1;
timerParams.enableDmaTrigger = 0;
TimerP_setup(gTimerBaseAddr[TWOWAY_TIMER], &timerParams);
HwiP_Params_init(&timerHwiParams);
timerHwiParams.intNum = TWOWAY_TIMER_INT_NUM;
timerHwiParams.callback = TimerP_isr0;
timerHwiParams.isPulse = 0;
timerHwiParams.priority = 4;
status = HwiP_construct(&gTimerHwiObj[TWOWAY_TIMER], &timerHwiParams);
DebugP_assertNoLog(status==SystemP_SUCCESS);
}
void main()
{
System_init();
ExtRefClk1_config();
TimerP_start( gTimerBaseAddr[TWOWAY_TIMER] );
}
请告知我们结果。
此致、
Tushar