爱折腾的孩纸

stm32 Checklists - TIM篇

基础初始化过程

  1. APB EnableClock, 查找定时器所在APB及分组(一般APB1 GRP1),开启时钟
    LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_TIMx);
    
  2. 填写 TIM_InitStruct
    LL_TIM_InitTypeDef TIM_InitStruct = {0};
    TIM_InitStruct.Prescaler = 71;
    TIM_InitStruct.CounterMode = LL_TIM_COUNTERMODE_UP;
    TIM_InitStruct.Autoreload = 1000;
    TIM_InitStruct.ClockDivision = LL_TIM_CLOCKDIVIDION_DIV1;
    
  3. 初始化TIM
    LL_TIM_Init(TIMx, &TIM_InitStruct);
    
  4. 设置是否启用 ARRPreload,其作用类似影子寄存器(可选)。
    LL_TIM_DisableARRPreload(TIMx);
    
  5. 设置时钟源(可选)。
    LL_TIM_SetClockSource(TIMx, LL_TIM_CLOCKSOURCE_INTERNAL);
    

产生Update中断

用于定时产生一个固定时间间隔的中断

  1. 基础初始化。
  2. 启用Update中断。
    LL_TIM_EnableIT_UPDATE(TIMx);
    
  3. 设置NVIC。
    NVIC_SetPriority(TIMx_IRQn, 0);
    NVIC_EnableIRQ(TIMx_IRQn);
    
  4. 启用时钟。初始化完毕。
    LL_TIM_EnableCounter(TIMx);
    
  5. 编写IRQHandler函数。在stm32fxxx_it.c文件中编写代码,注意必须有清除标志的动作,否则会导致一直进入中断。
    void TIMx_IRQHandler(void)
    {
        if (LL_TIM_IsActiveFlag_UPDATE(TIMx))
        {
            LL_TIM_ClearFlag_UPDATE(TIMx);
        }
    }
    
  6. 检查启动文件中是否有相应的入口。
    DCD  TIMx_IRQHandler  ; TIMx
    

作为ADC的触发源

这里使用UPDATE事件,同理可用CC一类事件。

  1. 基础初始化。
  2. 设置触发输出。
    LL_TIM_SetTriggerOutput(TIMx, LL_TIM_TRGO_UPDATE);
    
  3. 启用时钟。
    LL_TIM_EnableCounter(TIMx);
    
  4. 启用触发事件。
    LL_TIM_EnableUpdateEvent(TIMx);
    
  5. ADC中设置TriggerSource。
    ADC_REG_InitStruct.TriggerSource = LL_ADC_REG_TRIG_EXT_TIMx_TRGO;
    
  6. ADC应启用且开启转换。否则不会进行转换及产生EOC中断。
    LL_ADC_Enable(ADCx);
    LL_ADC_REG_StartConversion(ADCx);
    

评论