简而言之,我想使用stm32计时器实现延迟功能,就像AVR微控制器“正常模式”中的计时器一样。有人可以帮忙吗?我只是在stm32数据表中找不到它!它仅支持PWM,输入捕捉,输出比较和一脉冲模式输出! N.B:我忘了提到我正在使用stm32F401微控制器
答案 0 :(得分:0)
为此您有一个非常特殊的计时器,称为SysTick。将其设置为每1ms溢出一次。在其处理程序中
static volatile uint32_t counter;
void SysTick_Handler(void)
{
counter++;
}
inline uint32_t __attribute__((always_inline)) GetCounter(void)
{
return counter;
}
void Dealy(uint32_t ms)
{
uint32_t tickstart = GetCounter();
while((GetCounter() - tickstart) < ms);
}
答案 1 :(得分:0)
如果您希望能够延迟短于毫秒的时间段 您可以将计时器设置为自动重载并使用内部时钟。 设置为计时器的内部时钟频率显示在立方体MX中 时钟标签。在我的NUCLEO-F446RE上,大多数计时器的频率为84MHz或42MHz。
默认情况下,计时器3的频率为42 MHz。 因此,如果我将预分频器设置为42,并将计数周期设置为最大(0xFFFF 如果是16位),我将拥有一个每微秒更改一次的循环时钟。
然后,我可以使用二进制补码数学的属性,简单地减去 从新到旧的时期。
void wait_us (int16_t delay) {
int16_t t1= htim3.Instance->CNT;
while (( htim3.Instance->CNT - t1 ) < delay) {
asm ("\t nop");
}
}
这是PIC18 C编码的古老技巧