自己做网站 教程,长春火车站是南站还是北站,html5建一个网站,网站官方首页设计实现vscode上用gdb调试stm32
这周负责编写设备的某个模块#xff0c;其中遇到了一些变量地址不正确的错误#xff0c;按理这种底层变量错误用gdb一类的调试器就能很快查到#xff0c;可是初入嵌入式一行#xff0c;此C语言非彼C语言#xff0c;对于gdb怎么对接到项目上根…实现vscode上用gdb调试stm32
这周负责编写设备的某个模块其中遇到了一些变量地址不正确的错误按理这种底层变量错误用gdb一类的调试器就能很快查到可是初入嵌入式一行此C语言非彼C语言对于gdb怎么对接到项目上根本一无所知问了下周边同事发现他们居然都是直接打串口日志来调试的那岂不是每次遇到问题都得在代码上留一堆丑陋的printf? 我对如此原始的调试方式实在不服气便想找到相关的对接工具我的开发习惯是在vscode上写好代码后再在keil上编译烧录由于keil的界面和操作实在令我难以接受因此我的需求就是找到在vscode上找到调试单片机的方法一开始我以为占工作时间一两小时就调通了结果发现课题复杂度远超出自己的预期只好乖乖放弃在代码上不断加入丑陋的printf。。。。。。
等到周末终于有时间研究了总之就是不断搜索踩坑整了两天总算完事现作记录。
我使用的是江科大的stm32c8t6开发板仿真器用的st-link-v2。
1.下载openocd
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可自行查找。
2.下载arm-gnu-toolchains
arm平台有专属的gccgdbmake等工具用于arm系列开发板的开发stm32的开发和调试工具就靠这些下载https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads
windows平台用户可选择 3.MinGW
在windows下作C/C开发的同学应该很熟不作赘述这里记个坑官方下载的时候总是遇到The file has been downloaded incorrectly,据说是网络问题导致直接下官网的压缩包又太慢真的无力。好在已经有好心人贴了百度链接如下https://pan.baidu.com/s/1mIq_Vbn2w45L_B-AGJk0ww?pwdgv1s
参考
Mingw快捷安装教程 并完美解决出现的下载错误The file has been downloaded incorrectly
4.Cotrex-Debug下载及配置
参考https://blog.csdn.net/qq_40833810/article/details/106713462
注意那个configFile可根据相对路径来填另外别把单词写错了当时由于把interface写成interfaces卡了一整晚。。。。
executable部分写keil的axf文件或者bin文件都可以前者确保output选项打勾了Debug Information!
5.STM32CubeMX
对于STM32Cotrex-Debug只支持调试其HAL库的代码对于板子相关的库函数的代码貌似不支持我试过拿江科大的库代码版本烧进板子后vscode F5调试gdb没响应显然是不兼容。目前stm32开发已经是HAL库的天下了一个HAL库兼容st下所有型号的板子这么高效的开发怎么能不学呢看来当时应该买正点的板子的然而太贵了。。。。
STM32CubeMX是ST公司为其开发板做的专属项目生成工具支持MDK-ARM和makefile两种编译方法各位同学可根据自身需求选择自己的编译方式, 不过一点它用的HAL库如果学的板子相关标准库的同学江科大就是stm32f103的标准库得多做点功课。。。。
另外这东西可以图形化配置芯片的IO口和时钟最后生成相关的配置代码还挺方便的。。。
拿江科大的LED闪烁实验来说原代码是这样
#include stm32f10x.h // Device header
#include Delay.hint 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,50MHZHAL_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 */
}6.最终效果
在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/?linkid830387version: 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开启调试成功尽情享受吧