用寄存器點(diǎn)亮LED燈遇到的問題


//D4點(diǎn)亮LED

void LED_CSH(void)

{

? ? *(unsigned int *)0x40021018|=0x20;? ? ? ? ? //開啟GPIO_D的時(shí)鐘

? ? *(unsigned int *)0x40011400&=~0xf0000;

? ? *(unsigned int *)0x40011400|=0x70000;

? ? *(unsigned int *)0x4001140C&=~0x10;

? ?

}


int main(void)

{

? ? LED_CSH();


while(1)

? ? {

? ??

? ? *(unsigned int *)0x4001140C|=0x10;

}

}



把?*(unsigned int *)0x4001140C|=0x10 直接放在LED_CSH()后面可以關(guān)掉LED燈,都是如果放在while(1)就關(guān)不掉LED燈

板子為CH32V307評(píng)估板


void LED_CSH(void)

{

? ? RCC->APB2PCENR|=0x20;? ? ? ? ? //開啟GPIO_D的時(shí)鐘

? ? GPIOD->CFGLR&=~0xf0000;

? ? GPIOD->CFGLR|=0x70000;

? ? GPIOD->OUTDR&=~0x10;


}

int main(void)

{

? ? LED_CSH();


while(1)

? ? {


? ? GPIOD->OUTDR|=0x10;

}

}

這樣就可以。為什么直接用指針不行(本人小白望各位指點(diǎn))


直接寄存器編寫程序至少是基于芯片的宏定義頭文件,你這直接地址操作很容易出錯(cuò)。建議基于庫文件開發(fā)吧,這樣開發(fā)效率高效。


?*(volatile unsigned int *)0x4001140C|=0x10;直接寫地址在while1中,編譯器覺得是個(gè)無意義的操作給優(yōu)化掉了,加上volatile就好了。


感謝!加volatile已解決


只有登錄才能回復(fù),可以選擇微信賬號(hào)登錄

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