我尝试为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);
}
1条答案
按热度按时间eaf3rand1#
在STM32上实现微秒级延迟的一种更简单的方法是将定时器配置为1us周期,然后读取其计数器。您可以使用预分频器来给予正确的周期。例如,如果进入定时器的时钟为16 MHz,您需要将其除以16。您需要将预分频器设置为比该值小1,例如
您还可以将计时器设置为在其整个范围内计数-对于16位计时器,为0x 0 -0xffff:
你通常只是启动计时器运行并让它继续运行。要延迟,在开始时读取计数器,然后循环等待它增加足够的微秒来延迟。
STM32上的一些定时器是16位定时器(STM32 F030上的TIM 4...)您也不知道距离下一个“tick”有多近。仅等待计数器递增X意味着您在(X-1)和(X)微秒。如果您需要保证至少X微秒,请将延迟值加1。将所有这些加在一起,您可能会得到如下结果:
这应该可以正确科普任何延迟,最大延迟为0xFFFFFFFEu微秒。