NXP MCU 技术论坛
直播中

LL-LING宁

8年用户 1267经验值
擅长:电源/新能源
私信 关注
[问答]

IMX8MN如果我们配置GPT在上升沿/下降沿触发中断,如何知道中断是由下降沿还是上升沿触发?

我们正在使用带有 CM7 协处理器的 iMX8MN 板。
我们有一个无线电芯片连接到 GPT Input Capture 1 引脚,
来自无线电芯片的信号是频率未知且可变的脉冲波。
我们需要处理信号以获得一个数组,其中包含每个 0 和 1 转换的持续时间

我的想法是在输入捕获模式下使用 GPT 1,配置为触发上升沿和下降沿的中断,并在中断中获取位 (0/1) 的持续时间并将其存储在数组中。(应该稍后用 DMA 制作..)

但我有一些问题:
1.如果我们配置GPT在上升沿/下降沿触发中断,如何知道中断是由下降沿还是上升沿触发?(SR寄存器只包含“Input capture 1 Flag”)
2. 当 GPT 配置为重启模式时,触发“输入捕获事件”时计数器不重启是否正常?(所以为了测量一个位的持续时间,我们需要存储之前的值?)
3. 有人知道在哪里定义/设置 kCLOCK_IpgClk 频率吗?我有类似 66666666Hz 的东西,我不知道这个值在哪里设置。

这里有一些代码示例:

/* Freescale includes. */
#include \"board.h\"
#include \"clock_config.h\"
#include \"fsl_debug_console.h\"
#include \"fsl_device_registers.h\"
#include \"fsl_gpio.h\"
#include \"fsl_clock.h\"
#include \"fsl_gpt.h\"
#include \"pin_mux.h\"

volatile bool gptIsrFlag = false;


void GPT1_IRQHandler(void) {
/* Clear interrupt flag.*/
GPT_ClearStatusFlags(GPT1, kGPT_InputCapture1Flag);

    gptIsrFlag = true;
/* Add for ARM errata 838869, affects Cortex-M4, Cortex-M4F, Cortex-M7, Cortex-M7F Store immediate overlapping
      exception return operation might vector to incorrect interrupt */
#if defined __CORTEX_M && (__CORTEX_M == 4U || __CORTEX_M == 7U)
__DSB();
#endif
}

void main(void) {
/* Init board hardware. */
/* M7 has its local cache and enabled by default,
     * need to set smart subsystems (0x28000000 ~ 0x3FFFFFFF)
     * non-cacheable before accessing this address region */
BOARD_InitMemory();

/* Board specific RDC settings */
BOARD_RdcInit();

BOARD_InitBootPins();
BOARD_BootClockRUN();
BOARD_InitDebugConsole();

    uint32_t previousCapture = 0;
    uint32_t captureVal = 0;
    uint32_t currentCount = 0;
    gpt_config_t gptConfig;
    gptConfig.divider = 4095;
GPT_GetDefaultConfig(&gptConfig);
GPT_Init(GPT1, &gptConfig);
GPT_SetInputOperationMode(GPT1, kGPT_InputCapture_Channel1, kGPT_InputOperation_BothEdge);
GPT_EnableInterrupts(GPT1, kGPT_InputCapture1InterruptEnable);
EnableIRQ(GPT1_IRQn);
GPT_StartTimer(GPT1);

PRINTF(\"kCLOCK_IpgClk = %d Hz\\n\", CLOCK_GetFreq(kCLOCK_IpgClk));
PRINTF(\"kCLOCK_PerClk = %d Hz\\n\", CLOCK_GetFreq(kCLOCK_PerClk));

while (true) {
/* Check whether occur interupt */
if (true == gptIsrFlag) {
            captureVal = GPT_GetInputCaptureValue(GPT1, kGPT_InputCapture_Channel1);
            currentCount = GPT_GetCurrentTimerCount(GPT1);
PRINTF(\"Capture value = %d, currentCount = %d, difference: %d\\n\", captureVal, currentCount, captureVal - previousCapture);
            previousCapture = captureVal;
            gptIsrFlag = false;
} else {
__WFI();
}
}
}

更多回帖

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