背景:使用定时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是内部连接的。 |
ptp PPS输出
STM32的H5/U5系列处理器内置运放支持负压运算吗?比如输入-1V,放大倍数为2时输出-2V
STM32H750内部flash读写
尝试STM32H743 FLASH SWAP 实现IAP升级,出错了
STM32G030F6 ADC+DMA多通道非连续采样无法正常工作?
stm32f103的uac模式对usb接收的数据实时处理
使用Cubeprogrammer无法连接、连接G431和一块H750的板子可以连上但是连另外一块H750的板子和F407的板子就直接报错,这个应该如何解决。
RTC设置24小时制,在中午12点59到13点的时候会变成1点
FATFS到f_mount()卡死,求助,用的野火文件
最近使用STM32H563时用到了遇到程序编译时显示编译错误,原因是空间不够了,在不改变硬件的情况下有什么方法让空间变大吗
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. 这样是可行的。
多谢大佬,指点。问题已经解决了