STM32CubeMX
这个正常去官网下载最新版的安装就行了:https://www.st.com/en/development-tools/stm32cubemx.html
或者在我的阿里云盘下载:SetupSTM32CubeMX-6.8.1-Win.exe https://www.aliyundrive.com/s/JcKhj7FD4nJ 提取码: up88
OpenOCD
OpenOCD是用于对STM32进行下载仿真的工具,是一个开源软件包,Windows版本下从这里下载,下载好解压到一个目录就行。
OpenOCD-20230202-0.12.0 https://www.aliyundrive.com/s/mjmWrYPLUav 提取码: 80xh
MingW
下载地址:MinGW - Minimalist GNU for Windows download | SourceForge.net
4.arm-none-eabi-gcc
Windows到这里下载:https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads ,选择ZIP压缩包形式的:
(最新的Clion、Clion下载网址以及破解网站教程、OpenCd、以及stlink的配置)这些都能到我的阿里云网盘下载:
Clion&&stm32 https://www.aliyundrive.com/s/dqkys6yFNK3 提取码: tj47
(由于云盘限制MinGW和arm-none-eabi-gcc无法分享)
我的建议是把这些所有工具链放到同一路径下方便添加路径!!!
我的界面是中文是因为在插件下载了中文的插件
重启之后就会变成中文了
找到对应编译器路径
可以在Clion里创建CubeMx的工程也可以在CubeMx里建好后使用Clion打开(我个人觉得后者更舒服)
这里演示的是Clion里创建工程然后再打开CubeMx进行修改
最后点击创建
这里点击跳过(这里是相应板子的配置)
工程默认创建的是STM32F030的芯片 如果需要更改可以通过打开CubeMx重新选择芯片
回到Clion跳过即可,可以看到已经变成F4了
弹出提示框我们直接打开文件目录就好
Edit whith Clion
跳过即可
Config文件可以这样自己添加也可以使用我网盘里的哪个config文件(只适用于STM32F407VGTx使用STLink下载)
名字是你自己下载器的名字
文件里内容如下:
# choose st-link/j-link/dap-link etc.
#adapter driver cmsis-dap
source [find interface/stlink.cfg]
#transport select swd
transport select hla_swd
#这里的stm32f4x.cfg对应的是你的板子的相应芯片型号而不是Link的
source [find target/stm32f4x.cfg]
# download speed = 10MHz
adapter speed 10000
比如我从其他地方拷贝了一个文件夹到当前工程路径下
然后就会更新
我们还需要在CMakeLists.txt里添加路径
记得重新加载CmakeLists
新版是这样
现在就可以下到板子上了(可以写个LED闪烁的程序观察效果)
下载成功是这样的(虽然是红色但是确实是下载成功)
需要添加以下两个文件
#ifndef _RETARGET_H__
#define _RETARGET_H__
#include "stm32f4xx_hal.h"
#include
#include
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);
#endif //#ifndef _RETARGET_H__
#include "retarget.h"
#include <_ansi.h>
#include <_syslist.h>
#include
#include
#include
#include
#include
#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;
}
注意:我们有几个函数和syscalls.c里的重复,所有需要注释掉syscalls.c里(路径一般在工程路径下的Core/Src里)的;这几个函数
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)
只需要在main.c里添加如下代码即可
#include "retarget.h"
int main(void)
{
RetargetInit(&huart1);
while(1)
{
}
}