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

syscofg配置
外部时钟输入配置()
注意,这里中断触发要选择load触发,否则使用CC0_DN的话在低频会非常不准

1或2秒定时器配置

程序
点击查看代码
#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;
}
}
测试数据

更新
移步至:【MSPM0G3519系列】定时器级联时钟输入测频率【进阶版】学习更优测频方案。
博客导航
本文来自博客园,作者:膝盖中箭卫兵,转载请注明原文链接:https://www.cnblogs.com/Skyrim-sssuuu/p/18977710

浙公网安备 33010602011771号
https://orcid.org/0000-0001-5102-772X