STM32CubeMX | STM32使用HAL库进行脉冲宽度和周期测量


扫描以下二维码,关注公众号雍正不秃头获取更多STM32资源及干货!


使用芯片:STM32F103RCT6

思路:定时器设置为1MHZ的计数频率,定时计数器增加一就是增加1us

① 首先设置为上升沿捕获,捕获上升沿记录此刻的时间计数值;
② 然后切换为下降沿捕获,捕获下降沿记录此刻的时间计数值;
③ 最后设置为上升沿捕获,捕获上升沿记录此刻的时间计数值;

对于16bit定时器,最大可计数0xFFFF,也就是65535us,那么:高电平持续的时间 = 定时器溢出计数 * 0xFFFF + 当前计数值
对于32bit定时器,最大可计数0xFFFFFFFF,也就是4294.967295s,这个时间足够测量脉冲宽度的了,那么:高电平持续的时间 = 当前计数值

高电平持续的时间 = ② - ①
周期 = ③ - ①


定时器配置

设置定时器2的计数频率为1MHz,输入捕获使用通道一,也就是PA0引脚,将PA0引脚设置为下拉模式,目的是为了在空闲时间保持信号稳定:



中断分组设置


代码配置

tim.c中添加如下代码:


__IO uint32_t TIM2_TIMEOUT_COUNT = 0;          ///< 定时器2定时溢出计数
uint32_t TIM2_CAPTURE_BUF[3]   = {0, 0, 0};        ///< 分别存储上升沿计数、下降沿计数、下个上升沿计数
__IO uint8_t TIM2_CAPTURE_STA = 0xFF;          ///< 状态标记/*** 设置TIM2输入捕获极性* @param TIM_ICPolarity:*        TIM_INPUTCHANNELPOLARITY_RISING  :上升沿捕获*        TIM_INPUTCHANNELPOLARITY_FALLING :下降沿捕获*        TIM_INPUTCHANNELPOLARITY_BOTHEDGE:上升沿和下降沿都捕获*/
inline void TIM2_SetCapturePolarity(uint32_t TIM_ICPolarity)
{htim2.Instance->CCER &= ~(TIM_CCER_CC1P | TIM_CCER_CC1NP);htim2.Instance->CCER |= (TIM_ICPolarity & (TIM_CCER_CC1P | TIM_CCER_CC1NP));
}/// 定时器2时间溢出回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if (htim->Instance == htim2.Instance){TIM2_TIMEOUT_COUNT++;                                     // 溢出次数计数}
}///< 输入捕获回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{if (htim->Instance == htim2.Instance){switch (TIM2_CAPTURE_STA){case 1:{printf("准备捕获下降沿...\r\n");TIM2_CAPTURE_BUF[0] = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1) + TIM2_TIMEOUT_COUNT * 0xFFFF;TIM2_SetCapturePolarity(TIM_INPUTCHANNELPOLARITY_FALLING);                    // 设置为下降沿触发TIM2_CAPTURE_STA++;break;}case 2:{printf("准备捕获下个上升沿...\r\n");TIM2_CAPTURE_BUF[1] = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1) + TIM2_TIMEOUT_COUNT * 0xFFFF;TIM2_SetCapturePolarity(TIM_INPUTCHANNELPOLARITY_RISING);                  // 设置为上升沿触发TIM2_CAPTURE_STA++;break;}case 3:{printf("捕获结束...\r\n");printf("# end ----------------------------------------------------\r\n");TIM2_CAPTURE_BUF[2] = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1) + TIM2_TIMEOUT_COUNT * 0xFFFF;HAL_TIM_IC_Stop_IT(htim, TIM_CHANNEL_1);                                 // 停止捕获HAL_TIM_Base_Stop_IT(&htim2);                                                // 停止定时器更新中断TIM2_CAPTURE_STA++;break;}default:break;}}
}///< TIM2轮训状态切换
inline void TIM2_Poll(void)
{switch (TIM2_CAPTURE_STA){case 0:{printf("# start ----------------------------------------------------\r\n");printf("准备捕获上升沿...\r\n");TIM2_TIMEOUT_COUNT = 0;__HAL_TIM_SET_COUNTER(&htim2, 0);                                            // 清除定时器2现有计数memset(TIM2_CAPTURE_BUF, 0, sizeof(TIM2_CAPTURE_BUF));                     // 清除捕获计数TIM2_SetCapturePolarity(TIM_INPUTCHANNELPOLARITY_RISING);                  // 设置为上升沿触发HAL_TIM_Base_Start_IT(&htim2);                                               // 启动定时器更新中断HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);                                 // 启动捕获中断TIM2_CAPTURE_STA++;break;}case 4:{uint32_t high  = TIM2_CAPTURE_BUF[1] - TIM2_CAPTURE_BUF[0];uint32_t cycle = TIM2_CAPTURE_BUF[2] - TIM2_CAPTURE_BUF[0];float frq = 1.0 / (((float)cycle) / 1000000.0);TIM2_CAPTURE_STA++;printf("\r\n\r\n");printf("################################# START #########################################\r\n");printf("高电平持续时间:%dms\r\n", high / 1000);printf("周期          :%dms\r\n", cycle / 1000);printf("频率          :%fHz\r\n", frq);printf("################################## END ##########################################\r\n\r\n");break;}default:break;}
}

main.c:

int main()
{HAL_Init();SystemClock_Config();MX_GPIO_Init();DEBUG_UART_Init();MX_TIM2_Init();printf("================================ 系统运行! ================================  \r\n");while(1){TIM2_Poll();DEBUG_UART_RecvHandler();}
}

说明:串口一接串口调试助手,勾选发送新行,向单片机发送任意字符以此来启动输入捕获。


ends…

STM32CubeMX | STM32使用HAL库进行脉冲宽度和周期测量相关推荐

  1. 【STM32】HAL库 STM32CubeMX教程十五---FMC-SDRAM(二)

    前言: 本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 上一讲我们说了CubeMX配置SDRAM的一些基本配置,还有FMC跟SDRAM的讲解,这一讲我们 ...

  2. 【STM32】HAL库 STM32CubeMX教程十五---FMC-SDRAM(一)

    前言: 本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 本文 1首先讲解什么是FMC及SDRAM,W9825G6KH芯片原理,2基于CubeMx创建工程 ...

  3. 【STM32】HAL库 STM32CubeMX教程十四---SPI

    前言: 本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 在我们的HAL库中,对硬件SPI函数做了很好的集成,使得之前SPI几百行代码,在HAL库中,只需 ...

  4. 【STM32】HAL库 STM32CubeMX教程十一---DMA (串口DMA发送接收)

    前言: 本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1.芯片: STM32F407ZET6/ STM32F103ZET6 ...

  5. 【STM32】HAL库 STM32CubeMX教程十---DAC

    前言: 本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1.芯片: STM32F407ZET6/ STM32F103ZET6 ...

  6. 【STM32】HAL库 STM32CubeMX教程九---ADC

    前言: 本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1.芯片: STM32F407ZET6/ STM32F103ZET6 ...

  7. STM32CubeMX | 基于STM32使用HAL库硬件SPI驱动WK2124一拖四SPI转四路串口芯片

    STM32CubeMX | 基于STM32使用HAL库硬件SPI驱动WK2124一拖四SPI转四路串口芯片 STM32基础工程生成 首先使用STM32CUBEMX生成STM32的基础工程,配置时钟到7 ...

  8. 【STM32】HAL库 STM32CubeMX教程十二---IIC(读取AT24C02 )

    前言: 本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 在之前的标准库中,STM32的硬件IIC非常复杂,更重要的是它并不稳定,所以都不推荐使用. 但是 ...

  9. STM32CubeMX | 基于STM32使用HAL库实现USB组合设备之多路CDC

    STM32CubeMX | 基于STM32使用HAL库实现USB组合设备之多路CDC 本博客完整代码下载地址:https://download.csdn.net/download/qq15347150 ...

最新文章

  1. 01 | 顶层设计:微服务生态与 Spring Cloud Alibaba
  2. 浪迹天涯的骨灰级开源爱好者——对话阿里云MVP吴晟
  3. ZStack常见问题
  4. 织梦DedeCMS使用SQL批量替换文章标题内容
  5. Linux LVM管理
  6. 四、 vSphere 6.7 U1(四):部署VCSA
  7. python爬虫淘宝评论_Python爬虫,抓取淘宝商品评论内容
  8. c++做的免费游戏狼人杀
  9. Java九阳神功--BP神经网络JAVA代码解析
  10. ACMjava杨辉三角形与二项式定理递推实现与组合实现
  11. Excel查找字符串下标(findsearch)
  12. 【光流评估】《Optical Flow Estimation using a Spatial Pyramid Network》2016 Tubingen, Germany
  13. 爬取豆瓣图书排行榜前十并使用图表的形式展示
  14. pyserial_API函数说明
  15. corn表达式的使用
  16. 关于stdlib头文件
  17. 慧静51单片机软件_MCS-51单片机程序求极值
  18. 以数字孪生为基础,构建机房智慧化管理新环境
  19. 多读多写是提高写作水平的重要保证
  20. Java计算机毕业设计大学生体检管理系统源码+系统+数据库+lw文档

热门文章

  1. 数据标准化方法论思考总结
  2. windows11的便签在哪里,详细教您使用win11便签功能
  3. VS/Qt C++ 入门项目飞机大战(内含全部源代码,素材,项目工程,项目祥解)可直接运行
  4. RocketMQ(四)——消息重试
  5. 【计算机二级Python】模拟试卷第6套选择题
  6. U-Boot操作Flash (NOR, NAND SPI)
  7. 小技巧: 通过cert-rotate将新节点添加到K8S集群
  8. 总监和总监不一样,看管理人数
  9. 【英语演讲】Informative Speech
  10. 同样被腾讯微信“供养”,唯品会蘑菇街却与京东拼多多背道而驰