用寄存器点亮LED灯遇到的问题


//D4点亮LED

void LED_CSH(void)

{

    *(unsigned int *)0x40021018|=0x20;          //开启GPIO_D的时钟

    *(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()后面可以关掉LED灯,都是如果放在while(1)就关不掉LED灯

板子为CH32V307评估板


void LED_CSH(void)

{

? ? RCC->APB2PCENR|=0x20;? ? ? ? ? //开启GPIO_D的时钟

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

? ? GPIOD->CFGLR|=0x70000;

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


}

int main(void)

{

? ? LED_CSH();


while(1)

? ? {


? ? GPIOD->OUTDR|=0x10;

}

}

这样就可以。为什么直接用指针不行(本人小白望各位指点)


直接寄存器编写程序至少是基于芯片的宏定义头文件,你这直接地址操作很容易出错。建议基于库文件开发吧,这样开发效率高效。


 *(volatile unsigned int *)0x4001140C|=0x10;直接写地址在while1中,编译器觉得是个无意义的操作给优化掉了,加上volatile就好了。


感谢!加volatile已解决


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