STM32cubeMx用过的小伙伴应该都知道,初始化外设很方便很简单,也减少自己配置外设的错误率。但是有个问题也导致一些伙伴放弃使用cubeMx,就是cube基于的HAL库生成的代码编译出来占用空间大,用起来方便但是出现问题不好查找,还有就是运行效率不够高。所以st又推出了LL库,LL库同样可以和stm32cubeMx配合起来。
最近用到定时器,就把基于LL库如何使用定时器做个总结。我使用的是stm32F031K6的芯片,有的系列st的LL库可能还在更新之中。
首先就是把自己的stm32CubeMx升级为最新版本,确保已经集成了LL库。
定时器我用到两个:一个是tim17用来作为计数,10ms产生一次中断。 一个是tim3用来做pwm捕获输入。如下如所示:
![774c956b1137a24c66004cd6d6637c83.png](https://i-blog.csdnimg.cn/blog_migrate/a21fb504a99897d24b44a1802afe64fd.jpeg)
再看tim17的详细配置:(这个配置和使用HAL库的时候是一样的,记得要使能中断)
![188f99967dae9bd5aab6901192bedf62.png](https://i-blog.csdnimg.cn/blog_migrate/08aa66077dc20c688e1f3ec1adb9b955.jpeg)
![312169bef7708e7372d5e2055848a5c9.png](https://i-blog.csdnimg.cn/blog_migrate/5b6509509995da1a9bf2cac874d82a58.jpeg)
再看下tim3的配置,配置通道1作为捕获输入:
![ec059dd5e70910ec79d5fbaf486ac31f.png](https://i-blog.csdnimg.cn/blog_migrate/9ed1cde27adc135fe74bd5e4427b98bc.jpeg)
![819493a0200233a8a20acd8923381d81.png](https://i-blog.csdnimg.cn/blog_migrate/636226cfc335862383fe50277423aa45.jpeg)
这样配置好以后生成代码。LL库就不想HAL库封装的那么好,函数接口也不一样。所以想让定时器运行就需要深入看一下定时器的参考手册部分。
定时器17启动的以及中断函数代码如下:
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捕获功能的代码如下:
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);}}