diff --git a/.vscode/.cortex-debug.peripherals.state.json b/.vscode/.cortex-debug.peripherals.state.json
index 0637a08..261a57e 100644
--- a/.vscode/.cortex-debug.peripherals.state.json
+++ b/.vscode/.cortex-debug.peripherals.state.json
@@ -1 +1 @@
-[]
\ No newline at end of file
+[{"node":"CAN1","expanded":true,"format":0,"pinned":false},{"node":"CAN1.MCR","expanded":true,"format":0},{"node":"GPIOG","expanded":true,"format":0,"pinned":false}]
\ No newline at end of file
diff --git a/.vscode/launch.json b/.vscode/launch.json
index 56720ef..1bf9f81 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -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任务,取消注释即可使用
}
]
}
\ No newline at end of file
diff --git a/Makefile b/Makefile
index 6b76ffb..7fde451 100644
--- a/Makefile
+++ b/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
diff --git a/VSCode+Ozone使用方法.md b/VSCode+Ozone使用方法.md
index ff9c63a..99b1250 100644
--- a/VSCode+Ozone使用方法.md
+++ b/VSCode+Ozone使用方法.md
@@ -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)
+
+
主要需要配置这2个路径
+
+如果教程中的启动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 | 展示调用图,会列出该函数调用的所有函数(内部调用栈) |
+### 保存调试项目
+退出时可以将调试项目保存在项目的根目录下,方便下次调试使用,不需要重新设置。
diff --git a/application/robot_cmd.c b/application/robot_cmd.c
new file mode 100644
index 0000000..e69de29
diff --git a/application/robot_cmd.h b/application/robot_cmd.h
new file mode 100644
index 0000000..e69de29
diff --git a/application/robot_cmd.md b/application/robot_cmd.md
new file mode 100644
index 0000000..e69de29
diff --git a/assets/image-20221113125439857.png b/assets/image-20221113125439857.png
new file mode 100644
index 0000000..cdd69c2
Binary files /dev/null and b/assets/image-20221113125439857.png differ
diff --git a/assets/image-20221113131044191.png b/assets/image-20221113131044191.png
new file mode 100644
index 0000000..b74ab20
Binary files /dev/null and b/assets/image-20221113131044191.png differ
diff --git a/assets/image-20221113133624273.png b/assets/image-20221113133624273.png
new file mode 100644
index 0000000..deabf6a
Binary files /dev/null and b/assets/image-20221113133624273.png differ
diff --git a/assets/image-20221113133904084.png b/assets/image-20221113133904084.png
new file mode 100644
index 0000000..103ee21
Binary files /dev/null and b/assets/image-20221113133904084.png differ
diff --git a/assets/image-20221113134025339.png b/assets/image-20221113134025339.png
new file mode 100644
index 0000000..1ac3919
Binary files /dev/null and b/assets/image-20221113134025339.png differ
diff --git a/assets/image-20221113134252407.png b/assets/image-20221113134252407.png
new file mode 100644
index 0000000..fe2ed0f
Binary files /dev/null and b/assets/image-20221113134252407.png differ
diff --git a/assets/image-20221113134605331.png b/assets/image-20221113134605331.png
new file mode 100644
index 0000000..fc69e89
Binary files /dev/null and b/assets/image-20221113134605331.png differ
diff --git a/assets/image-20221113142448939.png b/assets/image-20221113142448939.png
new file mode 100644
index 0000000..84e0755
Binary files /dev/null and b/assets/image-20221113142448939.png differ
diff --git a/assets/ozone.png b/assets/ozone.png
new file mode 100644
index 0000000..e419317
Binary files /dev/null and b/assets/ozone.png differ
diff --git a/assets/vscodedebug.png b/assets/vscodedebug.png
new file mode 100644
index 0000000..e76fb36
Binary files /dev/null and b/assets/vscodedebug.png differ
diff --git a/bsp/bsp_buzzer.c b/bsp/bsp_buzzer.c
index ee577ec..340ea36 100644
--- a/bsp/bsp_buzzer.c
+++ b/bsp/bsp_buzzer.c
@@ -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;
}
diff --git a/bsp/bsp_buzzer.h b/bsp/bsp_buzzer.h
index e0d304d..932d53a 100644
--- a/bsp/bsp_buzzer.h
+++ b/bsp/bsp_buzzer.h
@@ -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
diff --git a/bsp/bsp_led.c b/bsp/bsp_led.c
index 1a13763..a56e974 100644
--- a/bsp/bsp_led.c
+++ b/bsp/bsp_led.c
@@ -2,6 +2,7 @@
#include "main.h"
extern TIM_HandleTypeDef htim5;
+static tmp_output_level=0;
void aRGB_led_show(uint32_t aRGB)
{