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) {