更啊更,新啊新,不止不熄...
目录
1.问题:编译错误parse error before ‘=‘ token
2.问题:MT7620A无线芯片GPIO操作
1.问题:编译错误parse error before ‘=‘ token
nand_lcd_notdma.c:
1071: error: parse error before ‘=‘ token
1072: error: parse error before "char"
错误源码:
unsigned char char = ch;
查网上:
一个*.c文件中,在一行中定义:
int data[5];
编译报错:
parse error before ‘[‘ token;
data是非常平常的一个变量,为什么会报错呢?
如果改为data_, data1, data2.... 就没有问题。
编译器错误???当然不是,还是程序本身的问题
在一个包含的头文件中定义了一行:
#define data
这就是错误的关键,花了一天时间才发现这个问题。。。。
2.问题:MT7620A无线芯片GPIO操作
*(volatile u32 *)(RALINK_REG_PIO7140DIR) |= (0x3F << 20); /*a.清零所有列数据寄存器*/
*(volatile u32 *)(RALINK_REG_PIO7140RESET) |= (0x3F << 20);
*(volatile u32 *)(RALINK_REG_PIO7140DIR) &= ~(0x3F << 20); /*b.set GPIO 65 -- 60 to input; 1=output, 0=input */
*(volatile u32 *)(RALINK_REG_PIO7140DIR) |= (1<< (20 + i)); /*c.测试GPIO(60 + i)输出*/
*(volatile u32 *)(RALINK_REG_PIO7140SET) |= (1<< (20 + i)); /*d.把测试列GPIO(60 + i)输出引脚拉高*/
udelay(10000); //打印乱了,好几个引脚显示高电平,且每次读DATA寄存器,值都不一样;
//udelay(0); //屏蔽延时,与测试行短接的行引脚,但是DATA寄存器输入引脚的相应位,检测不到高电平;
udelay(200); //该时间可以读取到正常的数据,也可以检测到短路;
u32_var = (*(volatile u32 *)(RALINK_REG_PIO7140DATA)) >> 20; /*e.读GPIO65-60 列其他输入引脚数据 */
u32_var &= 0x3f;
printf("KEY_ROWS TEST3: u32_var = 0x%x\n", u32_var);
说明:
1.根据数据手册,操作时需要进行“位写”操作的寄存器:
RALINK_REG_GPIO_xx_DIR //set GPIO_xx to: 1=output, 0=input */
2.不需要进行“位写”操作的寄存器:
RALINK_REG_GPIO_xx_SET //0=无影响; 1=把输出引脚GPIODATA寄存器对应位拉高;
RALINK_REG_GPIO_xx_RESET //0=无影响; 1=把输出引脚GPIODATA对应位清零;
RALINK_REG_GPIO_xx_TOG //0=无影响; 1=反转输出引脚GPIODATA对应位;
这类寄存器,应使用直接赋值操作。
3.不需要写操作,只需要“读”操作的寄存器:
RALINK_REG_GPIO_xx_DATA
现象:
KEY_ROWS TEST3: u32_var = 0x19 = 0b011001;
分析:手动短路键盘引脚,理论只应该出现两个高电平引脚,即测试拉高引脚和与测试引脚手动短路的引脚。但现象并不是如此。
操作:短接行4-5(共有行0-5)。
猜测1:应该是RALINK_REG_GPIO_xx_SET寄存器使用位操作时,之前操作的位仍保留了高电平。
但是RALINK_REG_PIO7140SET修改前
源码:
*(volatile u32 *)(RALINK_REG_PIO7140SET) |= (1<< (26 + i)); /*d.把测试行GPIO(66 + i)输出引脚拉高*/
udelay(10000);
u32_var = *(volatile u32 *)(RALINK_REG_PIO7140SET);
//==================================
printf("KEY_ROWS TEST3: RALINK_REG_PIO7140SET = 0x%x\n", u32_var); //u32_var = 0x19 = 0b011001;
//==================================
u32_var = (*(volatile u32 *)(RALINK_REG_PIO7140DATA) >> 26); /*e.读GPIO71-66 行其他输入引脚数据 */
u32_var &= 0x3f;
//==================================
printf("KEY_ROWS TEST3: RALINK_REG_PIO7140DATA = 0x%x\n", u32_var);
//==================================
打印:
KEY_ROWS TEST3: RALINK_REG_PIO7140SET = 0x0
KEY_ROWS TEST3: RALINK_REG_PIO7140DATA = 0x31=0b0011 0001;
修改后源码:
*(volatile u32 *)(RALINK_REG_PIO7140SET) = (1<< (26 + i)); /*d.把测试行GPIO(66 + i)输出引脚拉高*/
udelay(10000);
u32_var = *(volatile u32 *)(RALINK_REG_PIO7140SET);
//==================================
printf("KEY_ROWS TEST3: RALINK_REG_PIO7140SET = 0x%x\n", u32_var); //u32_var = 0x19 = 0b011001;
//==================================
打印:
KEY_ROWS TEST3: RALINK_REG_PIO7140SET = 0x0
KEY_ROWS TEST3: RALINK_REG_PIO7140DATA = 0x31=0b0011 0001;
答:RALINK_REG_GPIO_xx_SET并无保存之前的值,是因为其在作用完RALINK_REG_GPIO_XX_DATA后就自动归回默认值0x0了吗?不知,但是其并未影响程序。
猜测2:手动短路时,手接触镊子,手上带有电。
答:手不接触镊子时,短路,测试必报短路,万用表测电平:
ROW_4/5 与其他引脚电平一样,都是0.8V左右;
手接触镊子时,短路,测试必报短路,万用表测电平:
ROW_4/5 与其他引脚电平不一样,是1.5V左右;其他引脚仍然0.8V左右;
测试3:把所有行后设置为输入引脚,短接ROW4-5,查看RALINK_REG_GPIO_XX_DATA寄存器的打印结果
答:
//*(volatile u32 *)(RALINK_REG_PIO7140DIR) |= (1<< (26 + i));
KEY_ROWS TEST1: RALINK_REG_PIO7140DATA = 0x0
KEY_ROWS TEST2: RALINK_REG_PIO7140DATA = 0x0
KEY_ROWS TEST3: RALINK_REG_PIO7140SET = 0x0
KEY_ROWS TEST3: RALINK_REG_PIO7140DATA = 0x30 //0b0011 0000;
Keypad Test: row: 0-4
//*(volatile u32 *)(RALINK_REG_PIO7140SET) = (1<< (26 + i)); /*d.把测试行GPIO(66 + i)输出引脚拉高*/
....
KEY_ROWS TEST3: RALINK_REG_PIO7140SET = 0x0
KEY_ROWS TEST3: RALINK_REG_PIO7140DATA = 0x30 //0b0011 0000;
Keypad Test: row: 2-4
猜测4:专业用于输入引脚的列引脚接下拉电阻到地,为什么?这个是造成行全配置为输入引脚时会读到高电平的原因所在吗?
总结:因为行引脚未接上拉/下拉电阻到电源/地,引脚悬空。因此,需要在寄存器配置之后,立刻读DATA寄存器的值,如此可得到正确的值。
但又因为RALINK_REG_PIO7140SET寄存器置1后稍微一段时间后,才能在RALINK_REG_PIO7140DATA寄存器读到该位的相应数据位置1,因此应该在
RALINK_REG_PIO7140SET寄存器置1后添加延时delay(200)或(100)。
说明:当一个数字芯片的输入引脚处于悬空状态时,是输入高电平还是低电平。我认为这个问题答案不确定。这个要看引脚内部结构。有些引脚内部有上拉电阻,
悬空时肯定是输入高电平。有些引脚内部有下拉电阻,悬空时肯定输入低电平。对于那些开漏的引脚,电平应该不确定的。
原文:https://www.cnblogs.com/xiaohujian/p/12009573.html