Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 更新ARR和CCR1延迟功能返回6us_Performance_Timer_Stm32_Pwm - Fatal编程技术网

Performance 更新ARR和CCR1延迟功能返回6us

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

我需要使用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(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在发帖时会考虑开销。