SWM181利用SysTick定时器配置延时函数
🚩在使用过程中发现,当延时时间一次性设置超过350ms
就出问题,有可能是定时器计数值溢出造成的,在调用延时函数时,设定的延时函数的形参大于350
时,会出问题,为例不让定时计数器溢出,如果需要更长时间的延时可以多调用几次延时函数进行延时累加。
🛠延时相关函数配置
void SysTick_Init(uint32_t ticks)
{
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
SysTick->LOAD = ticks - 1;
SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk;
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
SysTick->CTRL &= ~SysTick_CTRL_TICKINT_Msk;
}
void delay_ms(uint32_t ms)
{
uint32_t count;
uint32_t tick = 0;
count = ms * (SystemCoreClock / 1000);
SysTick_Init(count);
while ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0)
{
tick++;
}
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}
📝主程序代码
- 🍁延时1秒钟还是很准确的
![在这里插入图片描述](https://img-blog.csdnimg.cn/72940683a9ec4a03b02eb5a89de9ba63.png)
#include "SWM181.h"
void SysTick_Init(uint32_t ticks)
{
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
SysTick->LOAD = ticks - 1;
SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk;
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
SysTick->CTRL &= ~SysTick_CTRL_TICKINT_Msk;
}
void delay_ms(uint32_t ms)
{
uint32_t count;
uint32_t tick = 0;
count = ms * (SystemCoreClock / 1000);
SysTick_Init(count);
while ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0)
{
tick++;
}
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}
int main(void)
{
SystemInit();
GPIO_Init(GPIOB, PIN1, 1, 1, 0, 0);
GPIO_Init(GPIOB, PIN2, 1, 0, 0, 0);
GPIO_Init(GPIOB, PIN3, 1, 1, 0, 0);
while(1)
{
GPIO_InvBit(GPIOB, PIN1);
delay_ms(250);delay_ms(250);delay_ms(250);delay_ms(250);
GPIO_InvBit(GPIOB, PIN1);
delay_ms(250);delay_ms(250);delay_ms(250);delay_ms(250);
}
}
void SysTick_Handler(void)
{
GPIO_InvBit(GPIOB, PIN1);
GPIO_InvBit(GPIOB, PIN2);
GPIO_InvBit(GPIOB, PIN3);
}