使用下一代的嵌入式IDE-PlatformIO 教程

简介

随着物联网近年来飞速的发展,嵌入式软件开发领域的发展也随之有所发展。集成开发环境Integrated Development Environment,简称IDE,在任何软件开发中都是最重要的部分之一。

在以前,用来开发嵌入式应用的IDE通常是MDK Keil、IAR。但是上述IDE都是10年前的水平,从UI界面到稳定性都令人不满。所幸的是,新的IDE终于出现了,叫做PlatformIO。

Platform是基于Visual Studio Code(vscode),利用了vscode强大的扩展extension功能,使得开发者可以在vscode中直接调用gcc、jlink、gdb等进行开发、调试。

PlatformIO只是一个集成开发环境,其本身几乎不包括任何实质性功能,但是其集成了很多了例如编译器、调试器等,主要包括以下:

  • vscode
  • gcc编译器,版本:arm-none-eabi-gcc (针对arm内核嵌入式设备的专属c语言编译器)
  • gdb调试器
  • jlink 驱动
  • Scons构建工具、

以下是我实际使用的截图:
主页:
使用下一代的嵌入式IDE-PlatformIO 教程_第1张图片
设备管理页面:
使用下一代的嵌入式IDE-PlatformIO 教程_第2张图片
debug界面:
使用下一代的嵌入式IDE-PlatformIO 教程_第3张图片





安装PlatformIO

先安装vscode:https://code.visualstudio.com/
安装好之后,点击最左侧的工具栏,找到扩展,搜索PlatformIO,点击安装即可,安装好后会让你重启vscode。

PlatformIO作为一个集成开发环境,只有其本身的安装包是托管在vscode官方上的,其他的很多东西都需要从第三方网站进行下载。所以PlatformIO安装过程比较缓慢。

作者注:
为了写这篇文章,我已经去阅读了PlatformIO的源码,从其中扣出了第三方包的下载网站是这里:http://dl.bintray.com/platformio/dl-packages/,并且看到其下载是使用python的request模块进行下载的(关键代码)。 而再google一下,发现可以设置 HTTP_PROXYHTTPS_PROXY 两个环境变量,来设置下载代理。

综上所述,如果你的下载速度过慢,那么你可以直接上面的网站下载第三方包之后拷贝到C:/.platformio目录里面合适的位置中去 或者 需要速度快一点的梯子来做个代理。 (由于合适的位置我也不知道是哪里,所以推荐后者)




新建工程

安装好之后,会提示让你重启vscode,重启之后,即可进入主界面,如下图所示。
使用下一代的嵌入式IDE-PlatformIO 教程_第4张图片

点击New Project,根据你的需要选择:

  • Name: 项目名称
  • Board:硬件平台,Generic代表裸板,其他的可选择STM3210C-EVAL这样的官方开发板。对于官方开发板,有些是板上自带的st-link或者是针对arduino的开发板,如果选择了的话,会自动帮你选择对应的st-link或者arduino框架
  • Framework:编程框架。 例如STM32HAL库、标准库、ARM CMSIS库等。
  • Location:项目位置。

使用下一代的嵌入式IDE-PlatformIO 教程_第5张图片

这里我选择是STM32Cube(其实就是STM32HAL库),选择之后会进入下载中,这里和上述提到的安装中一样,回去第三方下载HAL库,过程会比较久。解决办法也是和上面一样:
手动去第三方网站下 或者 使用梯子代理

使用下一代的嵌入式IDE-PlatformIO 教程_第6张图片



编译调试

创建好项目之后,使用快捷键 ctrl+k ctrl+o打开项目文件夹,在./src目录下新建一个main.c文件进行测试,文件内容如下:

#include "stm32f1xx_hal.h"
static int a = 1;
// static char str[50] = "Hello PlatformIO";
void SystemClock_Config(void);
int main(void) {
     
    HAL_Init();
    SystemClock_Config();
    while(1) {
     
        __NOP();
    }
}

void SystemClock_Config(void)
{
     
  RCC_OscInitTypeDef RCC_OscInitStruct = {
     0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {
     0};

  /** Initializes the CPU, AHB and APB busses clocks 
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
     
  }
  /** Initializes the CPU, AHB and APB busses clocks 
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
     
  }
}

然后在每一步都打上一个断点,等一下进行断点调试。
使用下一代的嵌入式IDE-PlatformIO 教程_第7张图片
还需要在platformio.ini中指定一下调试工具,这里我用的是jlink:

; PlatformIO Project Configuration File
;
;   Build options: build flags, source filter
;   Upload options: custom upload port, speed and extra flags
;   Library options: dependencies, extra library storages
;   Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html

[env:genericSTM32F103RC]
platform = ststm32
board = genericSTM32F103RC
framework = stm32cube
debug_tool = jlink

最后点击左侧的这个调试按钮切换到调试窗口,点击这个绿色的箭头进行调试。

使用下一代的嵌入式IDE-PlatformIO 教程_第8张图片
最终的效果如下所示,可以看到在左侧:

  • 查看watch变量
  • 查看调用栈
  • 查看所有的断点
  • 查看ADC、USART等外设寄存器
  • 查看R0~R15等通用寄存器
  • 直接根据内存地址查看数据
  • 查看汇编代码

使用下一代的嵌入式IDE-PlatformIO 教程_第9张图片


至此,关于PlatformIO的基本介绍就结束了,但是实际上我们使用PlatformIO还会涉及到更多的知识,如果你有兴趣欢迎查看我的下一篇文章: 嵌入式IDE-PlatformIO结合STM32CubeMX

你可能感兴趣的:(嵌入式,STM32,嵌入式,stm32,单片机,物联网,ide)