STM32 LL库之定时器的使用
STM32cubeMx用过的小伙伴应该都知道,初始化外设很方便很简单,也减少自己配置外设的错误率。但是有个问题也导致一些伙伴放弃使用cubeMx,就是cube基于的HAL库生成的代码编译出来占用空间大,用起来方便但是出现问题不好查找,还有就是运行效率不够高。所以st又推出了LL库,LL库同样可以和stm32cubeMx配合起来。
最近用到定时器,就把基于LL库如何使用定时器做个总结。我使用的是stm32F031K6的芯片,有的系列st的LL库可能还在更新之中。
首先就是把自己的stm32CubeMx升级为最新版本,确保已经集成了LL库。
定时器我用到两个:一个是tim17用来作为计数,10ms产生一次中断。 一个是tim3用来做pwm捕获输入。如下如所示:
再看tim17的详细配置:(这个配置和使用HAL库的时候是一样的,记得要使能中断)
再看下tim3的配置,配置通道1作为捕获输入:
这样配置好以后生成代码。LL库就不想HAL库封装的那么好,函数接口也不一样。所以想让定时器运行就需要深入看一下定时器的参考手册部分。
定时器17启动的以及中断函数代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
void user_tim17Init() { LL_TIM_EnableIT_UPDATE(TIM17); LL_TIM_EnableCounter(TIM17); } void user_tim17IRQ() { if(LL_TIM_IsActiveFlag_UPDATE(TIM17)) { LL_TIM_ClearFlag_UPDATE(TIM17); } } |
定时器3的pwm捕获功能的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
void user_dht11Init() { LL_TIM_EnableIT_CC1(TIM3); LL_TIM_EnableIT_UPDATE(TIM17); LL_TIM_ClearFlag_CC1(TIM3); LL_TIM_SetCounter(TIM3,0); LL_TIM_CC_EnableChannel(TIM3,LL_TIM_CHANNEL_CH1); LL_TIM_EnableCounter(TIM3); } void user_tim3IRQ() { if(LL_TIM_IsActiveFlag_CC1(TIM3)) //捕获到了下降沿 { valueBuf[valueCount] =LL_TIM_OC_GetCompareCH1(TIM3); LL_TIM_ClearFlag_CC1(TIM3); valueCount++; LL_TIM_SetCounter(TIM3,0); } |
1 |
} |