你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32H533RE使用主从定时器产生指定脉冲个数,使用其他定时器进行ETR计数,计数不对?大佬们帮忙看看。

[复制链接]
星海灿烂 提问时间:2024-8-4 09:40 / 已解决

背景:使用定时5为主定时器,定时器3为从定时器;定时器2为ETR。

主要目的是1:产生指定个数得脉冲后,停止输出,打印ETR定时器计数。

STM32CubeMx配置:

1、定时器5

image.png

定时器3配置:

image.png

定时2配置

image.png

现象:设置的是产生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是内部连接的。

image.png

收藏 评论4 发布时间:2024-8-4 09:40

举报

4个回答
xmshao 回答时间:2024-8-5 10:46:50
从你的配置来看,TIM5工作在主模式,其更新事件作为触发输出,该触发信号又作为TIM3的启动信号。


TIM5 TIM3均以内部时钟作为计数时钟源,二者的主从关系通过TIM5触发启动TIM3来体现。


TIM2以外部ETR信号作为计数时钟源 。


那么TIM2的ETR信号最终源于哪里?没看明白你TIM2在这里具体做什么用。它跟TIM5 TIM3有关联吗?


另外提醒下,TIM3被TIM5的更新事件触发启动后,就一直是计数工作状态,即启动一次就好了。


你现在希望实现指定脉冲个数的输出,具体想怎么实现?能说详细点吗?


如果只是想输出指定个数的PWM脉冲的话,使用带RCR寄存器的TIMER最快捷、简单,


每次基于更新事件中断停止输出即可。当然,还有其它方式,比方定时器事件+DMA.
星海灿烂 回答时间:2024-8-6 09:28:08

xmshao 发表于 2024-8-5 10:46
从你的配置来看,TIM5工作在主模式,其更新事件作为触发输出,该触发信号又作为TIM3的启动信号。</p>
<p>

1、ETR2主要用于检测TIM5计数的脉冲个数;

2、计数脉冲个数得原理就是:

利用主定时器(TIM5产生脉冲)产生脉冲个数,使用从定时器检测脉冲个数(主定时器产生更新事件,触发从定时器计数,当从定时器计算到对应的脉冲个数就产生中断;然后关闭主定时器和从定时器)

xmshao 回答时间:2024-8-6 11:22:38
大致明白你的意思和需求了。


有一点你没明确出来,就是TIM2的ETR信号来自哪里,我猜测你来自TIM5的PWM输出吧。这样也可以。


那么现在的流程就是:
主TIM5产生PWM输出给到TIM2的ETR2, TIM2基于ETR进行计数,记到相应数据后产生中断(这个数据可以设置为TIM2的ARR值),然后在中断里


关闭TIM5和TIM3. 这样是可行的。
星海灿烂 回答时间:2024-8-6 23:08:04

xmshao 发表于 2024-8-6 11:22
大致明白你的意思和需求了。</p>
<p>

多谢大佬,指点。问题已经解决了

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版