完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
本文章基于国信长天M4开发板,讲述了STM32G4 定时器TIM输入捕获频率测量的应用,祝各位学生蓝桥杯比赛取得好成绩!
M4开发板 频率发生器部分原理图 由上图可以看出,开发板上配置了两个555作为频率发生器,通过可调电阻R39,R40可调节输出频率,两个输出引脚分别连接在PA15和PB4引脚上。查阅芯片资料,可以得知这两个引脚可用作以下定时器的输入捕获: PA15 --> TIM2_CH1 PB4 --> TIM3_CH1 TIM 输入捕获 使用步骤 下面将基于硬件原厂提供的显示屏示例代码:HAL_06_LCD 介绍ADC的使用步骤: ① 添加 stm32g4xx_hal_tim.c,stm32g4xx_hal_tim_ex.c 双击Drivers/STM32G4xx_HAL_Driver,打开添加文件对话框,在向上一级 -> Drivers -> STM32G4xx_HAL_Driver -> Src中,找到stm32g4xx_hal_tim.c 和 stm32g4xx_hal_tim_ex.c 并添加。添加后如下图所示: ② 修改 stm32g4xx_hal_conf.h 文件 在如下位置找到该文件,并打开: 取消注释 #define HAL_TIM_MODULE_ENABLED 这一行,取下注释后如下图所示: ③ main.c 添加#include "stm32g4xx_hal_tim.h" 在 main.c 适当位置添加#include "stm32g4xx_hal_tim.h",添加后如下图所示: ④ 复制如下 TIM 初始化的代码 注意:下列代码包含了TIM2_CH1和TIM3_CH1的初始化,同学们按需复制! TIM_HandleTypeDef htim2,htim3; uint32_t cc1_value_2 = 0; uint32_t f40_2 = 0, f40_3 = 0; //分别用来存储TIM2_CH1和TIM3_CH1的捕获频率 void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { cc1_value_2 = __HAL_TIM_GET_COUNTER(htim); __HAL_TIM_SetCounter(htim,0); HAL_TIM_IC_Start_IT(htim, TIM_CHANNEL_1); //启动频率捕获 if(htim == &htim2) { f40_2 = 1000000/cc1_value_2; } if(htim == &htim3) { f40_3 = 1000000/cc1_value_2; } } static void MX_TIM2_Init(void) //定时器2输入捕获初始化 { TIM_MasterConfigTypeDef sMasterConfig = {0}; TIM_IC_InitTypeDef sConfigIC = {0}; GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_TIM2_CLK_ENABLE(); htim2.Instance = TIM2; htim2.Init.Prescaler = 80; htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 0xFFFF; htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; HAL_TIM_IC_Init(&htim2); sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig); sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING; sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI; sConfigIC.ICPrescaler = TIM_ICPSC_DIV1; sConfigIC.ICFilter = 0; HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_1); GPIO_InitStruct.Pin = GPIO_PIN_15; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; //复用推挽输出 GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF1_TIM2; //复用为定时器2 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); //初始化PA15 HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0); HAL_NVIC_EnableIRQ(TIM2_IRQn); HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);//启动定时器2 } void TIM2_IRQHandler(void) //定时器2中断 { HAL_TIM_IRQHandler(&htim2); } static void MX_TIM3_Init(void) //定时器3输入捕获初始化 { TIM_MasterConfigTypeDef sMasterConfig = {0}; TIM_IC_InitTypeDef sConfigIC = {0}; GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_TIM3_CLK_ENABLE(); htim3.Instance = TIM3; htim3.Init.Prescaler = 80; htim3.Init.CounterMode = TIM_COUNTERMODE_UP; htim3.Init.Period = 0xFFFF; htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; HAL_TIM_IC_Init(&htim3); sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig); sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING; sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI; sConfigIC.ICPrescaler = TIM_ICPSC_DIV1; sConfigIC.ICFilter = 0; HAL_TIM_IC_ConfigChannel(&htim3, &sConfigIC, TIM_CHANNEL_1); //使用通道1 GPIO_InitStruct.Pin = GPIO_PIN_4; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; //复用输出模式 GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF2_TIM3; //复用为定时器3 HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); //初始化PA15 HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0); HAL_NVIC_EnableIRQ(TIM3_IRQn); HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_1); //启动定时器3 } void TIM3_IRQHandler(void) //定时器3中断函数 { HAL_TIM_IRQHandler(&htim3); } ⑤ 在main() 中调用 MX_TIM2_Init(); , MX_TIM3_Init(); 如下图所示,在main() 函数的适当位置调用 MX_TIM2_Init(); , MX_TIM3_Init(); ⑥ 获取捕获的频率 在main() 的while()中插入如下代码: char buf[64] = {0}; sprintf(buf , "TIM2(R40): %d Hz", f40_2); LCD_DisplayStringLine(Line8, (uint8_t *)buf); sprintf(buf , "TIM3(R39): %dHz", f40_3); LCD_DisplayStringLine(Line9, (uint8_t *)buf); HAL_Delay(100); ⑦ 运行效果图 总结 TIM 定时器输入捕获 使用步骤总结如下:
|
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1614 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1541 浏览 1 评论
970 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
682 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1592 浏览 2 评论
1863浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
644浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
515浏览 3评论
531浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
504浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-21 21:42 , Processed in 0.647969 second(s), Total 47, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号