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. HDU1053 Entropy 哈夫曼树
  2. Eclipse的ExtJs智能提示
  3. java web 购物车_java web开发之实现购物车功能
  4. linux fedora14 u盘运行,怎么把fedora 14 装进U盘里
  5. Vue项目实战01: vue里父传子 传事件(easy)
  6. 求根号m(巴比伦算法)
  7. php说明代码怎么写,代码怎么写 - 起步 - PHP基础 - KK的小故事
  8. STM32 IIC详解
  9. 数据分析来诠释,为了“鸡”出“牛蛙”,中国家长到底能有多拼!
  10. 人工智能全产业链深度透析--(综合)
  11. python打印所有的水仙花数_python使用循环打印所有三位数水仙花数的实例
  12. 苹果HTC专利战正酣: 逃离Android?
  13. ArcGIS | 01小技巧-矢量按某个字段重分类
  14. ak4495驱动linux源码,解码芯片由一片变成两片后——升级双AK4495S芯片的香榭丽舍一体机...
  15. Drupal view实现排序:未来升序,过去降序
  16. 物联网小试一下——使用阿里云控制Arduino套件灯的开关
  17. Microsoft Visio 2010 安装失败 安装界面闪退
  18. Java poi导入合并单元格的excel数据【最完整】附pom文件和excel截图
  19. 第三章-电阻式传感器
  20. Leetcode:NO.15 三数之和 夹逼

热门文章

  1. 基于JUnit4扩展老项目的UT框架且自动DI
  2. 软文 解决网 许怀哲 那些在APP刷榜的公司:为了融资 不刷也得刷
  3. Tomcat配置通过域名访问
  4. 三行情书计算机学院,各大学最美三行情书
  5. 有几万块钱做什么生意合适?小本生意介绍
  6. HTML之网页开发 (二):第一个网页、认识HTML、开发工具、HTML元素、注释编写
  7. 爬虫技术 ebay_“别让我等待” – eBay技术演讲的幻灯片
  8. 计算理论期末2022哈工大
  9. sqldeveloper修改jdk配置
  10. python编码终极版