配置安裝環(huán)境
- 下載STM32cubeMX,這個(gè)大家可以自己在stm的官網(wǎng)下載到
- 下載VSCode
- 下載arm-none-eabi-gcc
- 下載MinGW-w64,為了實(shí)現(xiàn)里面的makefile 等功能
- 下載OpenOCD這里用來(lái)調(diào)試stm32,支持jlink stlink daplink
上述安裝步驟1、安裝步驟2在這里比較簡(jiǎn)單,就不贅述了
安裝arm-none-eabi-gcc:
?此處我們下載zip包,方便安裝。
以我為例,我們解壓到 E:\Tools\ 目錄下
安裝MinGW-w64
此處我們同樣下載zip包,安裝比較方便,注意一定要安裝上述劃線的版本
?以我為例,我們解壓到 E:\Tools\ 目錄下
安裝openocd
?此處我們下載最新的版本
以我為例,我們解壓到 E:\Tools\ 目錄下
通過stm32cubemx新建一個(gè)例程
這里以我的開發(fā)板為例,使用的是stm32f407vgt6,我們創(chuàng)建一個(gè)工程
配置一下SWD調(diào)試
?配置外部8mhz晶振
?配置PA1,用作測(cè)試LED
?配置usart1作為串口輸出測(cè)試
?
?配置時(shí)鐘,完成最后一步工作
?這里我們選擇makefile,即可,點(diǎn)擊generate code
通過vscode 生成剛剛用stm32cubemx 創(chuàng)建的工程
?在這里,我們?cè)跀U(kuò)展中找到插件并安裝
- C/C++
- Cortex-Debug
- stm32-for-vscode
?剛剛下載的工具我都放在這個(gè)目錄了,如圖所示
?
?為了使用方便,我稍微改下名字
這樣就舒服多了
?安裝好stm32-for-vscode以后,我們會(huì)發(fā)現(xiàn)側(cè)邊欄增加了一個(gè)圖標(biāo):
?按照上述提示,我們導(dǎo)入相應(yīng)的工具
這里已經(jīng)配置成我的路徑了
重新打開vscode,即可看到變化
幾個(gè)選項(xiàng)分別為
- 編譯
- 全編譯
- 燒錄到stm32
- 調(diào)試stm32
- 修改下載工具
?我簡(jiǎn)單演示一下,首先我們選擇自己的編譯工具,例如我這邊使用的是dap-link
?我們看到這里已經(jīng)選擇成功了,那么我們先點(diǎn)擊build
?已經(jīng)生成成功了,我們看到編譯速度是keil的指數(shù)級(jí)的提升
我們點(diǎn)擊flash stm32,即可看到已經(jīng)下載成功了!
最基本的操作已經(jīng)可以了,編譯下載一條龍,那么接下來(lái)我們?cè)囋囌{(diào)試功能。
?使用vscode調(diào)試
我們?cè)诖a里簡(jiǎn)單添加一些代碼,作為調(diào)試的現(xiàn)象
不出意外的話,我們可以在debug中觀察到i的變化
那么我們來(lái)試一下吧,點(diǎn)擊build,再點(diǎn)擊 debug在 printf 處添加斷電
可以看到我們已經(jīng)進(jìn)入到調(diào)試的模式了,那么我們新增一個(gè)監(jiān)視來(lái)監(jiān)視i
?
?此時(shí)i的值為0,我們?cè)谌龠\(yùn)行兩次次試試
?
可以看到,我們已經(jīng)有i的值的變化,也在串口輸出了值,符合我們的預(yù)期
這種開發(fā)方式已經(jīng)可以替代keil了?
最后小結(jié)
那么我們知道,在keil中調(diào)用printf 只需要在前面增加putc函數(shù)即可,那在這種開發(fā)方式中,我們?nèi)绾翁砑雍瘮?shù),使得可以printf。
很簡(jiǎn)單,只需要將下述代碼復(fù)制到頭,并且包含stdio.h即可
int _write(int fd, char *ch, int len)
{
HAL_UART_Transmit(&huart1, (uint8_t*)ch, len, 0xFFFF);
return len;
}
進(jìn)一步更新使用C++
如果使用C++來(lái)編寫工程的話,我們發(fā)現(xiàn)本來(lái)的printf不行了,怎么回事呢
很簡(jiǎn)單,這里借鑒可以新增兩個(gè)文件 target.h,插入一下內(nèi)容
#ifndef _RETARGET_H__
#define _RETARGET_H__
#include "stm32f4xx_hal.h"
#include <sys/stat.h>
#include <stdio.h>
#ifdef __cplusplus
extern "C" {
#endif
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);
#ifdef __cplusplus
}
#endif
#endif //#ifndef _RETARGET_H__
再新增一個(gè)target.c
#include <_ansi.h>
#include <_syslist.h>
#include <errno.h>
#include <sys/time.h>
#include <sys/times.h>
#include <retarget.h>
#include <stdint.h>
#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;
}
#endif //#if !defined(OS_USE_SEMIHOSTING)
就可以繼續(xù)使用print了,甚至是cout也完全沒有問題文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-530744.html
while (1)
{
/* USER CODE END WHILE */
printf("test i = %d \n", i++);
std::cout << 123 << std::endl;
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_1);
HAL_Delay(1000);
/* USER CODE BEGIN 3 */
}
面對(duì)_exit等報(bào)錯(cuò),我們這里需要在STM32-for-VSCode.config.yaml這個(gè)文件中新增選項(xiàng),就可以沒有報(bào)錯(cuò)了文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-530744.html
# Compiler flags
cFlags: []
cxxFlags: []
assemblyFlags: []
linkerFlags:
- -specs=nano.specs
- -Wl,--gc-sections
- -ffreestanding -flto
- -specs=nosys.specs #新增這個(gè)選項(xiàng)
到了這里,關(guān)于vscode stm32cubemx 優(yōu)雅開發(fā)stm32,最簡(jiǎn)單步驟教程的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!