【MSPM0G3519 系列】外部时钟输入测频

引言

外部被测信号作为其中一个定时器1的外部时钟输入,每来一个上升沿CNT值就加一,在中断定义一个extern_count ++,记录溢出了多少次;另一个定时器2定时1或2秒,进入中断后定义变量timer_count,获取当前定时器1的cnt值,然后计算得到频率值:
image

syscofg配置

外部时钟输入配置()

注意,这里中断触发要选择load触发,否则使用CC0_DN的话在低频会非常不准
image

1或2秒定时器配置

image

程序

点击查看代码

#include "headers.h"


int main(void)
{
    SYSCFG_DL_init();
    Set_CurrentUART(UART0_IDX);
    printf("            <复位>\r\n\r\n");
    bsp_adc_init();
    NVIC_EnableIRQ(TIMER_1_INST_INT_IRQN);
    NVIC_EnableIRQ(COMPARE_0_INST_INT_IRQN);
    while (1) {
        // adc_dsp_opration();
    }
}

volatile uint32_t extern_count;
void COMPARE_0_INST_IRQHandler(void)
{
    switch (DL_TimerA_getPendingInterrupt(COMPARE_0_INST)) {
        case DL_TIMERA_IIDX_LOAD:
            extern_count ++; 
            break;
        default:
            break;
    }
}

uint32_t timer_count;
void TIMER_1_INST_IRQHandler(void)
{
    uint32_t freq;
    switch (DL_TimerA_getPendingInterrupt(TIMER_1_INST)) {
        case DL_TIMERA_IIDX_ZERO:
            timer_count = DL_TimerA_getTimerCount(COMPARE_0_INST);

            freq = timer_count + extern_count * (DL_TimerA_getLoadValue(COMPARE_0_INST) + 1);
            
            printf("freq = %d Hz\r\n\r\n", freq / 2);
            extern_count = 0;
            timer_count = 0;
            DL_TimerA_setTimerCount(COMPARE_0_INST, 0);
            break;
        default:
            break;
    }
}


测试数据

image

更新

移步至:【MSPM0G3519系列】定时器级联时钟输入测频率【进阶版】学习更优测频方案。

博客导航

博客导航

posted @ 2025-07-10 20:43  膝盖中箭卫兵  阅读(38)  评论(0)    收藏  举报
ORCID iD icon https://orcid.org/0000-0001-5102-772X