在调试定时器产生高频的方波的时候,我使用的方法时在定时器里直接翻转,设置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)循环。 |
盘古UE-STM32F407工控板原理图
STM32F407 定时器触发DMA 求助大神
【MCU实战经验】基于STM32F407的音频播放器设计
【STM32F429心得\疑问】+STM32F4之FSMC和FMC
STM32F429读取IO口传输的数据速率
STM32F407ZGT6 手摸芯片背部重启
STM32F4 SPI 动作时,软件片选信号被拉高,IO口程序逻辑失控
STM32F401RE NUCLEO求助,串口一直不能进中断
读取STM32F407内部温度传感器值错误
STM32F429多路内部ADC独立采集的办法
正确的做法是用定时器直接硬件反转某个GPIO,或者用SPI的Clock线,没做过,不保证一定可以。
正确的做法是通过定时器的输出PWM信号 用引脚复用的方法 直接输出PWM信号 脉宽 频率都可以控制
定时器硬件翻转是指的PWM吗,SPI那个方案好像不行 我要两个高频的频率波,而且要来回切换(11~12Mhz,12~13Mhz),好像用SPI的时钟不太行,SPI的时钟是保持固定频率的,要频繁切换也要配置寄存器
现在最大的问题就是要两个高频的方波来回切换(11~12Mhz,12~13Mhz),这两个方波如果用PWM 占空比是百分之五十是分不出来这两个频率段的方波的,所以才选择的定时器进中断,频繁软件写寄存器翻转io,现在想法是要不能找到进中断耗时的那段操作进行优化,要不然只能再选高频率的mcu了
记得以前看过阿莫论坛的测试,,STM32 IO最高的翻转频率好像是4M左右,,F1的单片机。
这种用高频MCU也没有用 这不是频率不够 是进出中断时间太长
可以试一下在主函数中跑 Nop指令控延时 看一下最高能输出多少频率 关闭所有中断 运行最高主频 用寄存器写函数 不要用库函数
还是达不到要求就用FPGA吧 成本高点 最后的希望
io用f4来做确实在高频率的时候有问题,在主函数中直接while(1)循环里也是不行的,达不到这么高的频率,而且是直接操作寄存器的方式来做的也不行,实在不行只能在性能上有所取舍了,用pwm是可以做到高频率的,但是分不出来我想要的频率,实在不行只能取一半了
最开始就是不想频繁进中断,所以选择在主函数中用nop延时,但是就不好控制频率,只能达到几个固定的频率了,所以才选择频繁进定时器的方式来实现的,现在只有降一点频率了,看看能不能得到产品的性能要求了,如果不能确实只能换方案了,推倒重来还是有点麻烦所以想把能试的方式都看看,实在不行确实只能改方案了。。。
1.目前的问题还没有解决,定时器直接分出来的频率如果较高的话不能直接用操作寄存器翻转io得到方波,如果速度过快,我的理解是有寄存器的操作,比进中断的时间要长,无法达到想要的频率(这个只是我的理解,如果有问题希望指出),并且在高频的时候波形还有点失真;
2.如果用pwm的话,由于我要输出方波,占空比必须是百分之五十,而周期数要得到我想要的频率要有奇数的分频,没法分;
3.最终用的是output compare的方式(toggle on match),得到了一个一半频率的翻转方波,并且可以切换且相位连贯的波形;
如有问题希望能帮忙指出,也可以学习学习~