使用VSCode和VS2017编译调试STM32程序的实现

yizhihongxing

使用VSCode和VS2017编译调试STM32程序的实现

本文将介绍如何使用Visual Studio Code和Visual Studio 2017编译和调试STM32程序的实现。

一、开发环境搭建

在开始之前,需要确认电脑上是否已安装以下必要的软件:

  • Visual Studio Code (简称VSCode)
  • Visual Studio 2017 (简称VS2017)
  • GNU ARM Embedded Toolchain
  • ST-Link驱动程序
  • STM32CubeMX

其中,GNU ARM Embedded Toolchain用于生成可执行二进制文件,ST-Link驱动程序用于将生成的二进制文件下载到芯片上,STM32CubeMX用于生成项目代码框架和初始化。

下载完以上软件后,需要将GNU ARM Embedded Toolchain和STM32CubeMX的路径添加到系统环境变量PATH中。例如,假如将这两个软件安装在D:\Program Files目录下,则需要将D:\Program Files\GNU Tools ARM Embedded\7 2018-q2-update\bin和D:\Program Files\STMicroelectronics\STM32Cube\STM32CubeMX\bin路径添加到环境变量PATH中。

二、创建工程

1.打开STM32CubeMX,创建一个新工程。根据实际情况选择芯片类型和工作模式,在"Project Settings"中可以进行更详细的设置。

2.完成工程配置后,点击左上角的"Generate Code"按钮生成项目代码。

3.打开VSCode,从"File"菜单中选择"Open Folder",并打开STM32CubeMX生成的代码所在的文件夹。

4.在VSCode的"Explorer"中打开".vscode"文件夹,创建"launch.json"文件。将以下代码复制粘贴到"launch.json"文件中:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Debug STM32",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/Debug/${workspaceFolderBasename}.elf",
            "cwd": "${workspaceFolder}",
            "externalConsole": true,
            "debugServerArgs": "-d",
            "linux": {
                "MIMode": "gdb"
            },
            "windows": {
                "MIMode": "gdb"
            },
            "pipeTransport": {
                "pipeCwd": "${workspaceFolder}",
                "pipeProgram": "C:/WinGDB/bin/wingdb-remote.exe",
                "debuggerPath": "arm-none-eabi-gdb.exe",
                "pipeArgs": ["localhost:3333"],
                "filterStderr": true,
                "filterStdout": true,
                "stopOnEntry": false,
                "showDevDebugOutput": true
            },
            "sourceFileMap": { "/mnt/c": "C:"}
        }
    ]
}

该配置文件指示VSCode使用GNU ARM Embedded Toolchain的arm-none-eabi-gdb调试器,并连接到STM32芯片,可以正常执行程序。
注意,需要将"pipeProgram"和"debuggerPath"路径修改为实际路径。

完成"launch.json"文件的编辑后,保存并关闭。

三、编写代码

在VSCode的"Explorer"中,找到"Src"文件夹下的"main.c"文件。本文以一个简单的LED闪烁程序作为示例:

#include "stm32f1xx.h"

int main(void)
{
  RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;
  GPIOC->CRH &= ~(GPIO_CRH_CNF13 | GPIO_CRH_MODE13);
  GPIOC->CRH |= GPIO_CRH_MODE13_0;

  while (1)
  {
    GPIOC->BSRR = GPIO_BSRR_BS13;
    for (int i = 0; i < 100000; i++);
    GPIOC->BSRR = GPIO_BSRR_BR13;
    for (int i = 0; i < 100000; i++);
  }
}

该代码实现了一个LED灯的闪烁,使用了STM32F103芯片的GPIOC13引脚输出信号。

完成代码编辑后,保存并关闭。

四、编译和调试

在VSCode中按下F5,或通过"Run"菜单中的"Start Debugging"选项,启动调试。在调试面板的控制台中可以看到调试器与STM32芯片的交互信息。

如果一切正常,程序会开始在芯片上执行,并实现LED灯的闪烁。

由此可见,使用VSCode和VS2017编译调试STM32程序还是比较简单的,只需要安装好相应的软件并进行简单的配置即可。

示例1

下面给出一个简单的USART1串口输出实例,只需在STM32CubeMX中进行USART1初始化配置,然后在main函数中添加如下代码即可:

#include "stm32f1xx.h"
#include <stdio.h>

void USART1_Init(void)
{
  RCC->APB2ENR |= RCC_APB2ENR_USART1EN | RCC_APB2ENR_IOPAEN;
  GPIOA->CRH &= ~(GPIO_CRH_CNF9 | GPIO_CRH_MODE9 | GPIO_CRH_CNF10 | GPIO_CRH_MODE10);
  GPIOA->CRH |= GPIO_CRH_CNF9_1 | GPIO_CRH_MODE9 | GPIO_CRH_CNF10_0;
  USART1->BRR = 0x341; //115200@72M
  USART1->CR1 |= USART_CR1_RE | USART_CR1_TE | USART_CR1_UE;
}

int _write(int fd, char *ptr, int len)
{
  for (int i = 0; i < len; i++)
  {
    while (!(USART1->SR & USART_SR_TXE));
    USART1->DR = *ptr++;
  }

  return len;
}

int main(void)
{
  USART1_Init();

  printf("Hello, world!\n");

  while (1);
}

示例2

下面给出一个简单的I2C读写实例,只需在STM32CubeMX中进行I2C初始化配置,然后在main函数中添加如下代码即可:

#include "stm32f1xx.h"
#include <stdio.h>

void I2C_WriteByte(I2C_HandleTypeDef *hi2c, uint8_t addr, uint8_t data)
{
  while (hi2c->State != HAL_I2C_STATE_READY);
  HAL_I2C_Mem_Write(hi2c, addr, 0x00, 1, &data, 1, HAL_MAX_DELAY);
}

uint8_t I2C_ReadByte(I2C_HandleTypeDef *hi2c, uint8_t addr)
{
  uint8_t data = 0;
  while (hi2c->State != HAL_I2C_STATE_READY);
  HAL_I2C_Mem_Read(hi2c, addr, 0x00, 1, &data, 1, HAL_MAX_DELAY);
  return data;
}

int main(void)
{
  HAL_Init();
  __HAL_RCC_GPIOB_CLK_ENABLE();

  GPIO_InitTypeDef GPIO_InitStruct = {0};
  GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  __HAL_RCC_I2C1_CLK_ENABLE();

  I2C_HandleTypeDef hi2c1 = {0};
  hi2c1.Instance = I2C1;
  hi2c1.Init.ClockSpeed = 100000;
  hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
  hi2c1.Init.OwnAddress1 = 0;
  hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  hi2c1.Init.OwnAddress2 = 0;
  hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
  if (HAL_I2C_Init(&hi2c1) != HAL_OK)
  {
    Error_Handler();
  }

  I2C_WriteByte(&hi2c1, 0x00, 0x01);
  uint8_t data = I2C_ReadByte(&hi2c1, 0x00);

  while (1);

  HAL_I2C_DeInit(&hi2c1);
}

至此,示例代码就讲解完毕了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用VSCode和VS2017编译调试STM32程序的实现 - Python技术站

(1)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • C语言 坐标移动详解及实例代码

    C语言 坐标移动详解及实例代码攻略 坐标移动的概念 在计算机中,坐标移动是指移动一个对象或点的位置以改变其在屏幕上显示的位置。在C语言中,使用结构体来表示坐标,并利用操作结构体的函数来实现坐标移动的功能。 坐标移动的实现步骤 定义结构体 首先,需要定义表示坐标的结构体。一般来说,坐标结构体包含两个变量:x坐标和y坐标。以下是一个示例程序: typedef s…

    C 2023年5月24日
    00
  • C 程序 对字符串集排序

    下面是详细讲解“C 程序 对字符串集排序”的完整使用攻略。 概述 在 C 语言中,我们可以使用 qsort() 函数对字符串集进行排序。具体来说,我们需要填写几个参数,包括要排序的字符串数组指针、字符串数组中字符串的个数、每个字符串的长度、和一个比较函数指针。比较函数指针是用来告诉 qsort() 函数如何进行排序的,这个函数会比较两个字符串,然后返回一个负…

    C 2023年5月9日
    00
  • 金士顿DT70怎么样 金士顿DT70USB-C闪存盘评测

    金士顿DT70USB-C闪存盘评测攻略 一、产品介绍 金士顿DT70USB-C闪存盘是一款最新推出的USB-C闪存盘,容量覆盖32GB、64GB和128GB三种。具有高速读写、持久耐用和多平台通用等特点,可广泛应用于PC、手机、平板、电视等设备中。 二、技术规格 规格 描述 存储容量 32GB/64GB/128GB 接口类型 USB-C 读取速度 最高可达2…

    C 2023年5月23日
    00
  • C语言职工管理系统设计

    C语言职工管理系统设计攻略 目录 概述 界面设计 功能设计 代码实现 示例说明 总结 1. 概述 C语言职工管理系统设计是一个基于控制台的应用程序,旨在设计一个能够管理职工信息的管理系统,方便管理员有效地管理职工信息。 本系统的主要功能包括:添加职工、显示职工、删除职工、修改职工、查找职工、排序职工等。 2. 界面设计 首先,需要针对系统的功能进行界面设计,…

    C 2023年5月23日
    00
  • 最新C语言中getchar的使用

    对于最新C语言中getchar的使用,我可以给出以下完整攻略: 1. getchar函数的介绍 getchar函数是C语言标准库中的一个常用函数,在程序中用来获取从键盘输入的字符,并返回字符的ASCII码值。getchar函数的原型如下所示: int getchar(void); 2. getchar函数的使用方法 使用getchar函数,在程序运行时等待用…

    C 2023年5月24日
    00
  • C语言指针如何实现字符串逆序反转

    要实现字符串逆序反转,首先需要理解C语言指针和字符串的相关知识。 在C语言中,字符串是一个字符数组,可以使用指针来表示。指针是一个变量,其存储的值是另外一个变量的地址。因此,指针可以用于访问和修改内存中的值。 要实现字符串逆序反转,可以使用指针来遍历字符串中的每个字符,然后将它们按照相反的顺序存储在另一个字符数组中。具体过程可以分为以下几步: 找到字符串的长…

    C 2023年5月23日
    00
  • 邻接表无向图的Java语言实现完整源码

    如果要实现一个邻接表无向图的Java程序,需要进行以下几个步骤: 1. 定义节点类 首先定义一个节点类来存储图中的每个节点以及它们之间的关系(边): class Node { int label; // 节点编号 List<Node> edges = new LinkedList<>(); // 存储与该节点相连的边 Node(int…

    C 2023年5月22日
    00
  • springboot 全局异常处理和统一响应对象的处理方式

    Spring Boot 全局异常处理和统一响应对象的处理方式攻略 在 Spring Boot 应用程序中,异常处理是一个非常重要的部分。为了提高异常处理的效率,我们可以采用全局异常处理和统一响应对象的处理方式。在本篇文章中,我们将为大家介绍如何实现这样一个功能。 全局异常处理 通常情况下,我们会为每个 Controller 编写异常处理,这种方式效率非常低。…

    C 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部