C语言 用于创建stm32库的处理数据结构

lstz6jyr  于 2022-12-11  发布在  其他
关注(0)|答案(1)|浏览(128)

我尝试为stm32创建一个库。我如何处理“delayus或delayms”)而不使用“DelayHandle_t *delay1”
我如何使用“myTicks”变量作为全局变量,因为我不能将此变量用于中断

void Delayus(uint8_t value,DelayHandle_t *delay1)
{
    //enable timer 4
    TIM4->CCR1 |= TIM_CR1_CNE;
    delay1->myTicks = 0;
    while(*(delay1->myTicks) < value);
    TIM4->CCR1 &= ~TIM_CR1_CNE;
}
void Deleyms(uint8_t value,DelayHandle_t *delay1)
{
    TIM4->CCR1 |= TIM_CR1_CNE;
    delay1->myTicks = 0;
    while(*(delay1->myTicks) < (value*1000));
    TIM4->CCR1 &= ~TIM_CR1_CNE;
}
void TIM4_IRQHandler()
{
    delay1->myTicks ++;
    TIM4->SR &= ~(TIM_SR_UIF);
}
eaf3rand

eaf3rand1#

在STM32上实现微秒级延迟的一种更简单的方法是将定时器配置为1us周期,然后读取其计数器。您可以使用预分频器来给予正确的周期。例如,如果进入定时器的时钟为16 MHz,您需要将其除以16。您需要将预分频器设置为比该值小1,例如

TIM4->PSC = 15; // Divide by 16, to get 1us period

您还可以将计时器设置为在其整个范围内计数-对于16位计时器,为0x 0 -0xffff:

TIME4->ARR = 0xFFFFu;

你通常只是启动计时器运行并让它继续运行。要延迟,在开始时读取计数器,然后循环等待它增加足够的微秒来延迟。
STM32上的一些定时器是16位定时器(STM32 F030上的TIM 4...)您也不知道距离下一个“tick”有多近。仅等待计数器递增X意味着您在(X-1)和(X)微秒。如果您需要保证至少X微秒,请将延迟值加1。将所有这些加在一起,您可能会得到如下结果:

void Delayus(uint32_t us)
{
    uint16_t start;
    uint32_t remaining = us + 1u; // Add one to guarantee 'at least' us

    start = TIM4->CNT;

    while (remaining > 0u)
    {
        uint16_t delay = (remaining > 0xFFFFu) ? 0xFFFFu : (uint16_t)remaining;
        uint16_t end;

        remaining -= delay;

        do {
            end = TIM4->CNT;
        } while ((end - start) < delay);

        start = end;
    }
}

这应该可以正确科普任何延迟,最大延迟为0xFFFFFFFEu微秒。

相关问题