994 字
5 分钟
STM32CubeIDE 配置开发环境
2021-09-14

学了近2年的 Arduino,终于下定决心开始学习 STM32 了,感觉是个好大的坑,以及从最基础的环境配置开始1

一、STM32CubeIDE#

STM32CubeIDE 是一款官方基于eclipse的集成开发工具,可以前往 STM32CubeIDE下载地址 进行下载,完全免费,并且跨平台,下载前需要通过邮箱进行验证,亲测163邮箱秒发。

Ubuntu 系统使用 Debian Linux 的版本,下载完成后是zip的压缩包,700多MB。

通过 unzip 指令解压后,通过 chmod 赋予文件所有用户的可执行权限,并运行可执行文件。

Terminal window
sudo chmod u+x st-stm32cubeide_xxx_amd64.deb_bundle.sh
sudo ./st-stm32cubeide_xxx_amd64.deb_bundle.sh

然后就是漫长的产品说明和责任划分,得一行一行来,还需要人时不时需要输入 Y,输错一次就要重新来过…

历经了我也不知道多少次的手抽,STM32CubeIDE installed successfully

通过程序图标打开软件后,整个IDE基本完成安装。

二、新建STM32项目#

完成后点击 Start new SMT32 Project(新建STM32项目),第一次新建项目需要加载一些固件和配置信息会比较久。

我所使用的开发板的核心芯片是 STM32F103C8T6,淘宝链接: STM32F103C8T6的开发板

Project >> Properties >> C/C++ Build 中选择 Convert to Intel Hex file 生成Hex文件,之后构建项目后就能生成 HEX 文件了。

三、使用STM32点个灯#

STM32CubeIDE 具备一定的可视化编程,在对应的 .ioc文件 中设置 PC13 为 GPIO_OUTPUT 并保存后,会在 main.c 中增加关于 PC13 的相关定义。

将如下代码复制到 main.c 文件中,并通过快捷键 Ctrl + B(Build All),就能在项目文件夹中生成程序的 .hex 文件。

#include "main.h"
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
while (1)
{
for (int i = 0; i < 3; i++) {
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
HAL_Delay(500);
}
}
}
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLKRCC_CLOCKTYPE_SYSCLK
RCC_CLOCKTYPE_PCLK1RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
}
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOC_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
/*Configure GPIO pin : PC13 */
GPIO_InitStruct.Pin = GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
}

四、烧录芯片#

方法1:在 Windows 使用 Flymcu 或 mcuisp 等工具实现通过串口烧录程序2#

软件下载地址:FlyMcu/mcuisp

我用了一个 USB 转 TTL 的转接器,将转接器的 3V3 和 GND 与开发板连接,由于 STM32F103C8 中 A9为TX、A10为RX,所以将转接器的 RX 与 A9、TX 与 A10 进行连接。

烧录程序前还需要调整芯片的启动模式,调整 BOOT0 为1,BOOT1 为0,下载完成后再调整 BOOT0 和 BOOT1 均为0。

关于这个启动模式可参考文章:关于STM32的BOOT0和BOOT13

搜索到串口后,如果无法打开串口或响应超时,是因为没有在下载前按 RESET 进行复位。

方法2:使用 STM32CubeProgrammer 实现通过串口烧录程序#

STM32CubeProgrammer 同时支持 Linux 和 Windows 平台,附上下载链接:STM32CubeProgrammer4

关于接线和启动模式和方法1相同:

步骤1:进入 Erasing & proramming界面,左侧第2个按钮。

步骤2:刷新并选择对应的串口进行连接,注意右侧选择的是UART选项。

步骤3:选择烧写的文件支持hex、elf等格式,注意路径不能包含中文,不然步骤4会闪退。

步骤4:点击 Start Program… 烧录程序,不需要按复位按键即可完成烧录。

目前还有两种方法,分别是 STLink 和 JLink 还没有尝试,但这两个都需要编程器,所以等我先攒够钱再说。

Footnotes#

  1. ubuntu下stm32开发环境的搭建(从零到点灯)

  2. 如何通过串口给STM32 烧录HEX文件

  3. 关于STM32的BOOT0和BOOT1

  4. STM32CubeProgrammer基础使用说明

STM32CubeIDE 配置开发环境
https://fuwari.vercel.app/posts/嵌入式/stm32/stm32cubeide-配置开发环境/
作者
Asuwee
发布于
2021-09-14
许可协议
CC BY-NC-SA 4.0