Timer 在STM32中使用定时器实现延迟

Timer 在STM32中使用定时器实现延迟,timer,arm,delay,stm32,cortex-m,Timer,Arm,Delay,Stm32,Cortex M,简单地说,我想用stm32定时器实现一个延迟功能,就像AVR微控制器“正常模式”中的一样。有人能帮忙吗?我只是在stm32数据表中找不到!它只支持PWM、输入捕获、输出比较和单脉冲模式输出! 注意:我忘了提到我使用的是stm32F401微控制器你有一个非常特殊的定时器,叫做SysTick。设置为每1ms溢出一次。在它的处理器中 static volatile uint32_t counter; void SysTick_Handler(void) { counter++; } inl

简单地说,我想用stm32定时器实现一个延迟功能,就像AVR微控制器“正常模式”中的一样。有人能帮忙吗?我只是在stm32数据表中找不到!它只支持PWM、输入捕获、输出比较和单脉冲模式输出!
注意:我忘了提到我使用的是stm32F401微控制器

你有一个非常特殊的定时器,叫做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);
}
静态易失性uint32\t计数器;
void SysTick_处理器(void)
{
计数器++;
}
内联uint32_t_uuu属性_uuu((始终_内联))GetCounter(void)
{
返回计数器;
}
无效交易(uint32\u t ms)
{
uint32_t tickstart=GetCounter();
而((GetCounter()-tickstart)
为此,您有一个非常特殊的计时器,名为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);
}
静态易失性uint32\t计数器;
void SysTick_处理器(void)
{
计数器++;
}
内联uint32_t_uuu属性_uuu((始终_内联))GetCounter(void)
{
返回计数器;
}
无效交易(uint32\u t ms)
{
uint32_t tickstart=GetCounter();
而((GetCounter()-tickstart)
如果您希望能够延迟小于毫秒的时间段 您可以设置计时器自动重新加载并使用内部时钟。 设置到计时器的内部时钟频率显示在立方体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"); 
    }
}
无效等待(int16延迟){
int16_t t1=htim3.Instance->CNT;
while((htim3.Instance->CNT-t1)

这是PIC18 C编码中的一个老把戏,如果你想延迟少于毫秒的时间段 您可以设置计时器自动重新加载并使用内部时钟。 设置到计时器的内部时钟频率显示在立方体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"); 
    }
}
无效等待(int16延迟){
int16_t t1=htim3.Instance->CNT;
while((htim3.Instance->CNT-t1)

这是PIC18 C编码的老把戏

他们肯定有定时器,你可以像其他任何mcu一样简单地轮询或使用中断。你用的是什么具体的零件,stm32?在st.com上查一下,获取Pinot产品的数据表、参考手册或用户手册或其他他们称之为的东西。手册可能是通用的,描述了您没有的其他项目,从您的零件号和数据表或手册中,您可以知道您有哪些外围设备,包括计时器。所有这些都从数据表开始。大多数cortex ms都有一个定时器,以及arm逻辑的一部分,而不是st逻辑,你也可以轮询或中断它。它们肯定有定时器,你可以像其他mcu一样轮询或使用中断。你用的是什么具体的零件,stm32?在st.com上查一下,获取Pinot产品的数据表、参考手册或用户手册或其他他们称之为的东西。手册可能是通用的,描述了您没有的其他项目,从您的零件号和数据表或手册中,您可以知道您有哪些外围设备,包括计时器。所有这些都从数据表开始。大多数cortex ms中都有一个定时器,以及arm逻辑的一部分,而不是st逻辑,您也可以轮询或中断它。