STM32 LL 库 输入捕获

转自:

https://blog.csdn.net/qq_34752070/article/details/105092444

 

这里有个错误,下面说的 100ms 中断,其实错了,是 10 ms才对

 

首先使用STcubeMX配置一下工程

我这里使用的是定时器4的通道1

同时也打开了更新中断,100ms中断一次

需要特别注意的是,有些定时器的管脚是需要重映射的如果不重映射的话是没办法进入捕获中断的,这点STcubeMX在给我们初始化的时候没有初始化,需要我们自己调用重映射函数:比如LL_GPIO_AF_EnableRemap_TIM4();

有了以上配置我们还需要手动打开中断使能等操作,LL库没有为我们打开。

 

LL_TIM_ClearFlag_CC1(TIM4);
    LL_TIM_ClearFlag_UPDATE(TIM4);
    LL_TIM_EnableIT_CC1(TIM4);
    LL_TIM_EnableIT_UPDATE(TIM4);
    LL_TIM_CC_EnableChannel(TIM4,LL_TIM_CHANNEL_CH1);      //这个不要忘记打开了,不然无法捕获
    LL_TIM_EnableCounter(TIM4);

 

 

 

void TIM4_IRQHandler(void)
{
  /* USER CODE BEGIN TIM4_IRQn 0 */
    uint16_t dval = 0;
    if(LL_TIM_IsActiveFlag_UPDATE(TIM4) == SET)
    {
        LL_TIM_ClearFlag_UPDATE(TIM4);
        (TimeCount<UINT32_MAX)?(TimeCount++):(TimeCount = 0);
 
        if((TimeCount%LedFreq)<(LedFreq/2))
            LED(SET);
        else
            LED(RESET);
    }
    if(LL_TIM_IsActiveFlag_CC1(TIM4) == SET)
    {
        LL_TIM_ClearFlag_CC1(TIM4);
        if(IR_READ)
        {
            dval = LL_TIM_IC_GetCaptureCH1(TIM4);//该计数值代表低电平持续时间
            LL_TIM_IC_SetPolarity(TIM4, LL_TIM_CHANNEL_CH1, LL_TIM_IC_POLARITY_FALLING); //设置下降沿触发捕获
            LL_TIM_SetCounter(TIM4,0);    // 清零计数值
            IR_Receive[IR_ReceiveCount++] = dval;
        }
        else
        {
            dval = LL_TIM_IC_GetCaptureCH1(TIM4);//该计数值代表高电平持续时间
            LL_TIM_IC_SetPolarity(TIM4, LL_TIM_CHANNEL_CH1, LL_TIM_IC_POLARITY_RISING);  // 设置上升沿触发
            LL_TIM_SetCounter(TIM4,0);    // 清零计数值
            IR_Receive[IR_ReceiveCount++] = dval;
        }
    }
  /* USER CODE END TIM4_IRQn 0 */
  /* USER CODE BEGIN TIM4_IRQn 1 */
 
  /* USER CODE END TIM4_IRQn 1 */
}

 

posted @ 2020-10-12 09:37  XZHDJH  阅读(1100)  评论(0)    收藏  举报