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

STM32F407定时器低频时对的,设置成高频就有问题了

[复制链接]
xiangnan949 提问时间:2020-8-27 17:54 /
在调试定时器产生高频的方波的时候,我使用的方法时在定时器里直接翻转,设置4M的方波时候频率是对的,但是再高频率就不是按照分频的比例来了,这种问题可能时由于什么原因导致的呢?还是本身stm32就不能支持这么十几兆的软件控制翻转呢、还有顺便请教一下,大家之前测过能道道最高的翻转频率是多少呢
没有人有更好的方法我就结帖:
1.目前的问题还没有解决,定时器直接分出来的频率如果较高的话不能直接用操作寄存器翻转io得到方波,如果速度过快,我的理解是有寄存器的操作,比进中断的时间要长,无法达到想要的频率(这个只是我的理解,如果有问题希望指出),并且在高频的时候波形还有点失真;
2.如果用pwm的话,由于我要输出方波,占空比必须是百分之五十,而周期数要得到我想要的频率要有奇数的分频,没法分;
3.最终用的是output compare的方式(toggle on match),得到了一个一半频率的翻转方波,并且可以切换且相位连贯的波形;
如有问题希望能帮忙指出,也可以学习学习~

这个是我TIM1的初始化函数:
/* TIM1 init function */
void MX_TIM1_Init(void)
{
  TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};


  htim1.Instance = TIM1;
  htim1.Init.Prescaler = 1-1;
  htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim1.Init.Period = 14-1;
  htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim1.Init.RepetitionCounter = 0;
  htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
  {
    Error_Handler();
  }
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }


}



这个是中断处理函数
void TIM1_UP_TIM10_IRQHandler(void)
{
  /* USER CODE BEGIN TIM1_UP_TIM10_IRQn 0 */
        
  if (__HAL_TIM_GET_FLAG(&htim1, TIM_FLAG_UPDATE) != RESET)
  {
    __HAL_TIM_CLEAR_IT(&htim1, TIM_IT_UPDATE);
    if ((GPIOB->ODR & 0x1000) == 0x1000)
   {
       GPIOB->BSRR = 0x10000000; //PB12
   }
   else
   {
       GPIOB->BSRR = 0x1000;//PB12
    }
  }

main函数就是while(1)循环。




收藏 评论9 发布时间:2020-8-27 17:54

举报

9个回答
radio2radio 回答时间:2020-8-27 21:51:43
F407的时钟是168MHz,不算高。用软件很难出到十几MHz的。
正确的做法是用定时器直接硬件反转某个GPIO,或者用SPI的Clock线,没做过,不保证一定可以。
mylovemcu 回答时间:2020-8-28 09:56:58
输出这么高的频率不可以通过配置引脚寄存器输出  也不能通过中断进行配置  因为进出中断和配置寄存器太耗时间  会导致不能正常输出电平
正确的做法是通过定时器的输出PWM信号  用引脚复用的方法  直接输出PWM信号  脉宽 频率都可以控制
xiangnan949 回答时间:2020-8-28 10:16:32
radio2radio 发表于 2020-8-27 21:51
F407的时钟是168MHz,不算高。用软件很难出到十几MHz的。
正确的做法是用定时器直接硬件反转某个GPIO,或者 ...

定时器硬件翻转是指的PWM吗,SPI那个方案好像不行 我要两个高频的频率波,而且要来回切换(11~12Mhz,12~13Mhz),好像用SPI的时钟不太行,SPI的时钟是保持固定频率的,要频繁切换也要配置寄存器
xiangnan949 回答时间:2020-8-28 10:19:41
mylovemcu 发表于 2020-8-28 09:56
输出这么高的频率不可以通过配置引脚寄存器输出  也不能通过中断进行配置  因为进出中断和配置寄存器太耗时 ...

现在最大的问题就是要两个高频的方波来回切换(11~12Mhz,12~13Mhz),这两个方波如果用PWM 占空比是百分之五十是分不出来这两个频率段的方波的,所以才选择的定时器进中断,频繁软件写寄存器翻转io,现在想法是要不能找到进中断耗时的那段操作进行优化,要不然只能再选高频率的mcu了
小小超 回答时间:2020-8-28 10:34:18
IO口不支持这么高的翻转频率吧,定时器肯定没问题的。频率太高的话,最好用PWM的方式。
记得以前看过阿莫论坛的测试,,STM32 IO最高的翻转频率好像是4M左右,,F1的单片机。
mylovemcu 回答时间:2020-8-29 08:14:39
xiangnan949 发表于 2020-8-28 10:19
现在最大的问题就是要两个高频的方波来回切换(11~12Mhz,12~13Mhz),这两个方波如果用PWM 占空比是百分之 ...

这种用高频MCU也没有用  这不是频率不够 是进出中断时间太长
可以试一下在主函数中跑  Nop指令控延时  看一下最高能输出多少频率  关闭所有中断  运行最高主频  用寄存器写函数  不要用库函数
还是达不到要求就用FPGA吧  成本高点  最后的希望
xiangnan949 回答时间:2020-8-30 12:04:07
ts2000 发表于 2020-8-28 10:34
IO口不支持这么高的翻转频率吧,定时器肯定没问题的。频率太高的话,最好用PWM的方式。
记得以前看过阿莫论 ...

io用f4来做确实在高频率的时候有问题,在主函数中直接while(1)循环里也是不行的,达不到这么高的频率,而且是直接操作寄存器的方式来做的也不行,实在不行只能在性能上有所取舍了,用pwm是可以做到高频率的,但是分不出来我想要的频率,实在不行只能取一半了
xiangnan949 回答时间:2020-8-30 12:10:10
mylovemcu 发表于 2020-8-29 08:14
这种用高频MCU也没有用  这不是频率不够 是进出中断时间太长
可以试一下在主函数中跑  Nop指令控延时  看 ...

最开始就是不想频繁进中断,所以选择在主函数中用nop延时,但是就不好控制频率,只能达到几个固定的频率了,所以才选择频繁进定时器的方式来实现的,现在只有降一点频率了,看看能不能得到产品的性能要求了,如果不能确实只能换方案了,推倒重来还是有点麻烦所以想把能试的方式都看看,实在不行确实只能改方案了。。。
xiangnan949 回答时间:2020-9-2 09:25:01
没有人有更好的方法我就结帖:
1.目前的问题还没有解决,定时器直接分出来的频率如果较高的话不能直接用操作寄存器翻转io得到方波,如果速度过快,我的理解是有寄存器的操作,比进中断的时间要长,无法达到想要的频率(这个只是我的理解,如果有问题希望指出),并且在高频的时候波形还有点失真;
2.如果用pwm的话,由于我要输出方波,占空比必须是百分之五十,而周期数要得到我想要的频率要有奇数的分频,没法分;
3.最终用的是output compare的方式(toggle on match),得到了一个一半频率的翻转方波,并且可以切换且相位连贯的波形;
如有问题希望能帮忙指出,也可以学习学习~
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版