首先在外部中断里有这样一个中断服函数,而且是可以正常工作的。
void EXTI0_IRQHandler(void)
{
delay_ms(10); //消抖
if(WK_UP==1)
{
LED0=!LED0;
LED1=!LED1;
}
EXTI_ClearITPendingBit(EXTI_Line0); //清除EXTI0线路挂起位
}
和这个LED0相关的定义如下,是一个宏定义
#define LED0 PAout(8) // PA8
其它相关宏定义如下:
//确保n的值小于16!
#define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //输出
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
那我的问题来了,LED0是一个宏定义,也不是变量。怎么对一个宏定义取反。最后我们类函数宏展开,那也应该是得到GPIOA_ODR第8个位ODR8 的值为0或者为1,我们可以!0或者!1,也可以#define LED0 0然后!LED0,但是LED0=!LED0就说语法上不通了。小弟不明白,就算#define LED0 PAout(8),最后得到的#define LED0 1难道就可LED0=!LED0了,这个从C语法上来说是说不通的。还是我理解有误???请各位大神指点一下小弟。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
感谢这位哥们的热心回复,其实你说的这些一直到*((vu32*)addr)我都懂。再简化一下就是*((vu32*)addr) = !*((vu32*)addr),这样就是指针做左值和右值的问题了。后来特地查了一下关于指针的问题。最后在《C和指针》6.7节指针、间接访问和左值发现一个例子:前提int a ; int *d = &a; 则对*d=10-*d 给出的解释是:右边的间接访问作为右值使用,所以它的值是d所指向的位置所存储的值(a的值),左边的间接访问是作为左值使用,所以d所指向的位置(a)把赋值符号右则的表达式计算的结果作为它的新值(标黄部分是原书翻译我个人感觉不太好,就是说a的值最后等于右则表达式的值,指针做左值时看成是*d变量a,指针做右值时*d看成是a的值)。现在问题就很清楚了*((vu32*)addr) = !*((vu32*)addr)就是对这个地址里的值非,然后再赋给这个地值变量。
一周热门 更多>