Performance 更新ARR和CCR1延迟功能返回6us
我需要使用stm32f401改变pwm的频率和占空比。 在“pulse finished”pwm回调中,我尝试了以下代码Performance 更新ARR和CCR1延迟功能返回6us,performance,timer,stm32,pwm,Performance,Timer,Stm32,Pwm,我需要使用stm32f401改变pwm的频率和占空比。 在“pulse finished”pwm回调中,我尝试了以下代码 HAL_GPIO_WritePin(LED5_PORT, LED5_PIN, GPIO_PIN_RESET); //tentative 1 //TIM9->ARR = round(value); //TIM9->CCR1 = round(value) * 0.2; //tentative 2 //htim9.Instance->ARR = round(va
HAL_GPIO_WritePin(LED5_PORT, LED5_PIN, GPIO_PIN_RESET);
//tentative 1
//TIM9->ARR = round(value);
//TIM9->CCR1 = round(value) * 0.2;
//tentative 2
//htim9.Instance->ARR = round(value);
//htim9.Instance->CCR1 = round(value) * 0.2;
//tentative 3
int *point = (int *) (TIM9_BASE + 0x2C);
*point = round(value);
int *point1 = (int *) (TIM9_BASE + 0x34);
*point1 = round(value) *0.2;
HAL_GPIO_WritePin(LED5_PORT, LED5_PIN, GPIO_PIN_SET);
在所有3种情况下,如果我用示波器测量LED5的开/关状态之间经过的时间量,则值为6us。
仅开/关状态为500ns。
这意味着我正在等待我的函数返回5.5us,只是为了分配这两个寄存器,所以我在性能频率方面受到限制
很明显,我有一个我没有看到的问题
有什么想法吗
问候
很明显,我有一个我没有看到的问题
当然,第一个也是最主要的一个——哈尔图书馆。使用裸寄存器代替
另一个-你使用双精度(不是浮点数)数字和数学函数-你的FPU不会帮你。任何计算都需要几十个时钟周期
因此,对于84MHz核心,HAL和双倍数字5us并不坏:D这是HAL吗?TIM9->CCR1=四舍五入(值)*0.2;?偶数TIM9->CCR1=1200;导致同样的问题我已经给了你答案。对时间敏感的例程意味着“没有HAL”。更敏感-从SRAM运行,甚至更多-在CCM和“正常”SRAM之间分割代码和数据抱歉,但我不明白,对我来说HAL是所有包含HAL的东西。HAL意味着巨大的开销。如果程序对时间敏感-避免HAL-使用寄存器对uC进行编程。我再也帮不了你了没有奇迹-大,“容易”,有缺陷,缓慢的库或更复杂但有效的硬件级编码。这是你的选择。@PeterJ:HAL在发帖时会考虑开销。