当前位置: 首页 > news >正文

ARM 循环阻塞延迟函数

     串行驱动的关键是双方能够按照既定的时序进行检测、设置相关引脚上的电平,比如单总线、I2c这样基本的可以用GPIO模拟的时序协议,需要主从双方,必须在链路接口内严格按照微妙级的延迟单位进行时序同步。 所以,在这种对时间要求很敏感的情况下,一般都会考虑到用循环等待检测的方式来拖住时间窗,而且近似微妙的阻塞等待一般也不会对整个系统的用户体验造成太大的影响。 下面是在实际经验中积累的,微妙延迟的方法。

1. ARM-CORTX-M0  

   M0 HC32F110L上的延迟,可以精准到微妙。可以用systic,也可用while阻塞循环等待。

/******************************************************************************* systic * xus:*     use this delay function when time >= 20 
*******************************************************************************/
void jbf_systic_us_ex(uint32_t xus)
{ SysTick->LOAD = (xus - 18) * (JBF_SISTICK_VALUE / 1000000);SysTick->VAL = 0;SysTick->CTRL = 0x01;while(!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk));SysTick->CTRL &= ~(0x01 << SysTick_CTRL_ENABLE_Pos);
}
/******************************************************************************* 24M 1US delay,* ??????????????1us??????
*******************************************************************************/void jbf_delay_24M_us(void)
{int xus = 1;while( xus--){__NOP();__NOP();}}void jbf_delay_24M_xus(uint16_t xus)
{uint16_t j;while (xus--){j = 2; //while (j--);}
}

2. ARM-CORTEX-M4

/*********************************************************** DEC:  200M MPLL us delay function.* PARAM: n = nus* RETURN: none
***********************************************************/
void delay_nus(uint16_t n)
{uint16_t j;while(n--){j = DELAY_ADJUSTMENTS;// while(j--);}
}
extern uint32_t SystemCoreClock;        /*!< System clock frequency (Core clock) */
/**** * base interval is 60 when LOAD  = 1, LOAD + 1 lead the timme plus 30us* if the value lager than 60, and times of 30, then use this function* (time - 60) / 30 - 1;* time = 180 , load = (180 - 60) / 3 + 1 = 5;* */void delay_30Tnus(uint16_t n)
{uint32 _load =  (n - 60) / 10 / 3 + 1;SysTick->LOAD = _load;SysTick->VAL = 0;SysTick->CTRL = 0x01;while(!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk));SysTick->CTRL &= ~(0x01 << SysTick_CTRL_ENABLE_Pos);
}/*********************************************************** DEC:  200M MPLL ms delay function.* PARAM: n = mus* RETURN: none
***********************************************************/
void delay_nms(uint16_t n)
{while(n--){delay_nus(1000);}
}

实际就两种方式比较通用的,一个是systic,这个真的要看systic分到的频率了, 如果本身频率很低,那么在微妙的精度行还是有些误差的。

另一种方式就是利用CPU的加法周期来做延迟,这个目前看来也有一定的可用性,关键是要找好指令周期的倍数。拿示波器实际调试可以作证得出最精准的延迟。

/*DELAY   HC32F60,pclk 200MHZ*/

#define DELAY_ADJUSTMENTS 12 

void delay_nus(uint16_t n)
{
  uint16_t j;
  while(n--)
  {
    j = DELAY_ADJUSTMENTS;// 
    while(j--);
  }
}

http://www.lryc.cn/news/99501.html

相关文章:

  • Spark的DataFrame和Schema详解和实战案例Demo
  • WPF线程使用详解:提升应用性能和响应能力
  • ava版知识付费平台免费搭建 Spring Cloud+Spring Boot+Mybatis+uniapp+前后端分离实现知识付费平台
  • libuv库学习笔记-basics_of_libuv
  • 【Vuvuzela 声音去噪算法】基于流行的频谱减法技术的声音去噪算法研究(Matlab代码实现)
  • Vue + Element-ui组件上传图片报错问题解决方案
  • java商城系统和php商城系统对比
  • 某制造企业基于 KubeSphere 的云原生实践
  • Electron 学习_BrowserWindow
  • Docker学习笔记,包含docker安装、常用命令、dockerfile、docker-compose等等
  • 解决 “Module build failed (from ./node_modules/babel-loader/lib/index.js)“ 错误的方法
  • go学习 6、方法
  • MySQL Windows版本下载及安装时默认路径的修改
  • 第3章 配置与服务
  • Arcgis之 KML/KMZ文件转shp
  • python绘制3D条形图
  • 计算从曲线的起点到param指定的点的曲线段的长度
  • POLARDB IMCI 白皮书 云原生HTAP 数据库系统 一 数据压缩和打包处理与数据更新
  • linux----源码安装如何加入到系统服务中(systemclt)
  • Unity 使用UnityWebRequest 读取存档 (IOS只能这样做)
  • Caused by: org.springframework.beans.factory.
  • 【docker 安装】 与【docker-compose 安装】
  • 意外:WPS编程新工具,不用编程,excel用户:可以不用VBA啦
  • GAMES101 笔记 Lecture12 Geometry3
  • Java的内部类
  • 电赛培训(高频电路类赛题)学习总结
  • Rust ESP32C3开发
  • 【Spring Cloud Gateway 新一代网关】—— 每天一点小知识
  • Java 中的关键字 final 和 static
  • Spring Cloud OpenFeign 全教程