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 才需要。

相关文章
|
存储 文件存储 数据安全/隐私保护
文件管理介绍
文件管理是操作系统中的一个重要组成部分,它负责管理计算机系统中的文件和文件系统的组织结构。文件是存储在存储介质上的一组相关数据,可以是文本文件、图像文件、音频文件、视频文件等。文件管理的目标是有效地组织、存储、检索和保护文件,提供方便的文件操作和共享功能。 文件管理的主要功能包括文件存储和文件操作两个方面: 1. 文件存储: - 文件组织结构:文件系统采用一种层次化的组织结构,常见的有层次目录结构、索引结构和扁平文件结构等。层次目录结构是最常见的文件组织方式,通过目录和子目录的层次关系来组织文件。索引结构是利用索引表来存储文件的位置和属性信息,可以提高文件的访问速度。扁平文件结构是将
927 1
|
移动开发 JSON Java
APK文件结构
APK文件结构
796 0
|
网络协议 固态存储 Windows
解决Win10服务主机本地系统网络受限
换成win10有一段时间了,界面风格比win7好看,但有部分程序还是不兼容,还好用虚拟机可以将就解决。但有一个问题一直困扰了我好久,今天终于解决了。 问题描述 在进程中,服务主机:本地系统(网络受限)的CPU使用率非常高,经常导致达到100%使电脑卡起,甚是恼火。
4171 0
|
消息中间件 监控 数据挖掘
基于RabbitMQ与Apache Flink构建实时分析系统
【8月更文第28天】本文将介绍如何利用RabbitMQ作为数据源,结合Apache Flink进行实时数据分析。我们将构建一个简单的实时分析系统,该系统能够接收来自不同来源的数据,对数据进行实时处理,并将结果输出到另一个队列或存储系统中。
1363 2
|
消息中间件 存储 RocketMQ
Docker安装多主多备rocketMQ集群之Docker-compose方式
Docker安装多主多备rocketMQ集群之Docker-compose方式
1946 0
Docker安装多主多备rocketMQ集群之Docker-compose方式
|
关系型数据库 MySQL 数据库
mysql 8.0 递归(例子分享)(sample database classicmodels _No.4)
本文介绍了如何在MySQL8.0中使用递归查询处理部门表和员工表的树形结构数据,包括查看文档、准备数据、递归处理以及提取层级信息。作者通过示例展示了WITHRECURSIVE语句的应用及其在数仓中的结构表示。
335 2
|
机器学习/深度学习 编解码 人工智能
高效轻量级语义分割综述
语义分割是自动驾驶中视觉理解的重要组成部分。然而当前SOTA的模型都非常复杂和繁琐,因此不适合部署在计算资源受限且耗时要求较低的车载芯片平台上。本文深入研究了更紧凑、更高效的模型以解决上述问题,这些模型能够部署在低内存嵌入式系统上,同时满足实时推理的需求。本文讨论了该领域一些优秀的工作,根据它们的主要贡献进行归类,最后本文评估了在相同软硬件条件下模型的推理速度,这些条件代表了一个典型的高性能GPU和低内存嵌入式GPU的实际部署场景。本文的实验结果表明,许多工作能够在资源受限的硬件上实现性能和耗时的平衡。
高效轻量级语义分割综述
|
存储 自然语言处理 编译器
C语言中的char类型
C语言中的char类型
4472 1
|
API 数据安全/隐私保护 开发者
​收不到验证码邮件该怎么办?
在日常生活中,收不到邮箱验证码会带来不便。解决方法包括:检查垃圾邮件文件夹并调整过滤设置;确认邮箱地址无误或使用备用邮箱;检查邮箱存储空间并设置自动清理;了解邮件服务提供商状态或尝试其他服务。使用AOKSend可确保验证码邮件顺利送达:注册账户,获取API密钥,配置SMTP设置,并利用分析工具优化邮件发送策略。遵循这些建议,能有效解决收不到验证码的问题。
|
开发框架 前端开发 搜索推荐
在WInform开发中实现工具栏/菜单的动态呈现
在WInform开发中实现工具栏/菜单的动态呈现

热门文章

最新文章