Debug 代码实现 | 学习笔记

简介: 快速学习 Debug 代码实现

开发者学堂课程【嵌入式之 RFID 开发与应用2020版:Debug 代码实现】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/665/detail/11159


Debug 代码实现

再给代码再增加两个文件,为了做的更加人性化,就把它全都拷过去。image.png

加了 config 就可以对整个宏文件做一个统一声明定义,也就是将来主要包含config.h,现在还需要重新添加一下,刚才添加的文件,也就是里面还有一些函数需要声明,刚才讲到的 printf 需要声明,接下来是串口,串口里面的文件,是自己添加的,现在对这些文件进行初始化,这个初始化和 IO 初始化,终端初始化基本上是类似的,首先要明确这个串口使用的是哪个 IO,当然,也用到了中断以及串口本身的时序发生,且它属于哪条中线,属于哪条总线需要查询手册,手册里面就有,说目前使用的串口 1,就属于 APB1。

image.png

串口 234 就属于 AP B2,数据有出入的时候,主要是看给出的代码,而不是头文件,这里很明显指出串口 2 属于 APB2。

image.png

如果非要把他放在 APB1 上,我说这里把 APP2 改成  APB1 就变成黑色的了,那就意味着这里没有被定义过,就表示这个串口没有在 apb 1 上 ,而是在 apb 2 上。

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA

所以最好的参考资料还是源代码。IO 口也要查询手册,找到通用和复用功能,再找到串口复用功能,可以看到,串口 1 复用的引脚是 a9 和 a10,映射到 b6 和 b7。

image.png

这是 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 就在如下图位置,

image.png

有两根线,一根白色的线和一根棕色的线,

image.png

这两根线一直接到了 debug 这个地方,

USB 旁边的线,还有电源线在这里。

image.png

把下载完的程序复位一下,找到串口应该是 29,复位的时候可以看到打印了booting,那么要怎样看到 debug 的输出?需要按键每按一下,输出一次,第一次按输出零,第二次输出 1, 再按一次输出二,第八个打印的文件比较多,把行号也给打印出来了,不过个人觉得没有必要,不过也有用,可以定位问题出在哪里,

image.png

这个就是串口 debug 的实现,相对于 jkb345200 比较简单,方也提供了许多支持,使操作非常方便,如果将来发布的时候把 config 注释掉,那后面的文件就全部都没了,所以不建议通过 printf booting\n 进行调试,当写到 100 句的时候,就很难进行管理。那么,如何输出一个不带行号的?可以使用 debug_raw,叫原始输出,原始输出和 Printf 输出是一样的,只是输出的不带行号,是一个统一的开关,这就是第 debug 的调试。如果是 IAR 开发环境,还需要配置 library,这里需要纠正一下,calf 不需要选择支持,如果是 IAR 才需要。

相关文章
|
2月前
|
运维 NoSQL 安全
debug学习
debug学习
138 65
|
6月前
|
C++
VS code debug c代码 配置
VS code debug c代码 配置
64 0
(附运行结果和截图)关于try{return}finally中都有return 运行结果测试之旅
(附运行结果和截图)关于try{return}finally中都有return 运行结果测试之旅
|
Linux 程序员 C语言
Vs code写C语言代码配置(超详细超基础)
写在前面: 近期不是重新温习一下C语言吗,也给自己升级换代一下编辑器,最初我一直用Dev c++ 写的C语言,因为没想往深的学习C语言,也不会去写什么大的项目,所以这个编辑器也是可以用,但是目前认真学习,发现那个东西真的适合初学者,对于我这种懒人不适合,项目代码管理起来很麻烦,所以一气之下我直接鸟枪换炮,整个大家伙——vs,但是vs真的太大了,而且默认装在C盘,我这破电脑小内存扛不住,所以就研究了一下vs code,下面就本人安装经验给新学者讲解如何安装。
747 0
|
Go Windows
JIT Debug Info 简介
JIT Debug Info 简介
|
监控 安全 测试技术
C++还在用printf/cout进行Debug?学习一下如何自己写日志库吧(上篇)
日志是出现异常第一个想到的东西,它记录了程序运行过程中所调用的函数,所接受到的值,所执行的行为等等。大家也都看到这篇的标题了,我这个人有一个缺点,就是不太喜欢用别人的东西,如果有能力,我希望自己造,所以今天我们自己来动手撸一个日志库,文章重点讲实现过程,如果需要源码,可以前往github获取[FdogLog,一个轻量级C++日志库,用于日志服务。
C++还在用printf/cout进行Debug?学习一下如何自己写日志库吧(上篇)
C# Debug Trace调试类用法
    Debug和Trace都是调试类。     Debug类的方法只有DEBUG版中生效,而Trace的方法可以在DEBUG/RELEASE版本中生效。 一、Debug类 Debug类的控制台输出及断言Assert用法。
1743 0
codeblocks进行调试(debug)时查看二维数组的内容
codeblocks进行调试(debug)时查看二维数组的内容
codeblocks进行调试(debug)时查看二维数组的内容
|
Java 测试技术
由三个感叹号开启的 debug 篇章 | Java Debug 笔记
!!! JUnit version 3.8 or later expected: 如下所示,当我在进行单元测试时,控制台居然抛出了这么诡异的bug! 三个感叹号开头 此刻的我 ??? 异常信息如下: java.lang.ClassNotFoundException: junit.framework.ComparisonFailure 那么先挖到它的源码看个究竟叭 😝 在264行打个断点,然后debug运行起来 通过 Alt+F8 来获取这个类加载器 都使用到了哪些类 ClassLoader.getClassLoader(caller) 效果如下:可以看到这里 至于为啥会点开这里,
621 0
|
算法
写代码一天,debug一年?
写代码一天,debug一年?
206 0
写代码一天,debug一年?