最近才做的板子由于自己的粗心把串口线搞反了,还好只有两条,飞线解决,而且现在还只是样板,但是还是应该引以为戒,以后做硬件一定要谨慎。
今天同事出差把CAN分析仪拿走了,本来在开发板上调试好的程序不知为何移植到板子上以后CAN突然不能发送数据了,恰好今天没法用硬件调试,只能用软件仿真了。除了CAN部分在主函数前还有和USART相关的操作,起初我苦思冥想也没想到这能有什么错,之前用开发板的时候串口和CAN都可以用。昨天仅仅把串口1移植到了串口2,尽管这两个串口不在同一个总线上,但是想起来和CAN八竿子打不着,怎么也不应该影响CAN呀。后来实在没办法了注释掉了main函数中while(1)之前串口发送的语句,意外地发现CAN部分终于发送数据了。
这是怎么回事?太奇怪了啊。没办法,单步调试,当进入串口发送函数时发现了这么一句:
while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)==RESET);
继续执行,却会发现始终在这一句循环,也就是说函数不能返回。当然无法进入while循环发送CAN数据了,难怪之前只要把CAN的初始化部分放在USART发送函数之后,就会看到CAN一直处于sleep状态。这是为什么呢?看芯片手册:
TC标志位是在数据发送完成后由硬件置位的,而且库中已经定义了typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus;
所以循环回无法跳出,也就没法执行发送函数之后的操作了。当然同理,用以下的循环语句来判断数据是否转移到移位寄存器也是不能跳出循环的。
while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET );
可以看出,由硬件自动进行操作的寄存器位的判断在软件仿真时都不能放在while循环中判断,否则会出现死循环,无法执行后面的操作。谨记,今天竟然犯了这么一个小错误,汗一个!