高精度微秒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模拟红外-示例