定时器输入捕获
插播一条串口
之前学串口部分的时候,偷懒没学用printf()输出,今天要打印高电平持续时间的时候,直接重写了fputc函数。结果一直困在printf的死循环里出不来。找了半天发现居然是!!对printf重定向后,避免使用半主机模式而导致库函数程序无法运行,使用微库Micro LIB可以避免半主机模式,在keil中点击Options for Target…,勾选Use Micro LIB,点击OK即可。
勾选完这个选项之后,我们发现串口可以用printf()语句顺利的输出啦。
定时器捕获的原理
关于原理部分可以参考一篇博客链接: link。里面详细介绍了各个寄存器的作用。
代码实现
基本框架
首先定义四个变量,状态变化时的一个计数值、存储计数器的记录值、计数器溢出的个数和最后总的高电平的时间。
uint8_t TIM5_CH1_Edge=0; //状态变化时,计数值
uint32_t TIM5_CH1_VAL=0; //储存计数器的记录值
uint32_t TIM5_CH1_OVER=0; //计数器溢出的个数
uint32_t time; //高电平持续时间
然后在主函数前面打开定时器的中断以及打开输入捕获。
HAL_TIM_Base_Start_IT(&htim5);