在window下使用 VScode 搭建 ARM 开发环境—— 详细版

举报
矜辰所致 发表于 2022/09/29 16:25:17 2022/09/29
【摘要】 在window下使用 VScode 搭建 ARM 开发环境
其实文章也是以前做好的记录,现在把笔记放在博客上面来,方便管理和查看,
所以有一些细节问题并没有图文说明,等后期正真操作一遍的时候来把图片和说明补充完成。
本文给出两种方式,第一种gcc-arm-none-eabi 来编译,
第二种利用插件导入KEIL工程,可以执行编译调试烧录
..添加第二种方式,利用插件 
..添加第一种方式的部分图片和说明
..添加环境变量添加步骤示意图 
..添加 Makefile 的修改说明
..添加 openocd 下的烧录过程说明
..添加 gcc 下的 printf 重定义
..Embedded IDE 插件自动安装失败处理方法 
..添加 openocd 下载安装说明
..添加 mingw 安装详细说明
..添加使用 Jlink 烧录出现问题说明 
..添加本文用到所有的工具包下载
..添加jlink问题7.4小结(未解决)
..结构调整,内容添加优化   

一、使用 VSCode + gcc + openOCD 开发

文章中所用到的工具版本都可以网上下载。

1、安装 gcc-arm-none-eabi-xxx

安装 gcc-arm-none-eabi-5_4-2016q3-20160926-win32(这只是当时我配置时候用的版本,其他版本也是可以的)。

记得最后的第3选项打钩,因为自动添加环境变量。因为自动添加,所以会添加到用户的环境变量下面去,一样可以用,如果自己添加,可以添加到系统的环境变量中去 ,如下图:

在这里插入图片描述

最后,只要是在你的终端够查询到arm gcc的版本,能就算是正常安装了,输入 arm-none-eabi-gcc -v

终端可以使window自带的cmd,也可以是你配置过的模拟linux的终端 ,如下所示:

在这里插入图片描述

在 Vscode 中的终端查看:

在这里插入图片描述

2、环境变量添加示意图

下图给出环境变量添加的示意图,所有软件的环境变量都是按照下面的步骤来进行的, windows 的环境变量通过控制面板 -> 系统可以打开。

下面安装的工具环境变量配置基本上按照这个图来就可以:

在这里插入图片描述
但是,这个电脑上我的arm-gcc环境变量添加是在用户变量下面的(gcc-arm-none-eabi安装时候自自动添加的),应该用户和系统都是可以的,有待验证:

在这里插入图片描述

3、安装mingw

安装mingw-w64-install(根据自己的电脑选择mingw的版本)

在这里插入图片描述

安装的几个选项给出说明,从上到下依次为:

  1. Version :
    制定版本号,从4.9.1-8.1.0,按需选择,没有特殊要求就用最新版吧;
  2. Architecture
    跟操作系统有关,64位系统选择x86_64,32位系统选择i686;
  3. Threads :
    设置线程标准可选posix或win32;
  4. Exception :
    设置异常处理系统,x86_64可选为 seh 和 sjlj,i686为 dwarf 和 sjlj;
  5. Build revision :
    构建版本号,选择最大即可。

64位的 windows 10 ,直接按照上面的图示选择即可。

-CPU架构 x86_64 64位
- CPU架构 i686 32位
- 操作系统接口协议 win32 开发windows应用程序
- 操作系统接口协议 posix 开发Linux、Mac应用程序
- 异常处理模型(32bit CPU) dwarf 版本新,性能较好,不支持64位
- 异常处理模型(32bit CPU) sjlj 版本低,同时支持32位和64位
- 异常处理模型(64bit CPU) seh 版本新,性能较好,不支持32位
- 异常处理模型(64bit CPU) sjlj 版本低,但支持32位和64位

点击Next ,其实就是自动下载 x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z,如图:

在这里插入图片描述

安装完成以后如图所示,我觉得路径比较深,个人不太喜欢,等下我会调整下路径:

在这里插入图片描述

但是自动下载有可能失败,所以我在资料里面还提供了 x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z 包,直接解压即可。

x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z(用这个压缩包解压)解压出来内容如下图:

在这里插入图片描述

最后根据自己的安装路径添加环境变量:系统变量中新建添加 D:\Program Files\mingw64\bin

注意!注意!注意!

最后即便这样了,你会发现还是不能make,只需要在mingw64\bin目录下找到mingw32-make.exe 将mingw32-make.exe名字改成make.exe 即可,如下图:

在这里插入图片描述

修改成 make:

在这里插入图片描述

至此,使用CubeMX直接可以生成Makefile 工程,直接make进行编译:

在这里插入图片描述
上图就是使用STM32CubeMX直接生成的工程,直接编译。

4、安装openocd

OpenOCD(Open On-Chip Debugger)是开源片上调试器,OpenOCD旨在提供针对嵌入式设备的调试、系统编程和边界扫描功能。

OpenOCD的功能是在仿真器的辅助下完成的,仿真器是能够提供调试目标的电信号的小型硬件单元。仿真器是必须的,因为调试主机(运行OpenOCD的PC)通常不具备这种电信号的直接解析功能。

通过网站下载OpenOCD的windows包: OpenOCD下载地址

网站如下图所示:

在这里插入图片描述

把下载的压缩包解压出来,这个OpenOC是免安装的,比如我解压在D盘:

在这里插入图片描述

添加环境变量步骤:

在这里插入图片描述

安装完成以后可以查看版本号如下图:

在这里插入图片描述

openocd的操作模式

openocd -f <接口配置文件> -f <目标芯片配置文件> -c <要执行的命令>

比如:

openocd -f interface/stlink-v2.cfg -f target/stm32l0.cfg
openocd -f interface/jlink.cfg -f target/stm32f1x.cfg

如果想了解更多,可以去查看官方的指导手册:openocd官方手册

5、Makefile的修改

Makefile 中的有些语法 是 linux下的,例如下面的clean:

#######################################
# clean up
#######################################
clean:
	-rm -fR $(BUILD_DIR)

在window CMD终端中,make clean是不会成功的,这个时候你需要改成CMD下可以执行的操作:

#######################################
clean:
#	-rm -fR $(BUILD_DIR)
	-del /q $(BUILD_DIR)
  
#######################################

使用CubeMX生成的Makefile,是不支持浮点数打印的,所以需要加上
-u_printf_float -u_sprintf_float,如下图:

# libraries
LIBS = -lc -lm -lnosys 
LIBDIR = 
LDFLAGS = $(MCU) -u_printf_float -u_sprintf_float -specs=nano.specs -T$(LDSCRIPT) $(LIBDIR) $(LIBS) -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref -Wl,--gc-sections

我们目的是使用openocd进行烧录,指令都是上面openocd 使用指令的集合,我们需要使用一个伪指令make download(名字其实按照自己的习惯命名就可以):

# Generate dependency information
CFLAGS += -MMD -MP -MF"$(@:%.o=%.d)"
# 这里需要使用绝对路径,根据自己的环境路径配置
INTERFACE_CFG="D:\Program Files\openocd\share\openocd\scripts\interface\stlink-v2.cfg"
TARGET_CFG="D:\Program Files\openocd\share\openocd\scripts\target\stm32l0.cfg"
# linux下的路径
# INTERFACE_CFG=/usr/local/share/openocd/scripts/interface/stlink-v2.cfg
# TARGET_CFG=/usr/local/share/openocd/scripts/target/stm32l0.cfg 

#######################################
# LDFLAGS
#######################################
...
#######################################
# clean up
#######################################
clean:
	-rm -fR $(BUILD_DIR)

download:
	openocd -f $(INTERFACE_CFG) -f $(TARGET_CFG) -c init -c reset -c halt -c\
	"flash write_image erase $(BUILD_DIR)/$(TARGET).hex" -c reset -c shutdown
	
# 建议使用program,前面不需要加-c reset,实际测试更加稳定
# download:
# 	openocd -f $(INTERFACE_CFG) -f $(TARGET_CFG) -c init -c halt -c\
# 	"program $(BUILD_DIR)/$(TARGET).hex" -c reset -c shutdown
 
#######################################
# dependencies
#######################################

6、烧录过程的说明

make download 的操作:

  1. -f interface/stlink-v2.cfg
    根据相关目录下的文件配置使用J-link还是st_link,
    示例中使用的是stlink
  2. -f target/stm32l0.cfg
    选择对应的芯片配置文件
    示例中使用的是stm32l0系列
  3. -c init 初始化
  4. -c reset 芯片复位 (因为在实际使用中发现烧录完成后会给芯片写保护,导致再次使用此方法无法烧录,必须复位一次)
    经过后来测试发现使用 program xx.hex 指令烧录是不需要在前面在 reset 的,而且每次都能章程烧录
    使用 flash write_image erase xx.hex 有时候会失败,写入以后也会给芯片写保护,需要加reset
  5. -c halt 挂起,等待烧录
  6. -c “flash write_image erase xx.hex” 或者 -c “program xx.hex”
    烧录对应的hex文件
    如果是烧录bin文件,需要指定烧录的起始地址 -c “program xx.bin 0x08000000”
  7. -c reset 芯片复位,自动运行
  8. -c shutdown 自动关闭openocd的操作窗口

7、使用 Jlink 烧录问题说明

以上的步骤我在使用 ST-LINK 的时候一切正常,但是在用到Jlink 的时候,也是遇到了问题,主要是2个问题,一个是Jlink使用SWD模式的问题,另外一个是openocd不识别jlink的问题。

openocd下无法找到J-Link设备:

在这里插入图片描述

7.1 openocd下如何识别J-Link

openocd无法识别jlink的官方的标准驱动,需要修改驱动,怎么修改我也是参照了网上前辈们的总结,需要用到 zadig 这个工具,下面给出官方下载地址:zadig下载地址

如果官方地址下载太慢了,可以到其他网站找找,这个软件我也放在了我上传的工具包里面

exe文件直接运行,软件打开后选择Options,点击List ALL Devices:

在这里插入图片描述

然后再出来的设备中选中Jlink(千万不要乱选,乱选操作失误鼠标键盘什么都用不了了):

在这里插入图片描述

选中后会识别Jlink的版本,点击下面的Replace Driver就可以

还是记住一下自己的版本,因为这个转化是不可逆的,就是你用正常的驱动,Keil能正常用,j-scope,j-flash能正常用,换成这个以后,只能在openocd下使用了!!!

先不慌,后面我还会测试下,如何换回去= =!

在这里插入图片描述

换完驱动后,操作试一下,如下图,可以正常识别出J-Link(其他信息不用在意,下面我们会全部解决):

在这里插入图片描述

7.2 openocd使用 J-Link swd模式

我们在能够识别J-Link后,发现也不能正常烧录,这主要是STM32设置的调试模式问题,我们现在开发一般使用的都是SWD模式:

在这里插入图片描述

然而我们可以看看 在openocd的相关路径下面 openocd\scripts\interface\jlink.cfg文件:

在这里插入图片描述

只是把设备选成了Jlink,没有做别的任何处理,所以我们选择swd模式无法调试下载,虽然我们可以在指令中直接加上 transport select swd,但是为了以后方便,我们可以自己做一个cfg文件,如图:

在这里插入图片描述

保存以后再根据我们前面讲过的知识,Makefile中添加如下(换了一套电脑,所以路径有点不一致):

#省略
INTERFACE_CFG="D:\OpenOCD-20210729-0.11.0\share\openocd\scripts\interface\jlink-swd.cfg"
TARGET_CFG="D:\OpenOCD-20210729-0.11.0\share\openocd\scripts\target\stm32f1x.cfg"
#省略
#######################################
clean:
#	-rm -fR $(BUILD_DIR)
	-del /q $(BUILD_DIR)

down: 
	openocd -f $(INTERFACE_CFG) -f $(TARGET_CFG) -c init -c halt -c \
	"program $(BUILD_DIR)/$(TARGET).hex" -c reset -c shutdown 

#######################################

最终,使用J-Link正常烧录:

在这里插入图片描述

7.3 J-Link 恢复到 SEGGER J-Flash 使用

在这里插入图片描述

点击卸载设备,勾选删除此设备的驱动程序软件进行卸载。

删除完成后,重新拔插J-link,我这边测试,因为本身电脑上有官方的驱动,所以居然自动识别出了,然后在Keil下测试了一下,也能识别烧录:

在这里插入图片描述

通过 Keil 工具查看:

在这里插入图片描述

OK,这样我们就还原成功!当然这个时候,openocd是用不了了,不过我这里只是为了测试下如何还原,不至于使得J-Link变砖。

7.4 换板子出现的Jlink烧录问题(未解决)

最近用了另外一块L051的板子在上次修改的Jlink上面烧录,发现出现如下问题:

在这里插入图片描述
这个网上查了很多,也没直接得到答案,自己也修改过配置,也没有得到答案。

网上所谓的改stm32l0.cfg文件中的reset_config srst_nogate或者是set _WORKAREASIZE 0x800都试过没用的:

在这里插入图片描述

折腾了好一段时间,最后还是换成ST-link烧录的。

8、gcc下pirntf 的重定义

我们以前在Keil开发STM32的时候,printf都需要重定义才能正常观察打印结果,在gcc下和Keil下的重定义是不一样的,我直接给出我使用的方式:

/* USER CODE BEGIN 0 */
#if 1
#include <stdio.h>

#ifdef __GNUC__
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
  PUTCHAR_PROTOTYPE
  {
    HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, HAL_MAX_DELAY);
    return ch;
  }
  int _write(int file, char *ptr, int len)
  {
    int DataIdx;
      for (DataIdx = 0; DataIdx < len;DataIdx++){
            __io_putchar(*ptr++);
      }
      
    return len;
  }
  
  #else
    /* 告知连接器不从C库链接使用半主机的函数 */
  #pragma import(__use_no_semihosting)

  /* 定义 _sys_exit() 以避免使用半主机模式 */
  void _sys_exit(int x)
  {
      x = x;
  }

  /* 标准库需要的支持类型 */
  struct __FILE
  {
      int handle;
  };

  FILE __stdout;

  int fputc(int ch, FILE *stream)
  {
      /* 堵塞判断串口是否发送完成 */
      while((USART1->ISR & 0X40) == 0);

      /* 串口发送完成,将该字符发送 */
      USART1->TDR = (uint8_t) ch;

      return ch;
  }
    #endif	
#endif

二、使用 VScode插件Embedded IDE进行开发

1、安装 Embedded IDE插件

这种方法其实PC上还是得安装一下KEIL,使用这种方式的好处在于,VScode的代码编辑功能完爆KEIL太多了。在 VScode的 插件中,搜索 Embedded IDE :

在这里插入图片描述

如果自动安装失败,可以到下面这个网址找到插件包,自动安装:Embedded IDE离线安装包

在这里插入图片描述

下载好以后,在VScode插件栏目中,选择从VSIX安装,如下图所示:

在这里插入图片描述

对于这个插件的使用,插件的作者本身其实已经写了很多很详细的,这里给个传送门使用文档

2、Embedded IDE插件配置操作说明

我这边分别针对STM32F系列和nRF52832系列做一下简单演示,找到插件点击安装,安装好以后再VScode左边的工具栏会多出Embedded IDE 的图标,点击打开IDE的工作区域:

在这里插入图片描述

第一步,设置工具链路径,点击IDE工作区域的 设置工具链路径栏目,在弹出的界面中选择Keil安装路径中的 TOOLS.INI 文件:

在这里插入图片描述
上图操作完会弹出选择界面,选择KEIL5 安装路径下面的 TOOLS.INI 文件:

在这里插入图片描述
完成上述配置后,就可以导入项目了,我们先找一个STM32F103的项目测试下:

在这里插入图片描述
右下角会弹出项目是否将 EIDE 与原有的KEIL项目存于同一目录下,我这里作为测试,选择NO,然后得自己新建一个文件夹放置工程:

在这里插入图片描述

自己找位置选择一个文件夹(最好是英文不带空格),然后在弹出的是否立即切换工作区,选择继续:

在这里插入图片描述

EIDE工程就打开了,打开工程他会自动切换到 左边 Vscode资源管理器工作区栏目,但是我们的一些配置需要选中 左边EIDE:

在这里插入图片描述

3、STM32F103 工程编译烧录示例

配置好以后就可以进行编译了,编译的小按钮,编译成功如下图:

在这里插入图片描述

如果需要单步调试,需要安装Cortex-Debug,我这边的ST_linK调试还是有点问题,这里就不演示了,直接点击烧录测试:

在这里插入图片描述

4、nRF52832 工程编译烧录示例

下面我们找一个nRF52832的工程,按照步骤导入:

在这里插入图片描述

还是一样配置好,其他东西都是默认就可以,还是可以正常编译和烧录:

在这里插入图片描述

烧录过程:

在这里插入图片描述

结语

最近因为买了新电脑,所以又重复了一遍,来更新了一下文章,其实通用的方式还是第一种。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。