如何在STM32CubeIDE中通过定时器给出给予微秒时基?

ioekq8ef  于 2023-10-15  发布在  其他
关注(0)|答案(1)|浏览(199)

下面是我的代码片段:

/* USER CODE BEGIN 4 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{

    static uint64_t count =0;
    HAL_GPIO_TogglePin(GPIOB, timer_out_Pin);
    count++;
    if(count == 1000000)
    {

        HAL_GPIO_TogglePin(led_GPIO_Port, led_Pin);
        count=0;
    }
}


/* USER CODE END 4 */

我想每微秒产生一个中断,我递增count变量。当count内部定时器回调函数变为1秒时,我想切换LED。但是LED大约每10秒而不是1秒切换一次。定时器时钟频率=32 MHZ预分频值=31,周期=0。

2hh7jdfx

2hh7jdfx1#

执行ISR(服务程序)lasts more than 32 clock cycles-在您的情况下,显然,大约320个周期。
ISR进入和退出需要12+12个周期。使用Cube/HAL而不完全使用编译器优化,很容易将这个数字增加到几百个,就像本例一样。
一个写得非常好的ISR执行上面的代码可能需要大约50-60个周期,所以即使这样也不足以满足32 MHz的时钟。即使这是一个具有> 100 MHz系统时钟的高端STM 32(其中FLASH延迟会进一步减慢执行速度和/或引入抖动),将大部分执行时间花费在这样的中断中也是不合理的。
探索其他方法来做你想做的事情。坚持使用硬件进行微秒级精度的操作(例如,在输出比较模式下使用定时器通道,也称为PWM或单脉冲)。如果您需要在软件中将某些事件计时在微秒内,请启动一个专用的计时器事件,并具有所需的持续时间(不要期望它是精确的)。
JW

相关问题