开发者学堂课程【嵌入式之 RFID 开发与应用2020版:Debug 代码实现】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/665/detail/11159
Debug 代码实现
再给代码再增加两个文件,为了做的更加人性化,就把它全都拷过去。
加了 config 就可以对整个宏文件做一个统一声明定义,也就是将来主要包含config.h,现在还需要重新添加一下,刚才添加的文件,也就是里面还有一些函数需要声明,刚才讲到的 printf 需要声明,接下来是串口,串口里面的文件,是自己添加的,现在对这些文件进行初始化,这个初始化和 IO 初始化,终端初始化基本上是类似的,首先要明确这个串口使用的是哪个 IO,当然,也用到了中断以及串口本身的时序发生,且它属于哪条中线,属于哪条总线需要查询手册,手册里面就有,说目前使用的串口 1,就属于 APB1。
串口 234 就属于 AP B2,数据有出入的时候,主要是看给出的代码,而不是头文件,这里很明显指出串口 2 属于 APB2。
如果非要把他放在 APB1 上,我说这里把 APP2 改成 APB1 就变成黑色的了,那就意味着这里没有被定义过,就表示这个串口没有在 apb 1 上 ,而是在 apb 2 上。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA
所以最好的参考资料还是源代码。IO 口也要查询手册,找到通用和复用功能,再找到串口复用功能,可以看到,串口 1 复用的引脚是 a9 和 a10,映射到 b6 和 b7。
这是 32 非常独特的一个功能,为了方便设计法。不是说所有的串口 1 非得接到a9a10,到 b6b7 也可以,通过软件可以配置,默认情况下,remap=0,就是a9a10,
那也就是,GIIOPIN 9 不要当做简单的 IO 来使用,应该把它当做复用功能,A9 是用作串口 1 的发送,A10 是用作串口 1 的接收,速度差不多就行,5 到 10 就可以,模式叫 AF-PP,也就是复用推广输出,IN-PLOATING,叫做悬空输入。配置完之后,先不看中断的代码,以前 512 计算波特率的速率十分麻烦,现在有了扩函数就很直观,比如说是 115200 就直接填 115200 速率多少,可以直接计算。接下来,数据的长度是八位,停止位是一位,奇偶校定位没有,留空暂时也不支持,然后支持接收,也支持发送,最后初始化。
=USART_WordLength_8b;
USART_StopBits_1;
ART_Parity_No;
wControl = USART_HardwareFlowControl_NONE;
T_Mode_Rx | USART_Mode_Tx;
最后使用窗口,就是往计算机里面去写词,DR 计算机把字节往里面放,一往窗口里面放字节窗口,就会把它发射出去,通过判断 SR 的计算状态,可以判断字节是否发送出去。目前,比特位是第六个比特位,第六个比特位,如果是等于 0,就说明还没有发完,如果等于 1 就发送出去了,就可以发送下一个字节,所以 fputc 函数可以直接往里面填,现在的问题是怎么支持 printf 格式化输出,其实把代码写成这样是没有用的,只是为了配合标准库,
//重定义 fputc 函数
Int fputc(int ch,FILE *f)
{
While((USART1->SR&0X40)==0);
//循环发送,直到发送完毕
USART1->DR = (n8) ch;
Return ch;
}
基本上串口就完成了,只是一个初始化,紧接着就可以直接用 printf 了,比如说booting 启动,如果不知道 PC 端的启动是用钢二还是 \R 还是 \N,可以都加上,这样 printf 就可以直接打印出来。为了便于观察和调试自己设置了一个 debug 开关,这个 debug 开关是平时做项目经常用到的,对 printf 进行定义,把它的行号打印出来,主要是打印行号,其实还可以打印函数名,还可以打印时间日期,根据系统是否支持都可以打印,包括还可以打印,它属于哪个文件,后面如果需要调试或者产品已经注释就可以把它给删掉,
#define _DEBUG_
那后来这些调试信息都会消失,这就很方便。
所以可以用两种方法,接下来就编译一下代码,此时此刻,在这个地方还需要再添加一下文件,在 APP 里面再添加一个串口,另外就是 library 这里面也用到了串口,所以应该把 usart 也加进来,其他的暂时就先不管,加进来之后再编译。这里还有一个问题,这里用到了一个队列,但是因为队列暂时用不到,就把它注释掉。不过又因为队列在窗口里面多次用到,所以这个问题无法回避,所以应该在文件里面把队列再加进去,同时,APP 里面也应该把队列加进去,保证编译通过就行。编译通过之后,把它下载下来,注意接线,就是下完之后,要在串口里面找到 a9 和 a10 在什么地方, A9 和 a10 就在如下图位置,
有两根线,一根白色的线和一根棕色的线,
这两根线一直接到了 debug 这个地方,
USB 旁边的线,还有电源线在这里。
把下载完的程序复位一下,找到串口应该是 29,复位的时候可以看到打印了booting,那么要怎样看到 debug 的输出?需要按键每按一下,输出一次,第一次按输出零,第二次输出 1, 再按一次输出二,第八个打印的文件比较多,把行号也给打印出来了,不过个人觉得没有必要,不过也有用,可以定位问题出在哪里,
这个就是串口 debug 的实现,相对于 jkb345200 比较简单,方也提供了许多支持,使操作非常方便,如果将来发布的时候把 config 注释掉,那后面的文件就全部都没了,所以不建议通过 printf booting\n 进行调试,当写到 100 句的时候,就很难进行管理。那么,如何输出一个不带行号的?可以使用 debug_raw,叫原始输出,原始输出和 Printf 输出是一样的,只是输出的不带行号,是一个统一的开关,这就是第 debug 的调试。如果是 IAR 开发环境,还需要配置 library,这里需要纠正一下,calf 不需要选择支持,如果是 IAR 才需要。