高手指教,mounriverstudio的问题怎么解决?

说起来真的难以置信,一个最简单的延时,居然在mounriver里边无效。各位高手看看什么原因。在stm32这个程序运行非常正常,可以在输出看到高低脉冲。直接上代码,

#define dsp_TOGGLE1    (GPIOC->OUTDR ^= GPIO_Pin_6)

void io_Init(void)

{

//=================================

  GPIO_InitTypeDef GPIO_InitStructure;

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE ); 

  GPIO_InitStructure.GPIO_Pin =   GPIO_Pin_6;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

  GPIO_Init(GPIOC, &GPIO_InitStructure);

}

void delayms(u16 x)    // 延时 (x) ms

{

    u16 j;

    while(x--){

        for(j=0;j<123;j++){;}

    }

}


int main(void)

{

u32 cnt;

    io_Init();

   while(1){

   dsp_TOGGLE1;   for(cnt=0;cnt<10000;cnt++)    delayms(50);

   }

}

void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal)
{
  if (BitVal != Bit_RESET)
  {
    GPIOx->BSHR = GPIO_Pin;
  }
  else
  {
    GPIOx->BCR = GPIO_Pin;
  }
}

你好,使用这个函数进行IO口输出试一下,V103不支持对IO口进行位操作。


不会啊,我把定时器改成debug。c里边的Delay_Us(1),工作正常啊?这个函数的数值变化,输出会跟着变化。我确认对IO的操作正常,关键是延时的程序无效。


明显是编译器认为你的delayms函数毫无必要给优化掉了。你观察一下汇编代码确认一下。

把最里面的for循环里面加个nop指令就可以避免优化。但是用循环来定时这种方式受影响的因素太多不是好写法。


你好,这边建议你可以将优化等级降低,优化等级设置方法如下图1,此外建议你将delayms函数里的延时数值设置大一些,当你设置为50的时候,大约为500ns,如图2,肉眼无法看见闪烁现象,建议设置大一些,比如设置为1000。

图1

1629272359175068.png

图2

1629272359985711.png



只有登录才能回复,可以选择微信账号登录