查看: 2411|回复: 3

FM33LC02无法定时1us

[复制链接]

1

主题

3

帖子

33

积分

初级工程师

Rank: 1

积分
33
发表于 2024-4-30 11:06:12 | 显示全部楼层 |阅读模式
我使用了一个普通IO口作为红外接收,所以只能通过定时器计算时间,但我发现无法做到微妙級的计算,请问我的配置问题在哪里,感谢各位前辈!

现测试条件为我有一个9ms的电平改变,我通过修改  TimerBaseInitStruct.prescaler 和 TimerBaseInitStruct.autoReload,可以得到结果为:9/90/900的计数,但无法得到9000,只能计数得到2500左右的值

配置如下:
void MF_SystemClock_Config(void)
{
        SelRCHFToPLL(FL_RCC_RCHF_FREQUENCY_8MHZ, 64 - 1);
        SystemCoreClockUpdate();
}

void MF_GPTIM0_TimerBase_Init(void)
{
    /*IO CONFIG*/
    FL_GPTIM_InitTypeDef    TimerBaseInitStruct;

    TimerBaseInitStruct.prescaler = 64-1;
    TimerBaseInitStruct.counterMode = FL_GPTIM_COUNTER_DIR_UP;
    TimerBaseInitStruct.autoReload = 1-1;
    TimerBaseInitStruct.autoReloadState = FL_DISABLE;
    TimerBaseInitStruct.clockDivision = FL_GPTIM_CLK_DIVISION_DIV1;

    FL_GPTIM_Init(GPTIM0,&TimerBaseInitStruct );

    FL_GPTIM_EnableIT_Update(GPTIM0 );
}

回复

使用道具 举报

154

主题

846

帖子

4624

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4624
发表于 2024-5-6 11:09:20 | 显示全部楼层
主频 64MHz, 1us 也就是64条指令,考虑到中断压栈出栈。中断处理等等,1us的中断计时,估计是很难完成的。
回复

使用道具 举报

1

主题

3

帖子

33

积分

初级工程师

Rank: 1

积分
33
 楼主| 发表于 2024-5-14 18:08:35 | 显示全部楼层
顾博文 发表于 2024-5-6 11:09
主频 64MHz, 1us 也就是64条指令,考虑到中断压栈出栈。中断处理等等,1us的中断计时,估计是很难完成的。 ...

你好,我现在将IR跳到PA4脚(MCU是FM33LCO25N),参考例程使用输入捕捉的方式,但每次捕捉到的值都有很大的差异,请问我的配置那里有问题吗?
void MF_GPTIM1_TimerBase_Init(void)
{
          FL_GPTIM_InitTypeDef    TimerBase_InitStruct;

    TimerBase_InitStruct.prescaler = 64-1;
    TimerBase_InitStruct.counterMode = FL_GPTIM_COUNTER_DIR_UP;
    TimerBase_InitStruct.autoReload = 10000-1;
    TimerBase_InitStruct.clockDivision = FL_GPTIM_CLK_DIVISION_DIV1;
    TimerBase_InitStruct.autoReloadState = FL_DISABLE;

    FL_GPTIM_Init(GPTIM1, &TimerBase_InitStruct);
}

void MF_GPTIM1_Channel3_Init(void)
{
    FL_GPIO_InitTypeDef    GPIO_InitStruct;

    FL_GPTIM_IC_InitTypeDef    GPTIM1_InitStruct;

    GPIO_InitStruct.pin = FL_GPIO_PIN_4;
    GPIO_InitStruct.mode = FL_GPIO_MODE_DIGITAL;
    GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL;
    GPIO_InitStruct.pull = FL_DISABLE;
    GPIO_InitStruct.remapPin = FL_ENABLE;
//    GPIO_InitStruct.analogSwitch = FL_DISABLE;
    FL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    GPTIM1_InitStruct.ICPolarity = FL_GPTIM_IC_POLARITY_NORMAL;
    GPTIM1_InitStruct.ICActiveInput = FL_GPTIM_CHANNEL_MODE_INPUT_NORMAL;
    GPTIM1_InitStruct.ICPrescaler = FL_GPTIM_IC_PSC_DIV1;
    GPTIM1_InitStruct.ICFilter = FL_GPTIM_IC_FILTER_DIV1;
    GPTIM1_InitStruct.captureState = FL_ENABLE;

    FL_GPTIM_IC_Init(GPTIM1, FL_GPTIM_CHANNEL_3, &GPTIM1_InitStruct);
}

void MF_GPTIM1_Interrupt_Init(void)
{
    FL_GPTIM_ClearFlag_CCOverflow(GPTIM1, FL_GPTIM_CHANNEL_3);
    FL_GPTIM_ClearFlag_CC(GPTIM1, FL_GPTIM_CHANNEL_3);
    FL_GPTIM_EnableIT_CC(GPTIM1, FL_GPTIM_CHANNEL_3);
}

void GPTIM_Loop(void)
{
    if(status & IS_CAPTURE)
    {
        status &= ~IS_CAPTURE;

        //处理捕获值
        (void)captureValue;
                        DATAIR[INCounter] = captureValue;
                        INCounter++;
    }

    if(status & IS_CAPTURE_OVERFLOW)
    {
        status &= ~IS_CAPTURE_OVERFLOW;

        //捕获溢出事件
        //...
    }
}
回复

使用道具 举报

1

主题

3

帖子

33

积分

初级工程师

Rank: 1

积分
33
 楼主| 发表于 2024-5-14 19:54:38 | 显示全部楼层
顾博文 发表于 2024-5-6 11:09
主频 64MHz, 1us 也就是64条指令,考虑到中断压栈出栈。中断处理等等,1us的中断计时,估计是很难完成的。 ...

另外请问如果我想设为下降沿触发是如此配置吗 FL_GPIO_SetTriggerEdge(GPIO,FL_GPIO_EXTI_LINE_1,FL_GPIO_EXTI_TRIGGER_EDGE_FALLING);
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表