NXP MCU 技术论坛
直播中

张鹏

8年用户 1243经验值
私信 关注
[问答]

如何在MR_CANHUBK344时使用定期中断?

我想使用周期性中断功能.....
请帮帮我......

回帖(1)

陈丽

2025-4-9 17:56:54

在MR_CANHUBK344开发板(假设基于NXP Kinetis K34微控制器)上配置周期性中断的步骤如下:




1. 选择定时器模块


推荐使用PIT (Periodic Interrupt Timer),专为周期性中断设计,支持多通道独立配置。




2. 配置定时器参数


时钟与周期计算



  • 假设系统总线时钟为 60 MHz,需要生成 1ms 的中断:
    Timer Period (counts) = (Desired Period in seconds) × (Clock Frequency)
                          = 0.001s × 60,000,000 Hz = 60,000 counts

  • 通过预分频器调整计数值(若时钟频率过高)。




3. 代码实现


使用MCUXpresso SDK的示例


#include "fsl_pit.h"
#include "fsl_clock.h"

#define PIT_CHANNEL     kPIT_Chnl_0
#define PIT_IRQ_HANDLER PIT0_IRQHandler
#define PIT_IRQ_ID      PIT0_IRQn

volatile uint32_t pitIsrFlag = 0;

void PIT_IRQ_HANDLER(void) {
    // 清除中断标志
    PIT_ClearStatusFlags(PIT, PIT_CHANNEL, kPIT_TimerFlag);
    // 设置用户标志或执行任务
    pitIsrFlag = 1;
    __DSB(); // 确保指令完成
}

int main(void) {
    pit_config_t pitConfig;
    uint32_t pitClockFreq;
    uint32_t timerPeriod_us = 1000; // 1ms

    // 初始化PIT模块
    PIT_GetDefaultConfig(&pitConfig);
    PIT_Init(PIT, &pitConfig);

    // 获取PIT时钟频率
    pitClockFreq = CLOCK_GetFreq(kCLOCK_BusClk);

    // 计算定时器周期值
    uint32_t periodCount = USEC_TO_COUNT(timerPeriod_us, pitClockFreq);

    // 配置PIT通道
    PIT_SetTimerPeriod(PIT, PIT_CHANNEL, periodCount);

    // 启用中断
    PIT_EnableInterrupts(PIT, PIT_CHANNEL, kPIT_TimerInterruptEnable);
    EnableIRQ(PIT_IRQ_ID);
    NVIC_SetPriority(PIT_IRQ_ID, 3); // 设置中断优先级

    // 启动定时器
    PIT_StartTimer(PIT, PIT_CHANNEL);

    while (1) {
        if (pitIsrFlag) {
            pitIsrFlag = 0;
            // 执行周期性任务
        }
    }
}



4. 关键点检查



  • 时钟配置:确保 CLOCK_GetFreq(kCLOCK_BusClk) 返回正确的总线频率。

  • 中断服务程序(ISR)

    • 必须使用 __attribute__((weak)) 或直接在向量表中注册。

    • 清除中断标志避免重复触发。


  • 宏定义USEC_TO_COUNT 可能需要手动计算,若SDK未提供。




5. 调试建议



  • 寄存器检查:通过调试器确认 PIT->CHANNEL[0].LDVAL 是否正确加载。

  • 中断触发测试:在ISR中设置断点,观察是否触发。

  • 时钟诊断:确认系统时钟配置是否正确(如 SystemCoreClock 变量)。




常见问题



  • 中断未触发:检查NVIC是否启用、中断优先级设置、标志是否清除。

  • 周期不准确:确认时钟源和分频器配置,避免计数器溢出。


通过上述步骤,您应能在MR_CANHUBK344上实现稳定的周期性中断。建议参考NXP官方文档 K34 Sub-Family Reference Manual 获取寄存器级详细信息。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分