
背景:使用定时5为主定时器,定时器3为从定时器;定时器2为ETR。 主要目的是1:产生指定个数得脉冲后,停止输出,打印ETR定时器计数。 STM32CubeMx配置: 1、定时器5 定时器3配置: 定时2配置 现象:设置的是产生100个脉冲,实际ETR计数打印2000; 函数配置: 主函数 printf("sys init"); HAL_TIM_CLEAR_FLAG(&htim2, TIM_FLAG_UPDATE); HAL_TIM_Base_Start(&htim2); HAL_TIM_SET_AUTORELOAD(&htim3,pwmNumTable[1]); //设置要输出的PWM脉冲数 PwmNum个 HAL_TIM_PWM_Start(&htim5, TIM_CHANNEL_2); //启动主定时器PWM输出 HAL_TIM_Base_Start_IT(&htim3); //启动从定时器 while (1) { __HAL_TIM_SET_AUTORELOAD(&htim3,100); //设置要输出的PWM脉冲数 HAL_TIM_Base_Start_IT(&htim3); //启动从定时器 HAL_TIM_PWM_Start(&htim5, TIM_CHANNEL_2); //启动主定时器PWM输出1; HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5); printf("i=%d cnt=%d",i,TIM2->CNT); TIM2->CNT = 0; HAL_Delay(1000); / USER CODE END WHILE / / USER CODE BEGIN 3 / } 中断配置: void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim == &htim3) { if(__HAL_TIM_GET_FLAG(&htim3, TIM_FLAG_CC2) != RESET) //判断是否触发中断 { __HAL_TIM_CLEAR_FLAG(&htim3, TIM_FLAG_CC2); //清除中断标志 HAL_TIM_PWM_Stop(&htim5, TIM_CHANNEL_2); //关闭主定时器 HAL_TIM_Base_Stop_IT(&htim3); //关闭从定时器 } } } 大佬,求助? 定时2和定时器5是内部连接的。 |
型号替代-STM32H5
正点原子阿波罗H743使用DMA2D后普通刷出现问题
STM32H7系列RMII用于TCP/IP 服务器
STM32 OCTOSPI 读取 ICNA3306 显示屏 ID 失败,求助;
两个TIM调用HAL_TIM_PeriodElapsedCallback发生冲突
STM32H745I-DISCO的GUI DEMO演示。
关于GFX软件下载汇报
touchgfx 4.14版本
STM32STM32H745I demo板演示,以及点灯
关于STM32H745I demo板,M7下载正常,M4下载报错?请问是怎么回事
TIM5 TIM3均以内部时钟作为计数时钟源,二者的主从关系通过TIM5触发启动TIM3来体现。
TIM2以外部ETR信号作为计数时钟源 。
那么TIM2的ETR信号最终源于哪里?没看明白你TIM2在这里具体做什么用。它跟TIM5 TIM3有关联吗?
另外提醒下,TIM3被TIM5的更新事件触发启动后,就一直是计数工作状态,即启动一次就好了。
你现在希望实现指定脉冲个数的输出,具体想怎么实现?能说详细点吗?
如果只是想输出指定个数的PWM脉冲的话,使用带RCR寄存器的TIMER最快捷、简单,
每次基于更新事件中断停止输出即可。当然,还有其它方式,比方定时器事件+DMA.
1、ETR2主要用于检测TIM5计数的脉冲个数;
2、计数脉冲个数得原理就是:
利用主定时器(TIM5产生脉冲)产生脉冲个数,使用从定时器检测脉冲个数(主定时器产生更新事件,触发从定时器计数,当从定时器计算到对应的脉冲个数就产生中断;然后关闭主定时器和从定时器)
有一点你没明确出来,就是TIM2的ETR信号来自哪里,我猜测你来自TIM5的PWM输出吧。这样也可以。
那么现在的流程就是:
主TIM5产生PWM输出给到TIM2的ETR2, TIM2基于ETR进行计数,记到相应数据后产生中断(这个数据可以设置为TIM2的ARR值),然后在中断里
关闭TIM5和TIM3. 这样是可行的。
多谢大佬,指点。问题已经解决了