
7.5 使用定时器捕获上升/下降沿 7.5.1 配置输入捕获中断引脚 点击“Timers”并选择“TIM2”-“Channel1”将定时器2的通道1选为“Input Capture dirct mode”,使其连接至开发板上的“KEY_UP”按钮。在下方的配置栏中将分频数设为480,得到1MHZ的频率,也就是1us记一次,点击“Counter Period”,再点击右边的齿轮设置,将表达形式设成Hex格式,再将“Counter Period”设置为0xffffffff,这样就支持32位的定时器输入捕获了(部分引脚达不到只能16位)。将捕获方式设为“UP”上升沿捕获,开启自动重置,并将最底下一栏滤波值改为8。 ![]() 在“ NVIC Settings”中将使能中断打开。 ![]() 同时进入“GPIO Settings”将该输入捕获引脚设为下拉,保证无信号时能稳定低电平。 ![]() 接着我们需要再设置一个定时器去隔3秒来统计定时器2捕获到的高电平数。 ![]() ![]() 将定时器4设为普通定时器来读取捕获数量,分频数为48000得到10KHZ频率,计数30000为3秒,同时开启自动重载防止溢出。同时在“NVIC Setting”中开启全局中断。 ![]() 7.5.2 配置串口传输数据 接下来对串口进行配置,将“USART1”打开。并开启USART1全局中断。 ![]() 同时进入“NVIC”中断时序管理页面中,将“USART1”的中断优先度取到3。 ![]() 同时找到PA9和PA10将它们设置为USART1的RXD和TXD引脚,方便USB读取。 ![]() 点击保存并生成代码。 7.5.3 配置定时器捕获代码 首先我们需要重新到“NVIC.h”中添加“usart.h”以及printf和定时器捕获函数的声名。 ![]() 接着到“NVIC.c”文件中添加一些用于储存定时器捕获的缓存变量,并在“NVIC_Init”函数中添加定时器4的初始化用于3秒反馈一次数值。 ![]() 同时添加新的“NVIC_Catch”函数用于在main函数中开启定时器中断并反馈数值。 ![]() 在定时器反馈函数“HAL_TIM_PeriodElapsedCallback”中添加定时器4的反馈值,使其3秒向串口传输一次数据。 接着再添加一个输入捕获到上升沿的回调函数“HAL_TIM_IC_CaptureCallback”用于对捕获的上升沿信息进行处理并储存至缓存数组中。 ![]() 最后别忘了在Main函数中添加”NVIC_Catch”。 ![]() 将程序烧录 至单片机后,将USB MINI线从ST-Link拔下来并连接串口。 由于选用的定时器2通道1串联了按键至3.3V,因此在打开串口后,按“KEY_UP”按键即可手动制造一个上升沿给单片机,并在串口中显示出来。 ![]() ![]() 7.5.4 定时器捕获函数介绍 __HAL_TIM_SET_CAPTUREPOLARITY不是函数,而是底层操作的一个宏定义 在stm32H7xx_hal_tim.h文件中找到。其作用是修改定时器某一通道的输入捕获极性 ![]() 其中有两个函数,第一个为清除清除原来的捕获极性,第二个为设置通道捕捉极性 等价于: TIM_RESET_CAPTUREPOLARITY(&TIM2_Handler,TIM_CHANNEL_1); //清除原来的捕获极性 TIM_SET_CAPTUREPOLARITY(&TIM2_Handler,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);//定时器5通道1设置为下降沿捕获(重设捕获极性) 在修改定时器某一通道的输入捕获极性时,一定要先清除该通道之前捕获极性 __HAL_TIM_GET_COMPARE也是一个宏定义。 在stm32H7xx_hal_tim.h文件中找到。其作用是获取定时器某一通道的捕获寄存器值 ![]() 等价于 : HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1); 两者都是直接读取对应CCRx寄存器的值。附上程序源码:
|
基于定时器捕获测量脉宽的应用示例
狂欢三】STM32C031使用TIM定时器DMA方式实现WS2812彩灯输出(三)
【狂欢三】STM32C031使用TIM定时器DMA方式实现PWM输出(二)
【狂欢三】STM32C031使用TIM定时器PWM输出
stm32使用定时器触发dma传输,启动dma没反应的几种情况的解决方法
定时器剩余通道是否可以做PWM输出呢?
基于STM32双定时器+ADC+DMA实战经验分享
基于STM32的定时器触发ADC时可能遇到的情形
【NUCLEO-U545RE-Q评测】5. 基本计时器
基于STM32的定时器不按设定超时产生中断