![shequ.stmicroelectronics.cn](./template/st_v1/static/img/logo2.png)
背景:使用定时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是内部连接的。 |
STM32H7电压
STM32的HAL库,如何对高八位和低八位同时赋值和操作?
STM32L4R9最大支持SD卡的容量是?支持SDXC 64G卡吗?
st-link V3 SWD 下载失败和UART TX方向失败
STM32h743ZIT6 与TMC5160进行SPI通信,在SCK结束后CSN结束前,MISO、MOSI信号电平存在缓慢下降过程的原因?
keil5为什么下载不了程序?板子上的指示灯亮着。
M24M02 响应时间
stm32H533 SPIDMA如何配置
stm32h743 lwip freertos socket建立失败多次后才能成功
NUCLEO H533RE 原理图在哪里可以下到
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. 这样是可行的。
多谢大佬,指点。问题已经解决了