STM32:delay_init() 函数(延时函数)

本文详细介绍了STM32的delay_init()函数,该函数用于实现延时操作。文章提到了STM32的5种时钟源,包括HSI、HSE、LSI、LSE和PLL,以及它们的特性。其中,PLL作为锁相环倍频输出,可选择不同的输入源并进行2~16倍的倍频,但输出频率不超过72MHz。HCLK作为AHB总线时钟,通常等于系统时钟SYSCLK。
  • delay_init() 函数延时函数

    • 频率定义:单位时间内完成周期性变化次数。
    • STM32 有5个时钟源:HSI、HSE、LSI、LSE、PLL

      • ①、HSI是高速内部时钟,RC振荡器,频率为8MHz,精度不高。

      • ②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。

      • ③、LSI是低速内部时钟,RC振荡器,频率为40kHz,提供低功耗时钟。WDG

      • ④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。RTC

      • ⑤、PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。

        倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。

    • 什么是HCLK?

      • HCLK :AHB总线时钟,由系统时钟SYSCLK 分频得到,一般不分频,等于系统时钟

    //初始化延迟函数
    //SYSTICK的时钟固定为HCLK时钟的1/8
    //SYSCLK:系统时钟
    void delay_init()
    {
    	SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);	//选择外部时钟  HCLK/8
    	fac_us=SystemCoreClock/8000000;				//为系统时钟的1/8  
    	fac_ms=(u16)fac_us*1000;					//非OS下,代表每个ms需要的systick时钟数   
    }	
    //初始化延迟函数
    //当使用 OS 的时候,此函数会初始化 OS 的时钟节拍
    //SYSTICK 的时钟固定为 HCLK 时钟的 1/8
    void delay_init()
    {
        #if SYSTEM_SUPPORT_OS //如果需要支持 OS.
            u32 reload;
        #endif
        SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//选择外部时钟 HCLK/8
        fac_us=SystemCoreClock/8000000; //为系统时钟的 1/8 
        #if SYSTEM_SUPPORT_OS //如果需要支持 OS.
            reload=SystemCoreClock/8000000; //每秒钟的计数次数 单位为 M 
            reload*=1000000/delay_ostickspersec; //根据 delay_ostickspersec 设定溢出时间
                //reload 为 24 位寄存器,最大值:16777216,在 168M 下,约合 0.7989s 左右
            fac_ms=1000/delay_ostickspersec; //代表 OS 可以延时的最少单位 
            SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk; //开启 SYSTICK 中断
            SysTick->LOAD=reload; //每 1/delay_ostickspersec 秒中断一次
            SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //开启 SYSTICK 
            #else
        fac_ms=(u16)fac_us*1000; //非 OS 下,代表每个 ms 需要的 systick 时钟数 
        #endi
    }

<think>好的,我现在需要解释一下Delay_init函数。首先,我得回忆一下这个函数通常用在什么地方。根据之前的知识,Delay_init可能是在嵌入式系统或者单片机编程中使用的,特别是在处理延时功能的时候。比如在STM32的开发中,经常需要用到延时函数,而Delay_init通常用来初始化定时器或者系统时钟,以便后续的延时函数能够正常工作。 接下来,我应该确认这个函数的具体作用。一般来说,初始化函数会配置相关的硬件资源。比如,设置定时器的预分频值、重装载值,或者校准系统时钟的频率。例如,在使用SysTick定时器作为延时的基础时,Delay_init可能会初始化SysTick的时钟源,计算每个微秒或毫秒需要的定时器周期数。 然后,我需要考虑不同的开发环境或库中的实现差异。比如在HAL库中,可能有不同的配置方式,而在标准库或者LL库中又有所不同。需要说明Delay_init的参数,可能的输入参数是系统时钟的频率,比如72MHz,这样函数内部可以根据这个频率计算出正确的定时器配置值。 另外,可能存在的依赖项也需要提及。比如,使用Delay_init之前需要确保系统时钟已经正确配置,否则计算出来的延时时间会有偏差。如果系统时钟频率改变,可能需要重新初始化Delay_init函数。 还有,这个函数的典型应用场景。比如在需要精确延时的场合,如控制外设的时序、通信协议中的等待时间等。此时,Delay_init的正确初始化对后续的延时准确性至关重要。 可能还需要提到常见的错误或注意事项。例如,如果在没有调用Delay_init的情况下直接使用延时函数,可能会导致程序卡死或者延时时间不准确。或者在系统时钟频率变化后没有重新初始化,导致后续延时错误。 此外,可以举例说明代码结构。比如,在STM32中,Delay_init函数可能包含对SysTick定时器的配置,设置中断,或者计算所需的计数值。然后,Delay_ms或Delay_us函数利用这个初始化后的配置来进行实际的延时操作。 最后,总结一下Delay_init的作用,即通过配置硬件定时器或系统时钟,为后续的延时函数提供准确的时间基准,确保延时功能的可靠性和精确性。同时提醒用户根据具体的硬件和开发环境查阅相关文档,以正确使用该函数。</think>关于`Delay_init`函数,其通常用于嵌入式开发中初始化延时功能。以下是逐步说明: ### 1. 核心作用 - **功能定位**:初始化延时所需的硬件资源(如定时器、系统时钟)。 - **典型场景**:在STM32单片机中,为`Delay_ms()`或`Delay_us()`等延时函数提供基准时间。 ### 2. 实现原理 - **时钟配置**: - 输入系统主频(如`72MHz`),计算单个微秒/毫秒对应的时钟周期数。 - 公式:$$计数值 = \frac{系统时钟频率}{分频系数}$$ - **硬件初始化**: - 配置定时器(如SysTick)的预分频器、重装载值。 - 示例代码片段: ```c void Delay_init(uint32_t sysclk) { SysTick->CTRL = 0; // 关闭SysTick fac_us = sysclk / 1000000; // 计算1us所需周期数 fac_ms = fac_us * 1000; // 计算1ms所需周期数 } ``` ### 3. 关键依赖 - **系统时钟就绪**:需先调用`SystemClock_Config()`等函数配置主时钟。 - **硬件关联性**:不同MCU的定时器地址和寄存器名称可能不同。 ### 4. 典型调用流程 ```c int main(void) { HAL_Init(); // HAL库初始化 SystemClock_Config(); // 配置系统时钟为72MHz Delay_init(72000000); // 传入系统时钟频率 Delay_ms(500); // 延时500ms while(1) {} } ``` ### 5. 注意事项 - **精度问题**:中断响应、代码执行时间可能影响延时精度。 - **重配置风险**:若动态修改系统时钟频率,需重新调用`Delay_init()`。 - **替代方案**:在RTOS中,建议使用任务调度代替裸机延时。 ### 6. 扩展对比 | 延时方式 | 优点 | 缺点 | |----------------|-----------------------|-----------------------| | 定时器延时 | 高精度,可中断 | 占用硬件资源 | | 循环空指令延时 | 不依赖硬件 | 阻塞CPU,精度低 | | RTOS任务延时 | 非阻塞,可调度其他任务| 需操作系统支持 | 总结:`Delay_init`是裸机开发中实现精确延时的基础,需结合具体硬件手册正确配置参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

捧一彼岸花

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值