高手指教,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;
??}
}

你好,使用這個函數(shù)進行IO口輸出試一下,V103不支持對IO口進行位操作。


不會啊,我把定時器改成debug。c里邊的Delay_Us(1),工作正常啊?這個函數(shù)的數(shù)值變化,輸出會跟著變化。我確認對IO的操作正常,關鍵是延時的程序無效。


明顯是編譯器認為你的delayms函數(shù)毫無必要給優(yōu)化掉了。你觀察一下匯編代碼確認一下。

把最里面的for循環(huán)里面加個nop指令就可以避免優(yōu)化。但是用循環(huán)來定時這種方式受影響的因素太多不是好寫法。


你好,這邊建議你可以將優(yōu)化等級降低,優(yōu)化等級設置方法如下圖1,此外建議你將delayms函數(shù)里的延時數(shù)值設置大一些,當你設置為50的時候,大約為500ns,如圖2,肉眼無法看見閃爍現(xiàn)象,建議設置大一些,比如設置為1000。

圖1

1629272359175068.png

圖2

1629272359985711.png



只有登錄才能回復,可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频