基本函数--delay
delay头文件分为三个函数
static u8 fac_us=0;//us延时倍数
static u16 fac_ms=0;//ms延时倍数
delay_init(void);
delay_ms(u16 nms);
delay_us(u32 nus);
delay_init(void)函数
//选择时钟源函数
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
//SystemCoreClock 定义在芯片文件中 SYSCLK_FREQ_72MHz 72000000
//定义了系统时钟的频率常量 72MHz
//系统时钟通常与微控制器的主时钟源(如晶振或PLL输出)相关
//和现实的1us没什么关系,这里只是定义 1us是当前这个系统时钟的1/8
fac_us=SystemCoreClock/8000000;//8Mhz
// 1000us=1ms
fac_ms=(u16)fac_us*1000;
选择时钟源函数 SysTick->CTRL其中的一个标志位
主时钟 1/72MHz = 13.89ns
8分频时钟,减少能耗,精度变差 1/9MHz= 111.1111 ns
void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)
{
//检查参数是不是合理
assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource));
//是不是选择时钟
if (SysTick_CLKSource == SysTick_CLKSource_HCLK)
{
SysTick->CTRL |= SysTick_CLKSource_HCLK;
}
else //选择分频时钟
{
SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8;
}
}
delay_us(u32 nus)函数;
当你设置了 SysTick->LOAD 寄存器的值后,SysTick 定时器开始从该值开始递减。SysTick->CTRL 寄存器中的 ENABLE 位会被设置为 1,表示定时器启用。
//nus表示我们想要的延时 us数
void delay_us(u32 nus)
{
u32 temp;
//这个寄存器用于设置定时器的重载值,即 SysTick 定时器计数到达这个值时会重新加载并重新开始计数
//
SysTick->LOAD=nus*fac_us;
//你可以读取它来查看当前定时器的计数值,
//将 VAL 寄存器清零意味着将定时器的当前计数器值设为 0。此时,定时器的计数开始被清除,下一次定时器递减会从 LOAD 值开始(强制)。
SysTick->VAL=0x00;
//时钟使能,表示开始计时
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;
//计时完成后,SysTick->CTRL寄存器的标志为改变
//具体就是 检查(temp&0x01) 和 !(temp&(1<<16) 这个标志位,如果满足就表示计时结束
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16)));
//关闭计时使能位,关闭计时时钟
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;
SysTick->VAL =0X00;
}
delay_ms(u16 mus)函数;
//与上一个函数同理
void delay_ms(u16 nms)
{
u32 temp;
SysTick->LOAD=(u32)nms*fac_ms;
SysTick->VAL =0x00;
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16)));
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;
SysTick->VAL =0X00;
}
时钟计数器的结构体,定义了一些寄存器
typedef struct
{
__IO uint32_t CTRL; /*!< Offset: 0x00 SysTick Control and Status Register */
__IO uint32_t LOAD; /*!< Offset: 0x04 SysTick Reload Value Register */
__IO uint32_t VAL; /*!< Offset: 0x08 SysTick Current Value Register */
__I uint32_t CALIB; /*!< Offset: 0x0C SysTick Calibration Register */
} SysTick_Type;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!