赞
踩
这周负责编写设备的某个模块,其中遇到了一些变量地址不正确的错误,按理这种底层变量错误用gdb一类的调试器就能很快查到,可是初入嵌入式一行,此C语言非彼C语言,对于gdb怎么对接到项目上根本一无所知,问了下周边同事,发现他们居然都是直接打串口日志来调试的,那岂不是每次遇到问题都得在代码上留一堆丑陋的printf? 我对如此原始的调试方式实在不服气,便想找到相关的对接工具,我的开发习惯是在vscode上写好代码后再在keil上编译烧录,由于keil的界面和操作实在令我难以接受,因此我的需求就是找到在vscode上找到调试单片机的方法,一开始我以为占工作时间一两小时就调通了,结果发现课题复杂度远超出自己的预期,只好乖乖放弃,在代码上不断加入丑陋的printf。。。。。。
等到周末,终于有时间研究了,总之就是不断搜索踩坑,整了两天,总算完事,现作记录。
我使用的是江科大的stm32c8t6开发板,仿真器用的st-link-v2。
gdb对于stm32的调试需要借助一个gdb server, st-link和Jlink都有自带的gdbserver, 我这里选择用openocd作为板子的gdbserver,实际上openocd除了调试还可以烧录,感兴趣的可以自己深入研究下,附一张板子,openocd,pc机之间的关系:
openocd尽量选新的,我这里是windows平台,用的xpack-0.11.0版本,之前用的0.10.0版本跟cotrexDebug扩展组合莫名会出行gdb server超时的错误。
这里附openocd的下载地址:https://github.com/xpack-dev-tools/openocd-xpack/releases
后面关于如何烧录及开gdb server可自行查找。
arm平台有专属的gcc,gdb,make等工具用于arm系列开发板的开发,stm32的开发和调试工具就靠这些,下载:https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads
windows平台用户可选择:
在windows下作C/C++开发的同学应该很熟,不作赘述,这里记个坑,官方下载的时候总是遇到The file has been downloaded incorrectly
,据说是网络问题导致,直接下官网的压缩包又太慢,真的无力。好在已经有好心人贴了百度链接,如下:https://pan.baidu.com/s/1mIq_Vbn2w45L_B-AGJk0ww?pwd=gv1s
参考:
Mingw快捷安装教程 并完美解决出现的下载错误:The file has been downloaded incorrectly
参考:https://blog.csdn.net/qq_40833810/article/details/106713462
注意那个configFile可根据相对路径来填,另外别把单词写错了,当时由于把interface
写成interfaces
卡了一整晚。。。。
executable部分写keil的axf文件或者bin文件都可以,前者确保output选项打勾了Debug Information!
对于STM32,Cotrex-Debug只支持调试其HAL库的代码,对于板子相关的库函数的代码貌似不支持,我试过,拿江科大的库代码版本烧进板子后vscode F5调试,gdb没响应,显然是不兼容。目前stm32开发已经是HAL库的天下了,一个HAL库兼容st下所有型号的板子,这么高效的开发,怎么能不学呢?看来当时应该买正点的板子的,然而太贵了。。。。
STM32CubeMX是ST公司为其开发板做的专属项目生成工具,支持MDK-ARM和makefile两种编译方法,各位同学可根据自身需求选择自己的编译方式, 它就是用的HAL库,而且似乎只能用HAL库,如果学的板子相关标准库的同学(江科大就是stm32f103的标准库)得多做点功课。。。。
另外这东西可以图形化配置芯片的IO口和时钟,最后生成相关的配置代码,还挺方便的。。。
拿江科大的LED闪烁实验来说,原代码是这样:
#include "stm32f10x.h" // Device header #include "Delay.h" int main(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); while (1) { GPIO_ResetBits(GPIOA, GPIO_Pin_0); Delay_ms(500); GPIO_SetBits(GPIOA, GPIO_Pin_0); Delay_ms(500); GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET); Delay_ms(500); GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET); Delay_ms(500); GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)0); Delay_ms(500); GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)1); Delay_ms(500); } }
在STM32CubeMX里面可以预先把IO口设置好,我这里由于PA0和System-WKUP冲突改选了PA1,将PA1设置为推挽输出的操作如图:
最后generate code可在MX_GPIO_Init()
一行看到, 自己的配置已经被落实了:
static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* USER CODE BEGIN MX_GPIO_Init_1 */ /* USER CODE END MX_GPIO_Init_1 */ /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOD_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); /*Configure GPIO pin : PA1 */ GPIO_InitStruct.Pin = GPIO_PIN_1; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; //HAL库中LOW,MEDIUM,HIGH三档分别对应库函数的2MHZ,10MHZ,50MHZ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* USER CODE BEGIN MX_GPIO_Init_2 */ /* USER CODE END MX_GPIO_Init_2 */ }
闪烁灯代码如下:
int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET); HAL_Delay(500); HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET); HAL_Delay(500); /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ }
在vscode的launch.json上配置好:
{ // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing attributes. // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "name": "Cortex Debug", "cwd": "${workspaceFolder}", "request": "launch", "type": "cortex-debug", "runToEntryPoint": "main", "servertype": "openocd", "configFiles": [ "interface/stlink.cfg", "target/stm32f1x.cfg" ], "executable":"build/mdk_arm_test.axf", "svdFile": "D:/Arm/Packs/Keil/STM32F1xx_DFP/2.2.0/SVD/STM32F103xx.svd", } ] }
用之前STM32CubeMX生成的HAL库的代码直接在keil上面编译烧录。
然后上vscode, F5开启调试,成功!尽情享受吧!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。