本帖最后由 zidantou 于 2014-12-23 13:56 编辑
430FR5969很人性化的就是和G2553 LunchPad一样自带虚拟串口,不过这个最大支持的波特率比G2553 LunchPad的9600要高,想必这也是TI换仿真器方案的原因之一吧。好了,闲话少说,进入正题:
我的习惯是在调试软件之前,首先检查硬件的工作状态,首先把仿真器上的RXD、TXD短接(上面用跳帽短接)再上电,然后在设备管理器中找到虚拟串口的串口号,在串口调试助手中打开串口发送任意字符串,看能否收到一样的字符串。自发自收正常后,说明调试部分硬件没问题。如图开发板串口示意图:
有了这保障,咱调试心里也就有底了,将跳帽恢复,导入TI 430Ware中的例子,大致看了下,在配置完寄存器后,在接收中断处理函数中将收到字符一个一个发出去,可奇怪的是:串口调试助手这边发了半天,怎么一个没接收到?在此,不确定代码哪有问题,是波特率不对还是配置有问题?
在这胡乱猜还不如采取实际行动证实自己的想法,即发送一个字符看看,这个比较简单,只需要给UCA0TXBUF一个字符即可:在配置完后写入如下代码:
UCA0TXBUF=’A’;
for(;;);
下载进去后,按下复位,串口调试助手竟然收到了FR5969发的字符“A”,这说明配置和波特率都是正确的。那难道是中断有问题?再次为了证实自己的想法,在中断的发送字符处设置断点,在仿真状态下点击全速运行,串口调试助手这边也设置为0.5秒发送一个字符。但程序跑了半天也没到达断点哪里,至此,初步证实了自己的想法,点击暂停,看下程序运行到哪了。
结果发现,程序一直在while(!(UCA0IFG&UCTXIFG));死循环。这个是发送完成标识符,这就纳闷了,还没发送呢,就判断是否发送完成,这不是强人所难嘛,果断将这句移到
UCA0TXBUF = UCA0RXBUF;下面,这下,终于成功了,此处没想明白TI为什么要这样处理。
发送和接收终于正常了之后,这还不是我最终想要的,即我需要能对接收到的字符进行判断并处理(如执行相应指令等),这里为了便于处理和滤除错误信息,对字符串加了“#”截止符。不是以“#”结尾的一概不处理。
下面分享一下调试结果及程序:
啰嗦这么多,在分享我的调试过程时,也想表达我的调试经验:即要有条理,不确定问题在哪时,从源头开始查起。不断猜想并证明自己的判断,问题既然有,一条条顺藤摸瓜总能找得到,此时,条理清晰可避免自己少走弯路。如有不同看法,欢迎交流。