学了近2年的 Arduino,终于下定决心开始学习 STM32 了,感觉是个好大的坑,以及从最基础的环境配置开始1:
一、STM32CubeIDE
STM32CubeIDE 是一款官方基于eclipse的集成开发工具,可以前往 STM32CubeIDE下载地址 进行下载,完全免费,并且跨平台,下载前需要通过邮箱进行验证,亲测163邮箱秒发。
Ubuntu 系统使用 Debian Linux 的版本,下载完成后是zip的压缩包,700多MB。
通过 unzip 指令解压后,通过 chmod 赋予文件所有用户的可执行权限,并运行可执行文件。
sudo chmod u+x st-stm32cubeide_xxx_amd64.deb_bundle.shsudo ./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 还没有尝试,但这两个都需要编程器,所以等我先攒够钱再说。