int main(void)
{
*(unsigned int *)0x40021018=0x00000008; //开时钟
*(unsigned int *)0x40010c00=0x44444441; //pb0推挽输出模式
*(unsigned int *)0x40010c0c=0x00000000;//开灯
int x=0;
while(x<100)
{
*(unsigned int *)0x40010c0c =0xffffffff;//关灯
x++;//如果把这句注释后灯就关不掉了
}
while(1);
}
该问题已解决,对端口地址的操作得加上volatile以防止编译器优化。写了一段两个按键控制两个led灯的代码,仅供参考。
int main(void)
{
*(volatile unsigned int *)0x40021018=0x0000001c; //开时钟
*(volatile unsigned int *)0x40010c00=0x44444411; //PB0推挽输出模式
*(volatile unsigned int *)0x40010c0c=0xffffffff;//关灯
*(volatile unsigned int *)0x40010800=0x44444444;//a口输入模式
*(volatile unsigned int *)0x40011000=0x44444444;//c口输入模式
while(1)
{
if (*(volatile unsigned int *)0x40010808 & 0x0001) //按键1按下(PA0)
*(volatile unsigned int *)0x40010c0c &=0xfffffffe;//开PB0口led
else
*(volatile unsigned int *)0x40010c0c |=0x00000001;//关PB0口led
if (*(volatile unsigned int *)0x40011008 & 0x2000)//按键2按下
*(volatile unsigned int *)0x40010c0c &=0xfffffffd;//开PB1口led
else
*(volatile unsigned int *)0x40010c0c |=0x00000002;//关PB1口led
}
}