vscode stm32cubemx 优雅开发stm32,最简单步骤教程

配置安装环境

  1. 下载STM32cubeMX,这个大家可以自己在stm的官网下载到
  2. 下载VSCode
  3. 下载arm-none-eabi-gcc
  4. 下载MinGW-w64,为了实现里面的makefile 等功能
  5. 下载OpenOCD这里用来调试stm32,支持jlink stlink daplink

上述安装步骤1、安装步骤2在这里比较简单,就不赘述了

安装arm-none-eabi-gcc:

 此处我们下载zip包,方便安装。

以我为例,我们解压到 E:\Tools\ 目录下

安装MinGW-w64

此处我们同样下载zip包,安装比较方便,注意一定要安装上述划线的版本

 以我为例,我们解压到 E:\Tools\ 目录下

安装openocd

 此处我们下载最新的版本

以我为例,我们解压到 E:\Tools\ 目录下

通过stm32cubemx新建一个例程

这里以我的开发板为例,使用的是stm32f407vgt6,我们创建一个工程

配置一下SWD调试

 配置外部8mhz晶振

 配置PA1,用作测试LED

 配置usart1作为串口输出测试

 

 配置时钟,完成最后一步工作

 这里我们选择makefile,即可,点击generate code

通过vscode 生成刚刚用stm32cubemx 创建的工程

 在这里,我们在扩展中找到插件并安装

  • C/C++
  • Cortex-Debug
  • stm32-for-vscode

 刚刚下载的工具我都放在这个目录了,如图所示

 

 为了使用方便,我稍微改下名字

这样就舒服多了

 安装好stm32-for-vscode以后,我们会发现侧边栏增加了一个图标:

 按照上述提示,我们导入相应的工具

这里已经配置成我的路径了

重新打开vscode,即可看到变化

几个选项分别为

  • 编译
  • 全编译
  • 烧录到stm32
  • 调试stm32
  • 修改下载工具

 我简单演示一下,首先我们选择自己的编译工具,例如我这边使用的是dap-link

 我们看到这里已经选择成功了,那么我们先点击build

 已经生成成功了,我们看到编译速度是keil的指数级的提升

我们点击flash stm32,即可看到已经下载成功了!

最基本的操作已经可以了,编译下载一条龙,那么接下来我们试试调试功能。

 使用vscode调试

我们在代码里简单添加一些代码,作为调试的现象

不出意外的话,我们可以在debug中观察到i的变化

那么我们来试一下吧,点击build,再点击 debug在 printf 处添加断电

可以看到我们已经进入到调试的模式了,那么我们新增一个监视来监视i

 

 此时i的值为0,我们在全速运行两次次试试

 

可以看到,我们已经有i的值的变化,也在串口输出了值,符合我们的预期

这种开发方式已经可以替代keil了 

最后小结

那么我们知道,在keil中调用printf 只需要在前面增加putc函数即可,那在这种开发方式中,我们如何添加函数,使得可以printf。

很简单,只需要将下述代码复制到头,并且包含stdio.h即可

int _write(int fd, char *ch, int len)
{
  HAL_UART_Transmit(&huart1, (uint8_t*)ch, len, 0xFFFF);
  return len;
}

进一步更新使用C++

如果使用C++来编写工程的话,我们发现本来的printf不行了,怎么回事呢

很简单,这里借鉴可以新增两个文件 target.h,插入一下内容

#ifndef _RETARGET_H__
#define _RETARGET_H__
#include "stm32f4xx_hal.h"
#include <sys/stat.h>
#include <stdio.h>

#ifdef __cplusplus
extern "C" {
#endif

void RetargetInit(UART_HandleTypeDef *huart);
int _isatty(int fd);
int _write(int fd, char *ptr, int len);
int _close(int fd);
int _lseek(int fd, int ptr, int dir);
int _read(int fd, char *ptr, int len);
int _fstat(int fd, struct stat *st);

#ifdef __cplusplus
}
#endif

#endif //#ifndef _RETARGET_H__

再新增一个target.c

#include <_ansi.h>
#include <_syslist.h>
#include <errno.h>
#include <sys/time.h>
#include <sys/times.h>
#include <retarget.h>
#include <stdint.h>
#if !defined(OS_USE_SEMIHOSTING)
#define STDIN_FILENO  0
#define STDOUT_FILENO 1
#define STDERR_FILENO 2

UART_HandleTypeDef *gHuart;

void RetargetInit(UART_HandleTypeDef *huart)
{
    gHuart = huart;
    /* Disable I/O buffering for STDOUT stream, so that
     * chars are sent out as soon as they are printed. */
    setvbuf(stdout, NULL, _IONBF, 0);
}
int _isatty(int fd)
{
    if (fd >= STDIN_FILENO && fd <= STDERR_FILENO)
        return 1;
    errno = EBADF;
    return 0;
}
int _write(int fd, char *ptr, int len)
{
    HAL_StatusTypeDef hstatus;
    if (fd == STDOUT_FILENO || fd == STDERR_FILENO)
    {
        hstatus = HAL_UART_Transmit(gHuart, (uint8_t *) ptr, len, HAL_MAX_DELAY);
        if (hstatus == HAL_OK)
            return len;
        else
            return EIO;
    }
    errno = EBADF;
    return -1;
}
int _close(int fd)
{
    if (fd >= STDIN_FILENO && fd <= STDERR_FILENO)
        return 0;
    errno = EBADF;
    return -1;
}
int _lseek(int fd, int ptr, int dir)
{
    (void) fd;
    (void) ptr;
    (void) dir;
    errno = EBADF;
    return -1;
}
int _read(int fd, char *ptr, int len)
{
    HAL_StatusTypeDef hstatus;
    if (fd == STDIN_FILENO)
    {
        hstatus = HAL_UART_Receive(gHuart, (uint8_t *) ptr, 1, HAL_MAX_DELAY);
        if (hstatus == HAL_OK)
            return 1;
        else
            return EIO;
    }
    errno = EBADF;
    return -1;
}
int _fstat(int fd, struct stat *st)
{
    if (fd >= STDIN_FILENO && fd <= STDERR_FILENO)
    {
        st->st_mode = S_IFCHR;
        return 0;
    }
    errno = EBADF;
    return 0;
}
#endif //#if !defined(OS_USE_SEMIHOSTING)

就可以继续使用print了,甚至是cout也完全没有问题

  while (1)
  {
    /* USER CODE END WHILE */
    printf("test i = %d \n", i++);
    std::cout << 123 << std::endl;
    HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_1);
    HAL_Delay(1000);
    /* USER CODE BEGIN 3 */
  }

面对_exit等报错,我们这里需要在STM32-for-VSCode.config.yaml这个文件中新增选项,就可以没有报错了

# Compiler flags
cFlags: []
cxxFlags: []
assemblyFlags: []
linkerFlags: 
  - -specs=nano.specs
  - -Wl,--gc-sections
  - -ffreestanding -flto
  - -specs=nosys.specs #新增这个选项

  • 15
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: VSCodeSTM32CubeMX是两个不同的工具,可以结合使用来进行STM32开发VSCode是一款轻量级的代码编辑器,支持多种编程语言和插件扩展,可以通过安装插件来实现对STM32开发的支持。例如,安装C/C++插件和ARM插件可以实现对STM32的编译、调试和烧录等功能。 STM32CubeMX是一款图形化的STM32配置工具,可以帮助开发者快速生成STM32项目的代码框架和初始化代码。可以通过生成的代码框架和初始化代码来快速开发STM32应用程序。 在使用VSCodeSTM32CubeMX进行STM32开发时,可以先使用STM32CubeMX生成项目代码框架和初始化代码,然后在VSCode中进行代码编写、编译、调试和烧录等操作。通过结合使用这两个工具,可以提高STM32开发的效率和质量。 ### 回答2: VSCodeSTM32CubeMX均是非常实用的开发工具,都有着自己的优点和适用场景。 首先,VSCode作为一款轻量级、高效率的文本编辑器,具有开源、跨平台的优点,适用于各种程序开发的需求,特别是针对C++语言的开发有非常出色的支持,拥有各种功能丰富的插件以及可自定义的配置,使得程序开发更加便捷。 而STM32CubeMX是一款用于STM32系列芯片开发的可视化工具,其可以非常方便地进行代码生成、硬件配置等操作,快速搭建起STM32芯片的开发环境。同时,STM32CubeMX还具有各种功能模块(如对PWM、ADC等的支持),方便用户开发新的项目。 那么,VSCodeSTM32CubeMX结合起来,就可以带来更加高效、便捷的开发体验了。 一方面,VSCode支持各种编程语言的开发,并且作为一个优秀的编辑器,体验也更加流畅。用户可以用VSCode进行STM32CubeMX生成的代码的开发、编译等工作,并同时可以使用丰富的VSCode插件(如Git、IntelliSense等)帮助自己更加高效地开发项目。 另一方面,STM32CubeMX则可以帮助用户极大地降低STM32开发的门槛。通过鼠标点选,硬件配置、代码生成过程可以被轻松地完成,还可以轻松添加和删除硬件功能模块进入项目。在整个开发流程中,STM32CubeMX可以帮助用户大大减少了编码的时间以及代码调试的难度,从而使得整个开发流程更加高效。 总的来说,VSCodeSTM32CubeMXSTM32程序开发中都有着各自独特的优势和作用,搭配使用更是能够带来事半功倍的效果。 ### 回答3: 在进行STM32开发时,选择合适的开发工具和方式是非常重要的。VSCodeSTM32CubeMX都是非常受欢迎的开发工具,但是它们各自有着不同的优势和特点。 VSCode是一款由微软开发的轻量级开源编辑器,它可以支持多种编程语言,包括C/C++。VSCode的优势在于其丰富的插件生态系统和高度的可扩展性。VSCode可以通过安装不同的插件来提升其对不同开发环境的支持,例如C++插件可以提供代码补全、文本高亮、调试工具等功能。同时,VSCode也可以通过自定义设置来满足不同开发者的需求。因此,VSCode是非常适合那些喜欢自定义配置和寻求高度可扩展性的开发者。 STM32CubeMX是一个工具,可帮助快速配置嵌入式应用程序的外设和代码框架。它提供了一种图形化的用户界面,允许用户轻松选择和配置不同的外设。这极大地简化了嵌入式系统开发的流程,使开发者可以更专注于软件开发。使用STM32CubeMX还可以自动生成C代码,包括启动文件、中断处理程序、外设驱动程序等。这些代码框架可以帮助开发者快速启动项目,并提高代码的质量和可读性。 综上所述,VSCodeSTM32CubeMX都有其优点,开发者需要根据具体开发需求和个人偏好来选择适合自己的工具。如果需要高度可扩展性和自定义设置,可以选择VSCode;如果需要快速配置外设并自动生成C代码,可以选择STM32CubeMX。同时,它们也可以结合使用,以实现更高效的开发

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值