下面是我的代码片段:
/* 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。
1条答案
按热度按时间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