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