打印
[应用相关]

请问大侠:如何产生N条空指令

[复制链接]
2304|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wahahaabc|  楼主 | 2009-1-20 10:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
偶的一个I2C模块使用的是软件模拟I/O的方式,对于不同的MCU,因为其速度可能差异很大,所以,经常需要调整延迟时间,在C语言中,能否产生N条相同的空指令。

注意:不是使用下面的循环,因为循环需要i++和比较,效果和产生N条空指令不同
for(i=0;i<N;i++)
{
    _nop_();
}

而是需要下面的效果(例如:产生3条空指令)
_nop_();
_nop_();
_nop_();
沙发
winloop| | 2009-1-20 10:39 | 只看该作者

你在STM32上模拟I2C时间间隔是怎么控制的

我原来在51下模拟很好控制时间间隔,一个nop就可以,但是在STM32下试过很多次都不行,你是怎么实现的呢?

使用特权

评论回复
板凳
mcuisp| | 2009-1-20 14:46 | 只看该作者

用SysTick做延时,Cortex-M3通用。

共享一把我的代码吧(有点复杂,但是可以用):
/*******************************************************************************
* Function Name  : SysTick_Config_MAX
* Description    : Configure a SysTick Base time to MAX timeout.
* Input          : None
* Output         : None
* Return         : None
* Author         : www.mcuisp.com
void SysTick_Config_MAX(void)
{
  /* Configure HCLK/8 clock as SysTick clock source */
  SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);

  /* SysTick Reload By Max Value */
  SysTick_SetReload(0x00ffffff);

  /* Disable the SysTick Interrupt, use for free count */
  SysTick_ITConfig(DISABLE);

  /* Enable the SysTick Counter */
  SysTick_CounterCmd(SysTick_Counter_Enable);
}
//--
/*******************************************************************************
* Function Name  : DelayCyclesBySysTick
* Description    : delay N SysTicks.
* Input          : u32 ticks,the number of ticks desired to delay
* Output         : None
* Return         : None
* Author         : www.mcuisp.com
*******************************************************************************/
void DelayCyclesBySysTick(u32 ticks)
{
  u32 ui32,ui32a,systickprescale;
  if((SysTick->CTRL&SysTick_Counter_Enable)==0)return;//没开SysTic,返回避免死循环
  systickprescale=SysTick->LOAD;
  if(systickprescale<250)return;//SysTick的Load值太小,误差很大,返回。
  for(;ticks>=systickprescale;)
  {
    ticks=ticks-systickprescale-200;
    ui32=SysTick_GetCounter();
    for(;;)
    {
      ui32a=SysTick_GetCounter();
      if(ui32a>ui32)
      {
        ui32a=ui32+systickprescale-ui32a;
      }
      else
      {
        ui32a=ui32-ui32a;
      }
      if(ui32a>=(systickprescale-200))break;
    }
  }
  ui32=SysTick_GetCounter();
  for(;;)
  {
    ui32a=SysTick_GetCounter();
    if(ui32a>ui32)
    {
      ui32a=ui32+systickprescale-ui32a;
    }
    else
    {
      ui32a=ui32-ui32a;
    }
    if(ui32a>=ticks)break;
  }
}
//--

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

119

主题

627

帖子

0

粉丝