#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); } } }