发现的问题
在使用洋桃一号开发板测试U盘插拔时,发现洋桃电子官方例程对于Query376Interrupt();函数的疑问。
/*******************************************************************************
* 描 述 : 查询CH376中断(INT#低电平).
* 返 回 : **0:无中断. 1:有中断**
*******************************************************************************/
u8 Query376Interrupt(void){
u8 i;
i = GPIO_ReadInputDataBit(CH376_INTPORT,CH376_INT);
return( i );
}
答疑之路
对于问题1,了解到GPIOA15是JDTI引脚,只能用于JATG功能;同时,在CH376端口初始化函数CH376_PORT_INIT中针对GPIO_Pin_8做了初始化。结合以上两点判断是例程错误,正确的应该是#define CH376_INT GPIO_Pin_8。
对于问题2,参照CH376官方提供例程,发现l两个Query376Interrupt函数返回值意义相同,同时在filesys.c中的处理情况也完全一致。
/*******************************************************************************
* 描 述 : 查询CH376中断(INT#低电平).
* 返 回 : FALSE(0):无中断. TRUE(1):有中断.
*******************************************************************************/
UINT8 Query376Interrupt( void )
{
UINT8 i;
i = (CH376_INT_WIRE ? FALSE : TRUE ); /* 如果连接了CH376的中断引脚则直接查询中断引脚 */
return( i );
}
如果连接了CH376的中断引脚则直接查询中断引脚 */ return( i ); } 出现以上两个问题,但是洋桃电子官方例程仍然能够正常运行。
经过测试:将GPIO_Pin_15改为GPIO_Pin_8时,程序无法正常运行,即无法检测U盘插入。继续修改:将洋桃官方例程Query376Interrupt函数中的语句修改为i = ~GPIO_ReadInputDataBit(Int_Port,Int_Pin);程序恢复正常。
问题解决
解决方法:
1,将洋桃电子例程#define CH376_INT GPIO_Pin_15修改为#define CH376_INT GPIO_Pin_8。在这里,之前的错误程序能运行的原因便是,CH376_INT引脚也就是GPIO_Pin_15总是保持高电平,而调用Query376Interrupt函数的时候就是返回值为1的,也就是GPIO_ReadInputDataBit读出的高电平,这里的凑巧确实让人哭笑不得。
不知道杜洋老师当时是不是只为了程序能够执行出来,而没有仔细检查。
2,在分析了以上情况之后,将Query376Interrupt函数中的
i = GPIO_ReadInputDataBit(CH376_INTPORT,CH376_INT);
修改为: i = ~GPIO_ReadInputDataBit(Int_Port,Int_Pin);
最终程序完美运行,但是,不要忘记插上PA8与USB INT之间的接线帽。
总结反思
在STM32的依样画葫芦阶段,还是要敢于提出质疑,老师也是人,也会有错误的地方,这个时候就要我们相信自己了。同时,还可以寻求更加官方的帮助,也就是CH376的官方例程以及沁恒电子论坛的。
疫情在家效率底下,然而本人又是碰到问题死磕的人,这个看似简单的问题花了挺长时间菜最终解决。这个问题也能让自己发现自身所存在的不足,特别是面对分析的分析能力和解决能力都有待提高。
这是第一次写博客,文笔不好,还望见谅!