32 lines
1.0 KiB
C
32 lines
1.0 KiB
C
#include "delay.h"
|
||
|
||
/*
|
||
@ brief 延时函数
|
||
@ param
|
||
@ return
|
||
@ note 2022-5-23
|
||
*/
|
||
void delay_us(int us)//100us以内
|
||
{
|
||
uint32_t start, now, delta, reload, us_tick;
|
||
start = SysTick->VAL;//记录进入函数时SysTick计数器的当前值。
|
||
reload = SysTick->LOAD;//SysTick的重载值,即计数器从reload递减到0。
|
||
/* 240 */
|
||
us_tick = SystemCoreClock / 1000000UL;//每微秒对应的滴答数(系统时钟频率除以1000000)。SystemCoreClock是系统核心时钟频率(单位Hz),除以1000000得到每微秒的滴答数。
|
||
do
|
||
{
|
||
now = SysTick->VAL;//在循环中不断读取的SysTick当前值。
|
||
delta = start > now ? start - now : reload + start - now;//计算从start到now的时间间隔(以滴答数计)。
|
||
} while (delta < us_tick * us);//直到经过的滴答数大于等于所需的微秒数对应的滴答数才退出。
|
||
}
|
||
|
||
void delay_ms(int ms)
|
||
{
|
||
for (int i = 0; i < ms; i++)
|
||
{
|
||
for (int j = 0; j < 1000; j++)
|
||
{
|
||
delay_us(1);
|
||
}
|
||
}
|
||
}
|