个人网站建设哪家好,黑龙江建设网一体化平台,官方百度app下载安装,修改WordPress文章发布模板串行驱动的关键是双方能够按照既定的时序进行检测、设置相关引脚上的电平#xff0c;比如单总线、I2c这样基本的可以用GPIO模拟的时序协议#xff0c;需要主从双方#xff0c;必须在链路接口内严格按照微妙级的延迟单位进行时序同步。 所以#xff0c;在这种对时间要求很敏… 串行驱动的关键是双方能够按照既定的时序进行检测、设置相关引脚上的电平比如单总线、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 HC32F60pclk 200MHZ*/
#define DELAY_ADJUSTMENTS 12
void delay_nus(uint16_t n) { uint16_t j; while(n--) { j DELAY_ADJUSTMENTS;// while(j--); } }