发现的问题
在使用洋桃一号开发板测试U盘插拔时,发现洋桃电子官方例程对于Query376Interrupt();函数的疑问。
1,在CH376.h文件中#define CH376_INT GPIO_Pin_15
2,在CH376.C文件中如下定义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 ); } 出现以上两个问题,但是洋桃电子官方例程仍然能够正常运行。
经过测试:将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之间的接线帽。
发现的问题
在使用洋桃一号开发板测试U盘插拔时,发现洋桃电子官方例程对于Query376Interrupt();函数的疑问。
1,在CH376.h文件中#define CH376_INT GPIO_Pin_15
2,在CH376.C文件中如下定义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 ); } 出现以上两个问题,但是洋桃电子官方例程仍然能够正常运行。
经过测试:将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之间的接线帽。
1
举报
-
bayiqiu:
我看视频也卡在这儿1个小时,觉得程序运行不下去,一个是管脚定义错误,一个是返回值没有取反。反复翻看视频电路图,手上没有完整的(free),问D娘找到这里来,杜洋老师经常回头更正自己的错误。