我正在尝试调整我从here下载的一些代码(假设是正确的),以使其适用于我的设置和CPU,但我的编译器似乎并不满意。我使用的是Keil v5和nrf51422(Cortex M0内核),我下载的代码应该针对IAR进行优化。
我有一个头文件dap.h,其中声明了一些用于设置/清除引脚的宏:
#define SWDIO_SET_INPUT() NRF_GPIO->DIRCLR = (1 << SWDIO_PIN)
#define SWDIO_SET_OUTPUT() NRF_GPIO->DIRSET = (1 << SWDIO_PIN)
#define SWDIO_SET() NRF_GPIO->OUTSET = (1 << SWDIO_PIN)
#define SWDIO_CLR() NRF_GPIO->OUTCLR = (1 << SWDIO_PIN)
#define SWCLK_SET() NRF_GPIO->OUTSET = (1 << SWCLK_PIN)
#define SWCLK_CLR() NRF_GPIO->OUTCLR = (1 << SWCLK_PIN)
#define SWDIO_OUT(bit) {if ( bit ) SWDIO_SET(); else SWDIO_CLR();}
#define SWDIO_IN() (NRF_GPIO->IN >> SWDIO_PIN) & 0x1)
#define SWCLK_CYCLE() \
SWCLK_CLR(); \
SWCLK_SET()
#define SWDIO_CYCLE() \
SWDIO_SET(); \
SWDIO_CLR()
#define WRITE_BIT(bit) \
SWDIO_OUT(bit); \
SWCLK_CLR(); \
SWCLK_SET()
#define READ_BIT(bit) \
SWCLK_CLR(); \
bit = SWDIO_IN(); \
SWCLK_SET()
然后我有dap.c文件,其中包含调用宏的dap.h:
/* Send request */
WRITE_BIT(1);
WRITE_BIT(_ap);
WRITE_BIT(_read);
WRITE_BIT(A2);
WRITE_BIT(A3);
WRITE_BIT(parity);
WRITE_BIT(0);
WRITE_BIT(1);
/* Turnaround */
SWDIO_SET_INPUT();
SWCLK_CYCLE();
/* Read ACK */
for ( i=0; i<3; i++ ) {
READ_BIT(b);
ack |= b << i;
}
/* Verify that ACK is OK */
if ( ack == ACK_OK ) {
for ( i=0; i<32; i++ )
{
/* Read bit */
READ_BIT(b);
*data |= b << i;
/* Keep track of expected parity */
if ( b ) cb = !cb;
}
/* Read parity bit */
READ_BIT(parity);
在编译时,READ_BIT(b)的每个实例都会生成错误
error: 65: expected a ";"
如果我用鼠标移过一个弹出消息告诉我“错误:无关')'''之前';'”。 宏中的分号对我来说似乎没问题,WRITE_BIT(位)编译没有问题。
使用带有参数的宏来返回值对我来说似乎有点奇怪,我可以轻松地将它们转换为函数,但也许还有其他原因,值得学习它。
答案 0 :(得分:4)
宏中有不平衡的括号:
#define SWDIO_IN() (NRF_GPIO->IN >> SWDIO_PIN) & 0x1)
据推测,你需要在开始时使用第二个左括号。