跳转至

高精度微秒delay使用说明*

1. 精确延时 注意事项*

由于常用的延时接口gx_udelay存在固定耗时,随着delay时间增大,误差会逐渐减小;在做精确延时的时候,误差会较大,本文提供高精度微秒的延时,下面介绍如何使用高精度微秒delay延时。

2. 精确延时 使用说明*

2.1 延时接口*

  • 根据mcu频率获取delay系数接口: gx_udelay_fine_config
  • 传入延时时间和延时系数延时接口: gx_udelay_fine
lvp/lvp_tws/include/driver/gx_delay.h
/**
 * @brief 精准us delay配置
 * @param cpu_fre CPU频率(Hz)
 * @return 配置情况
 * - -1        配置失败
 * - Others    拿到精准delay系数
 */
static inline unsigned int gx_udelay_fine_config(unsigned int cpu_fre)

/**
 * @brief 精准us delay
 * @param us    延时时长
 *        coeff gx_udelay_fine_config()返回的系数
 */
static inline void gx_udelay_fine(unsigned int us, unsigned int coeff)

2.2 使用步骤*

  • 调整cpu频率

    LvpDynamiciallyAdjustCpuFrequency(CPU_FREQUENCE_24M);       // 将cpu频率调高,如果默认的频率本来就是24M或者大于24M,则不需要调整cpu频率
    

  • 获取延时系数

    int coeff = gx_udelay_fine_config(gx_clock_get_module_frequence(CLOCK_MODULE_SCPU));    // 通过cpu频率获取延时系数
    

  • 关闭中断

    unsigned int irq = gx_lock_irq_save();          // 保存中断并关闭中断,中断会影响延时
    

  • 延时

    gx_udelay_fine(1, coeff);          // 延时1us,传入延时时间和延时系数
    

  • 恢复中断

    gx_unlock_irq_restore(irq);                     // 操作完成后打开中断
    

  • 恢复频率

    LvpDynamiciallyAdjustCpuFrequency(CPU_FREQUENCE_DEFAULT);   // 恢复默认cpu频率,和之前的调整cpu频率
    

2.3 不同cpu频率下延时1us*

  • 使用精确延时接口延时1us

    CPU频率
    (LvpDynamiciallyAdjustCpuFrequency)
    延时1us
    CPU_FREQUENCE_50M 1.2
    CPU_FREQUENCE_24M 1.3
    CPU_FREQUENCE_16M 1.3
    CPU_FREQUENCE_12M 1.8

3. 精确延时 示例*

精确延时示例以GPIO模拟红外为例,具体示例见GPIO模拟红外-示例