不用JTAG,也可在线调试

来源:百度文库 编辑:神马文学网 时间:2024/05/29 04:49:38
我用nrf24l01进行无线通信,第一次和我预料的一样,没成功,自然很是郁闷。无线电看不见摸不着,不知如何调试,这东西是不是坏了,我都不知道。后来,我想出一个注意:写寄存器,再读寄存器,若读出来的值与写入的值一样(若两个值是一样,就让一个指定的LED亮),就证明这两部操作都是正确的。而对这些芯片的操作无非就是由读和写构成的。我按照这种思路,对nrf24l01的所有寄存器,依次进行读写,我很欣慰,我可以把值写进去,也可以读出来相同的值,器件是好的。
这个方法让我兴奋了一天,因为我可以窥见他们的心脏。这个方法也有点不足,就是不全面,一次只能显示一个寄存器。我想在同一时间显示所有寄存器,该如何呢?我实现了,方法为把寄存器的值依次读出,然后依次通过串口上传至PC,显示在串口调试助手中。程序不是很难写,关键两点。第一、波特率要正确,而且误差要小。我用的晶振是12M,若用9600则误差是6.98%,误差相当大,在串口上显示的都是乱码,汉字都出来了。注:发送和接受都要以字符方式,不要勾选HEX选项。

我把单片机的波特率设置成4800 SMOD = 1; 误差只有0.16,我发现SMOD =1波特率倍增后,误差明显减小。例如4800 SMOD =0;误差有7%之多。
 
单片机的波特率可以设置,PC的波特率当然更能设置了,在设备管理器里找到串口,右击属性,有个选项就是更改波特率的,还可以该名字,例如把COM1变成COM9.另一点是把整型变成字符串,因为串口调试助手是通过字符串来显示的,HEX的你能看懂吗?把整数 0X3A 变成"0X3A",需要一点技巧,我把程序贴出来
void send_char(uchar x){
SBUF = x;
while(!TI);
_nop_();
TI = 0;
}
void send_str(uchar *s) {
uchar i = 0;
while(s[i] != '\0') {
SBUF = s[i];
while(!TI);
_nop_();
TI = 0;
i++;
}}
void send_nu(uchar c)
{
uchar low,high;
low = c & 0x0f;
high = _cror_(c,4);
high = high & 0x0f;
send_str(" 0x");
switch(high) {
case 0: {send_char(48);break;}
case 1: {send_char(49);break;}
case 2: {send_char(50);break;}
case 3: {send_char(51);break;}
case 4: {send_char(52);break;}
case 5: {send_char(53);break;}
case 6: {send_char(54);break;}
case 7: {send_char(55);break;}
case 8: {send_char(56);break;}
case 9: {send_char(57);break;}
case 10: {send_char(65);break;}
case 11: {send_char(66);break;}
case 12: {send_char(67);break;}
case 13: {send_char(68);break;}
case 14: {send_char(69);break;}
case 15: {send_char(70);break;}
}
switch(low) {
case 0: {send_char(48);break;}
case 1: {send_char(49);break;}
case 2: {send_char(50);break;}
case 3: {send_char(51);break;}
case 4: {send_char(52);break;}
case 5: {send_char(53);break;}
case 6: {send_char(54);break;}
case 7: {send_char(55);break;}
case 8: {send_char(56);break;}
case 9: {send_char(57);break;}
case 10: {send_char(65);break;}
case 11: {send_char(66);break;}
case 12: {send_char(67);break;}
case 13: {send_char(68);break;}
case 14: {send_char(69);break;}
case 15: {send_char(70);break;}
}
}
void send_nus(uchar *a,uchar len)
{
uchar i;
for(i = 0;isend_nu(a[i]);
}
}
send_str("\r\nEN_AA =\t");
send_nu(0xa3);
send_str("\r\nEN_ADDR=\t");         // \r\n  \t 等可以格式化显示
send_nu(0x35);
在串口调试助手中显示为
EN_AA =   0XA3
EN_ADDR =   0X35
程序不复杂,参考一下ASCII码表。
串口调试的时候,不要犯一些低级错误,第一步就是打开串口哦。若是乱码,八成是波特率没设置好,尤其是单片机方面。