添加ozone调试教程和vscode使用
|
@ -1 +1 @@
|
|||
[]
|
||||
[{"node":"CAN1","expanded":true,"format":0,"pinned":false},{"node":"CAN1.MCR","expanded":true,"format":0},{"node":"GPIOG","expanded":true,"format":0,"pinned":false}]
|
|
@ -17,7 +17,8 @@
|
|||
// path to your gcc-arm-none-eabi/bin,如果在cortex-debug的设置中写入了全局路径,这里不需要再写
|
||||
"armToolchainPath": "D:\\gcc-arm-none-eabi\\bin",
|
||||
// path to your gcc-arm-none-eabi/arm-none-eabi-gdb.exe,如果在cortex-debug的设置中写入了全局路径,这里不需要再写
|
||||
"gdbPath": "D:\\gcc-arm-none-eabi\\bin\\arm-none-eabi-gdb.exe"
|
||||
"gdbPath": "D:\\gcc-arm-none-eabi\\bin\\arm-none-eabi-gdb.exe",
|
||||
//"preLaunchTask": "build task",//先运行Build任务,取消注释即可使用
|
||||
},
|
||||
{ // 使用j-link时的参考配置
|
||||
"name": "Debug-jlink",
|
||||
|
@ -33,7 +34,8 @@
|
|||
//如果在cortex-debug的设置中写入了全局路径,这里不需要再写
|
||||
"armToolchainPath": "D:\\gcc-arm-none-eabi\\bin",
|
||||
//如果在cortex-debug的设置中写入了全局路径,这里不需要再写
|
||||
"gdbPath": "D:\\gcc-arm-none-eabi\\bin\\arm-none-eabi-gdb.exe"
|
||||
"gdbPath": "D:\\gcc-arm-none-eabi\\bin\\arm-none-eabi-gdb.exe",
|
||||
// "preLaunchTask": "build task",//先运行Build任务,取消注释即可使用
|
||||
}
|
||||
]
|
||||
}
|
7
Makefile
|
@ -128,7 +128,12 @@ modules/super_cap/super_cap.c \
|
|||
modules/master_machine/seasky_protocol.c \
|
||||
modules/algorithm/crc8.c \
|
||||
modules/algorithm/crc16.c \
|
||||
modules/can_comm/can_comm.c
|
||||
modules/can_comm/can_comm.c \
|
||||
\ \
|
||||
application/gimbal.c \
|
||||
application/chassis.c \
|
||||
application/shoot.c \
|
||||
application/robot_cmd.c
|
||||
|
||||
|
||||
# ASM sources
|
||||
|
|
|
@ -118,7 +118,7 @@ ITM是instrument trace macrocell指令追踪宏单元的缩写,它用于提供
|
|||
|
||||
- ***所有需要编辑的配置文件都已经在basic_framework的仓库中提供,如果不会写,照猫画虎。***
|
||||
|
||||
- 安装STM32CubeMX,并安装F4支持包和DSP库支持包-
|
||||
- 安装STM32CubeMX,并安装F4支持包和DSP库支持包
|
||||
|
||||
- 安装VSCode,并安装C/C++,Cortex-Debug,Cortex-Debug: Device Support Pack - STM32F4,Better C++ Syntax,IntelliCode,Makfile Tools,C/C++ Snippets插件
|
||||
|
||||
|
@ -150,9 +150,7 @@ ITM是instrument trace macrocell指令追踪宏单元的缩写,它用于提供
|
|||
|
||||
打开命令行(win+R,cmd,回车),输入`gcc -v`,如果没有报错,并输出了一堆路径和参数说明安装成功。
|
||||
|
||||
- 配置gcc-arm-none-eabi环境变量
|
||||
|
||||
同上,将工具链的bin添加到PATH:
|
||||
- 配置gcc-arm-none-eabi环境变量,**把压缩包解压以后放在某个地方**,然后同上,将工具链的bin添加到PATH:
|
||||
|
||||
![image-20221112172858593](assets\image-20221112172858593.png)
|
||||
|
||||
|
@ -164,7 +162,7 @@ ITM是instrument trace macrocell指令追踪宏单元的缩写,它用于提供
|
|||
|
||||
> 添加到环境变量PATH的意思是,当一些程序需要某些依赖或者要打开某些程序时,系统会自动前往PATH下寻找对应项。**一般需要重启使环境变量生效。**
|
||||
|
||||
- **将OpenOCD解压到一个文件夹里**,稍后需要在VSCode中设置这个路径。
|
||||
- **将OpenOCD解压到一个文件夹里**,稍后需要在VSCode的插件中设置这个路径。
|
||||
|
||||
- CubeMX生成代码的时候工具链选择makefile
|
||||
|
||||
|
@ -175,6 +173,8 @@ ITM是instrument trace macrocell指令追踪宏单元的缩写,它用于提供
|
|||
![image-20221112174211802](assets\image-20221112174211802.png)
|
||||
|
||||
Makefile就是我们要使用的构建规则文件。
|
||||
|
||||
> **如果你使用basic_framework,不需要重新生成代码。**
|
||||
|
||||
## VSCode编译和调试配置
|
||||
|
||||
|
@ -282,17 +282,28 @@ Makefile的大部分内容在CubeMX初始化的时候就会帮你生成。如果
|
|||
|
||||
> 和KEIL新增文件的方式很相似,但是更方便。
|
||||
|
||||
### 简单调试
|
||||
### 简单的调试配置
|
||||
|
||||
> 在VSCode中调试不能像Keil一样查看变量动态变化,但是支持以外的所有操作,如查看外设和反汇编代码,设置断点触发方式等。
|
||||
|
||||
用于调试的配置参考这篇博客:[Cortex-debug 调试器使用介绍](https://blog.csdn.net/qq_40833810/article/details/106713462)
|
||||
用于调试的配置参考这篇博客:[Cortex-debug 调试器使用介绍](https://blog.csdn.net/qq_40833810/article/details/106713462)。你需要配置**arm gnu工具链的路径**,**OpenOCD的路径**(使得GDB调试器可以找到OpenOCD并调用它,从而连接硬件调试器如j-link等),该工作区(文件夹)的**launch.json文件**(用于启动vscode的调试任务)。
|
||||
|
||||
***配置需要的文件已经全部在basic_framework中提供***,包括`openocd.cfg STM32F407.svd .vscode/launch.json`。
|
||||
VSCode `ctrl+,`进入设置,通过搜索找到cortex-debug插件的设置。
|
||||
|
||||
你需要配置**arm gnu工具链的路径**,**OpenOCD的路径**(使得GDB调试器可以找到OpenOCD并调用它,从而连接硬件调试器如j-link等),该工作区(文件夹)的**launch.json文件**(用于启动vscode的调试任务)。
|
||||
1. 搜索armToolchainPath,设置你的arm gcc toolchain的`bin`文件夹(bin是binary的缩写,实际上文件夹内部是一些可执行文件)。
|
||||
2. 搜索openocdPath,设置你的openocd路径(需要包含到openocd的可执行文件)。
|
||||
|
||||
如果教程看不懂,请看`.vscode`下的`launch.json`,照葫芦画瓢。
|
||||
**注意**,windows下路径需要使用两个反斜杠`\\`代表下一级文件夹。
|
||||
|
||||
***其他配置需要的文件已经全部在basic_framework中提供***,包括`openocd.cfg STM32F407.svd .vscode/launch.json`。
|
||||
|
||||
|
||||
|
||||
![image-20221113125439857](assets\image-20221113125439857.png)
|
||||
|
||||
<center>主要需要配置这2个路径</center>
|
||||
|
||||
如果教程中的启动json文件看不懂,请看仓库里的`.vscode`下的`launch.json`,照葫芦画瓢。
|
||||
|
||||
根目录下已经提供了C板所需的.svd和使用无线调试器时所用的openocd.cfg配置文件。
|
||||
|
||||
|
@ -300,59 +311,153 @@ Makefile的大部分内容在CubeMX初始化的时候就会帮你生成。如果
|
|||
|
||||
![image-20221112180103750](assets\image-20221112180103750.png)
|
||||
|
||||
我们的仓库中默认提供了两种下载器的支持,dap-link(无线调试器属于这一种)和j-link(包括小的j-link OB和黑色大盒子jlink)。
|
||||
|
||||
### 调试介绍
|
||||
|
||||
开始调试后,显示的界面如下:
|
||||
|
||||
![](assets\vscodedebug.png)
|
||||
|
||||
1. 变量查看窗口,包括当前调用栈(当前作用域或代码块)内的局部变量、当前文件的静态变量和全局变量。register选项卡可以查看cpu内核的寄存器数值。
|
||||
|
||||
2. 变量watch窗口。右键单击要查看的变量,选择watch加入查看。
|
||||
|
||||
![image-20221113131044191](assets\image-20221113131044191.png)
|
||||
|
||||
还支持直接运行到指针所选处(Run to Cursor)以及直接跳转到指针处执行(Jump to Cursor)。添加行内断点(若一个表达式由多个表达式组成)也是很方便的功能,可以帮助进一步定位bug。
|
||||
|
||||
右键点击添加到watch窗口的变量,**可以临时修改它们的值。**调参的时候非常好用。
|
||||
|
||||
VSCode提供的一个最大的便利就是,你可以将鼠标悬停在需要查看的变量上,**不需要添加到watch就能观察变量值。**如果是指针还可以自动解析,获取解引用后的值。结构体也支持直接展开。
|
||||
|
||||
![image-20221113133624273](assets\image-20221113133624273.png)
|
||||
|
||||
3. 调用栈。表明在进入当前代码块之前调用了哪些函数,称之为栈也是因为调用的顺序从下至上。当前函数结束之后栈指针会减小,控制权会返还给上一级的调用者。通过调用栈可以确认程序是**如何**(按怎样的顺序)运行到当前位置的。
|
||||
|
||||
4. 片上外设。这里可以查看外设的**控制寄存器**和**状态寄存器**的值,如果通过断点无法定位bug,则需要查找数据手册和Cortex M4指南的相关内容,根据寄存器值来判断程序当前的情况。
|
||||
|
||||
5. 断点。所有添加的断点都会显示于此,注意,不像我们自己的电脑,单片机的DBG外设对断点的数量有限制(资源所限),超过5个断点会导致debug失败,此时将断点减少即可。
|
||||
|
||||
6. 调试控制台。调试器输出的信息会显示在这里,要**查看**和**追踪**的变量的信息也会显示在这里。如果调试出现问题,报错信息同样也会在这里显示。要是出现异常,可以复制这里的信息在搜索引擎里查找答案,不过最好的方法是查询gdb和openocd的官方文档。
|
||||
|
||||
7. 调试控制。
|
||||
|
||||
- 复位:单片机复位
|
||||
- 继续运行/暂停
|
||||
- 单步跳过,如果这一行有函数调用,不会进入内部
|
||||
- 进入,如果这一行有函数调用,会进入函数内部
|
||||
- 跳出,跳出当前调用栈顶层的函数,即如果在函数内部会直接运行到return
|
||||
- 重启调试器(当然单片机也会复位,一般出现异常的时候使用这个按钮)
|
||||
- 终止调试
|
||||
|
||||
> **如果你希望在编译之后立刻启动调试**,不要分两次点击,你可以在`launch.json`中添加一个`prelaunchtask`(意为在启动调试之前要运行的任务),将他设置为我们在[编译章节](###编译)介绍的构建任务。我们已经提供了这个选项,取消注释即可使用。
|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
|
||||
## Ozone可视化调试和LOG功能
|
||||
|
||||
> Ozone暂时只支持jlink。
|
||||
|
||||
### 软件安装
|
||||
|
||||
安装Ozone和J-link工具箱(驱动、gdb以及各种调试工具)。安装包都在网盘里。
|
||||
|
||||
### 配置调试项目
|
||||
|
||||
打开ozone后会显示一个new project wizard,如果没有打开,在工具栏的File-> New -> New project wizard。
|
||||
|
||||
![image-20221113133904084](assets\image-20221113133904084.png)
|
||||
|
||||
选择M4内核,为了能够查看外设寄存器的值还需要svd文件。所有mcu的svd都在图中的文件夹里提供,当然你也可以使用我们仓库根目录下的文件。
|
||||
|
||||
![image-20221113134025339](assets\image-20221113134025339.png)
|
||||
|
||||
接口选择swd,接口速度不需要太高,如果调试的时候需要观察大量的变量并且使用日志功能,可以调高这个值。如果连接了jlikn,下面的窗口中会显示。
|
||||
|
||||
![image-20221113134252407](assets\image-20221113134252407.png)
|
||||
|
||||
选择构建之后生成的.elf文件。这是调试器专用的文件格式,对其内容感兴趣可以自行搜索细节。此外ozone还支持.bin .hex .axf(最后一个是amr-cc,也就是keil的工具链会生成的)等格式。
|
||||
|
||||
![image-20221113134605331](assets\image-20221113134605331.png)
|
||||
|
||||
这页不要动。如果希望保存jlink的调试日志,最后一个选项选择一个文件或者新建一个日志文件。
|
||||
|
||||
### 常用调试窗口和功能
|
||||
|
||||
下图的配置是笔者常用的layout。每个窗口是否显示、放在什么位置等都是可以自己定义的。通过工具栏的view选项卡可以自行选择需要展示的窗口。
|
||||
|
||||
![](assets\ozone.png)
|
||||
|
||||
1. 调试控制:和vscode类似
|
||||
2. 变量watch窗口,这里的变量不会实时更新,只有在暂停或遇到断点的时候才会更新。若希望实时查看,在这里右键选择需要动态查看的变量,选择Graph,他就会出现在**窗口8**的位置。
|
||||
3. 断点和运行追踪管理
|
||||
4. 调试控制台,输出调试器的信息。
|
||||
5. 终端,支持一些jlink script的命令。**单片机通过log模块发送的日志也会显示在这里。**
|
||||
6. 代码窗口,用于添加断点、添加查看等。鼠标悬停在变量上可以快速查看变量值和类型。希望打开整个项目文件,点击工具栏的view选项卡,单击Source Files就可以打开一个项目中所有源文件的窗口。右键点击函数或变量可以跳转到定义和声明、查看汇编代码等。按**F12**跳转到定义。
|
||||
7. **变量可视化窗口,这就是Ozone的大杀器。**在变量添加到查看(watch)之后,右键点击watch中的变量选择Graph,变量会被添加到可视化查看中。你可以选择“示波器”的显示时间步长以及颜色等信息,还可以更改采样率。
|
||||
8. 窗口8和7配合。在窗口8中会实时显示变量值,并且统计平均值和最大最小值,**而且还会将所有采样值保存到一个csv文件当中**,如果需要进一步分析可以导出这个数据文件。
|
||||
9. 内存视图。可以直接查看任意内存位置的值。
|
||||
|
||||
> 再次注意,这些窗口是否开启以及位置都是可以自定义的。
|
||||
|
||||
#### 变量动态查看(可视化)
|
||||
|
||||
- 如果没有打开窗口,现在view->timeline中打开可视化窗口。动态变量查看的窗口也在view->data sampling。
|
||||
|
||||
启用动态变量查看的流程如下:
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
在代码窗口中选中需要观察的变量 --> 添加到watch窗口 --> 在watch选择要动态查看的变量 --> 添加到Datasample窗口
|
||||
```
|
||||
|
||||
第一步的快捷键是`ctrl+w`,选中变量之后按。
|
||||
|
||||
第二部的快捷键是`ctrl+g`,选中watch中的变量后按。
|
||||
|
||||
第三步可以修改示波器的步长和采样频率。
|
||||
|
||||
- 如果当前文件没有你要的变量,你想查看项目中的其他文件夹,在view-> source files中可以打开该项目所有的源文件,双击可以打开源文件。
|
||||
|
||||
![image-20221113142448939](assets\image-20221113142448939.png)
|
||||
|
||||
#### 日志打印
|
||||
|
||||
在Terminal窗口查看,还可以通过命令直接控制单片机的运行(不过不常用)。
|
||||
|
||||
|
||||
|
||||
未打开窗口则在view-> terminal中打开。
|
||||
|
||||
#### 外设查看
|
||||
|
||||
在view-> register中打开窗口,选择Peripherals可以查看所有外设寄存器
|
||||
|
||||
|
||||
|
||||
CPU选项卡可以查看CPU的寄存器。
|
||||
|
||||
#### 调用栈
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
在view-> call stack中打开窗口。
|
||||
|
||||
### 常用快捷键
|
||||
|
||||
| 组合 | 功能 |
|
||||
| -------------------- | ---------------------------------------------------- |
|
||||
| ctrl+w | 添加到查看 |
|
||||
| ctrl+g | 添加到动态查看(需要先添加到查看) |
|
||||
| f12 | 跳转到定义 |
|
||||
| f5 | 启动调试 |
|
||||
| f10 | 单步跳过 |
|
||||
| f11 | 单步进入 |
|
||||
| shift+f11 | 单步跳出 |
|
||||
| 右键+break on change | 当变量发生变化的时候进入此断点 |
|
||||
| ctrl+H | 展示调用图,会列出该函数调用的所有函数(内部调用栈) |
|
||||
|
||||
### 保存调试项目
|
||||
|
||||
退出时可以将调试项目保存在项目的根目录下,方便下次调试使用,不需要重新设置。
|
||||
|
|
After Width: | Height: | Size: 8.5 KiB |
After Width: | Height: | Size: 75 KiB |
After Width: | Height: | Size: 53 KiB |
After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 8.8 KiB |
After Width: | Height: | Size: 16 KiB |
After Width: | Height: | Size: 15 KiB |
After Width: | Height: | Size: 196 KiB |
After Width: | Height: | Size: 224 KiB |
|
@ -1,13 +1,20 @@
|
|||
#include "bsp_buzzer.h"
|
||||
#include "main.h"
|
||||
extern TIM_HandleTypeDef htim4;
|
||||
void buzzer_on(uint16_t psc, uint16_t pwm)
|
||||
{
|
||||
__HAL_TIM_PRESCALER(&htim4, psc);
|
||||
__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_3, pwm);
|
||||
|
||||
extern TIM_HandleTypeDef htim4;
|
||||
static uint8_t tmp_warning_level=0;
|
||||
|
||||
void buzzer_on(uint16_t psc, uint16_t pwm,uint8_t level)
|
||||
{
|
||||
if(level>tmp_warning_level)
|
||||
{
|
||||
tmp_warning_level=level;
|
||||
__HAL_TIM_PRESCALER(&htim4, psc);
|
||||
__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_3, pwm);
|
||||
}
|
||||
}
|
||||
void buzzer_off(void)
|
||||
{
|
||||
__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_3, 0);
|
||||
tmp_warning_level=0;
|
||||
}
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
|
||||
#include "struct_typedef.h"
|
||||
|
||||
extern void buzzer_on(uint16_t psc, uint16_t pwm);
|
||||
extern void buzzer_on(uint16_t psc, uint16_t pwm,uint8_t level);
|
||||
extern void buzzer_off(void);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
#include "main.h"
|
||||
|
||||
extern TIM_HandleTypeDef htim5;
|
||||
static tmp_output_level=0;
|
||||
|
||||
void aRGB_led_show(uint32_t aRGB)
|
||||
{
|
||||
|
|