windows 下vscode+platformio开发stm32f103c8t6最小系统

article/2025/9/22 0:35:22

最近想要写个更新航模接收机固件的小项目,移植opentx项目的部分代码到我的最小系统板上。不经意间发现vscode上也可以开发stm32了,于是,一个填坑行动开始了!!!


先写怎么才能编译调试吧!

环境:

windows10x64,8G内存,i5 4200

stlink v2

1.你要有个vscode,不用我说了。

2.在vscode上装platformio插件

安装完毕,点击重新加载。之后会提示正在安装PlatformIO 核心。


再次重新加载


3.安装完毕后,在vscode的左下角会有一个家的图标,可以从这里新件工程。第一次启动也会自动打开PIO Home页面。


4.新建工程。因为它是以开发板为选择,不是芯片,只能选择BluePill F103C8,这个关系不大,只是运行内存和Flash大小不同。记得选一个空目录。


5.打开工程,新建的工程会在PIO Home的下发列出。点击打开,如果打不开,关闭编辑器重新打开一次,或者直接用vscode打开那个目录。


6开打工程后,目录树中无源码,需要自己添加,按一下Ctrl+Alt+B,platformio自动下载编译组件。然后提示无文件可以编译。

.


我们添加一个main.c,然后再编译。


然后插上stlink,接上单片机,按CTRL+ALT+U,烧到单片机上(首次上传会安装stlink)。


-----------------------------------------------------------------分割线--------------------------------------------------------------------------

你以为就完了吗,那我写这个文章干嘛!

看起来编译完成,上传也通过了,然而,你的单片机并没有让c13口的灯闪亮,串口也并没有发送字母c!由于以前都是使用keil开发,对启动项目和内存定义并不清楚,加之platformio使用了arm-none-eabi-gcc编译,隐藏了太多的细节。经过一个礼拜的刻苦钻研,最终找到了解决方法。方法如下:

在你的电脑上找到这个文件,C:\Users\<你的用户名>\.platformio\packages\framework-stm32cube\platformio\ldscripts\STM32F103C8_DEFAULT.ld,打开。


把红框里的内容改为 _estack = 0x20005000; 加一个0,就这一个0,天大的坑的存在,对于熟悉使用gcc编译的人,可能并不很难,但对于我等新手,这个问题实在太难找!!!之后,把这个文件另存为STM32F103C8_flash.ld,不另存也可以,但我喜欢完美,Platformio的源码是先寻找_FLASH.ld再寻找DEFAULT.ld的。

好了,再编译,上传(CTRL+ALT+B,CTRL+ALT+U)。享受使用vscode编写stm32的乐趣吧!

main.c

#include <stm32f1xx_hal.h>#define VECT_TAB_OFFSET  0x0 /*!< Vector Table base offset field. 
This value must be a multiple of 0x200. */
#define LED_PIN                                GPIO_PIN_13
#define LED_GPIO_PORT                          GPIOC
#define LED_GPIO_CLK_ENABLE()                  __HAL_RCC_GPIOC_CLK_ENABLE()
void SysTick_Handler(void)
{HAL_IncTick();HAL_SYSTICK_IRQHandler();
}
void SystemClock_Config(void)
{RCC_ClkInitTypeDef clkinitstruct = { 0 };RCC_OscInitTypeDef oscinitstruct = { 0 };/* Configure PLL ------------------------------------------------------*//* PLL configuration: PLLCLK = (HSI / 2) * PLLMUL = (8 / 2) * 16 = 64 MHz *//* PREDIV1 configuration: PREDIV1CLK = PLLCLK / HSEPredivValue = 64 / 1 = 64 MHz *//* Enable HSI and activate PLL with HSi_DIV2 as source */oscinitstruct.OscillatorType  = RCC_OSCILLATORTYPE_HSI;oscinitstruct.HSEState        = RCC_HSE_OFF;oscinitstruct.LSEState        = RCC_LSE_OFF;oscinitstruct.HSIState        = RCC_HSI_ON;oscinitstruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;oscinitstruct.HSEPredivValue    = RCC_HSE_PREDIV_DIV1;oscinitstruct.PLL.PLLState    = RCC_PLL_ON;oscinitstruct.PLL.PLLSource   = RCC_PLLSOURCE_HSI_DIV2;oscinitstruct.PLL.PLLMUL      = RCC_PLL_MUL16;if (HAL_RCC_OscConfig(&oscinitstruct) != HAL_OK){/* Initialization Error */while (1); }/* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */clkinitstruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);clkinitstruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;clkinitstruct.AHBCLKDivider = RCC_SYSCLK_DIV1;clkinitstruct.APB2CLKDivider = RCC_HCLK_DIV1;clkinitstruct.APB1CLKDivider = RCC_HCLK_DIV2;  if (HAL_RCC_ClockConfig(&clkinitstruct, FLASH_LATENCY_2) != HAL_OK){/* Initialization Error */while (1); }
}
GPIO_InitTypeDef GPIO_InitStruct;
UART_HandleTypeDef com1;
int main(void)
{HAL_Init();SystemClock_Config();__GPIOC_CLK_ENABLE();GPIO_InitStruct.Pin = GPIO_PIN_13;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); com1.Instance = USART1;com1.Init.BaudRate = 9600;com1.Init.WordLength = UART_WORDLENGTH_8B;com1.Init.StopBits   = UART_STOPBITS_1;com1.Init.Parity     = UART_PARITY_NONE;com1.Init.HwFlowCtl  = UART_HWCONTROL_NONE;com1.Init.Mode       = UART_MODE_TX_RX;if (HAL_UART_Init(&com1) != HAL_OK){for (;;){HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);HAL_Delay(200);}}for (;;){uint8_t ch = 'c';HAL_UART_Transmit(&com1, (uint8_t *)&ch, 1, 0xFFFF);HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);HAL_Delay(1000);}
}#define USARTx_CLK_ENABLE()              __HAL_RCC_USART1_CLK_ENABLE();
#define USARTx_RX_GPIO_CLK_ENABLE()      __HAL_RCC_GPIOA_CLK_ENABLE()
#define USARTx_TX_GPIO_CLK_ENABLE()      __HAL_RCC_GPIOA_CLK_ENABLE()#define USARTx_FORCE_RESET()             __HAL_RCC_USART1_FORCE_RESET()
#define USARTx_RELEASE_RESET()           __HAL_RCC_USART1_RELEASE_RESET()/* Definition for USARTx Pins */
#define USARTx_TX_PIN                    GPIO_PIN_9
#define USARTx_TX_GPIO_PORT              GPIOA
#define USARTx_RX_PIN                    GPIO_PIN_10
#define USARTx_RX_GPIO_PORT              GPIOA
void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{GPIO_InitTypeDef  GPIO_InitStruct;/*##-1- Enable peripherals and GPIO Clocks #################################*//* Enable GPIO TX/RX clock */USARTx_TX_GPIO_CLK_ENABLE();USARTx_RX_GPIO_CLK_ENABLE();/* Enable USARTx clock */USARTx_CLK_ENABLE();/*##-2- Configure peripheral GPIO ##########################################*//* UART TX GPIO pin configuration  */GPIO_InitStruct.Pin       = USARTx_TX_PIN;GPIO_InitStruct.Mode      = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull      = GPIO_PULLUP;GPIO_InitStruct.Speed     = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(USARTx_TX_GPIO_PORT, &GPIO_InitStruct);/* UART RX GPIO pin configuration  */GPIO_InitStruct.Pin = USARTx_RX_PIN;HAL_GPIO_Init(USARTx_RX_GPIO_PORT, &GPIO_InitStruct);
}/*** @brief UART MSP De-Initialization*        This function frees the hardware resources used in this example:*          - Disable the Peripheral's clock*          - Revert GPIO and NVIC configuration to their default state* @param huart: UART handle pointer* @retval None*/
void HAL_UART_MspDeInit(UART_HandleTypeDef *huart)
{/*##-1- Reset peripherals ##################################################*/USARTx_FORCE_RESET();USARTx_RELEASE_RESET();/*##-2- Disable peripherals and GPIO Clocks #################################*//* Configure UART Tx as alternate function  */HAL_GPIO_DeInit(USARTx_TX_GPIO_PORT, USARTx_TX_PIN);/* Configure UART Rx as alternate function  */HAL_GPIO_DeInit(USARTx_RX_GPIO_PORT, USARTx_RX_PIN);}



http://chatgpt.dhexx.cn/article/7DPMoM2i.shtml

相关文章

Open vSwitch详解

1. Open vSwitch简介 Open vSwitch(简称OVS)是在开源的Apache2.0许可下的产品级质量的多层虚拟交换标准。它旨在通过编程扩展,使庞大的网络自动化(配置、管理、维护),同时还支持标准的管理接口和协议。总的来说,它被设计为支持分布在多个物理服务器。OVS适用于VM环境中提…

英伟达Nvidia TX1 TX2 串口通信方法

Nvidia TX1 TX2 串口通信方法 英伟达TX2串口串口硬件板子串口描述硬件连接方式测试工具及方法c通信代码 英伟达TX2串口 使用英伟达嵌入式板进行 串口通信 。 串口硬件 串口位置为下图中红色方框位置&#xff0c;标示UARTQ20和J17。 板子串口描述 串口共6个引脚&#xff0…

Open vSwitch

1 OpenVSwitch 1.1 简介 OpenvSwitch简称OVS,是一个高质量的、多层虚拟交换机&#xff0c;使用开源Apache2.0许可协议&#xff0c;由Nicira Networks开发&#xff0c;主要实现代码为可移植的C代码。它的目的是让大规模网络自动化可以通过编程扩展,同时仍然支持标准的管理接口…

TX12 + ExpressLRS 915MHz RC控制链路配置及问题汇总

TX12 ExpressLRS 915MHz RC控制链路配置及问题汇总 1. 硬件配置1.1 TX12遥控器1.2 发射/接受机 2. 问题汇总2.1 ELRS接收机无法点亮(第一次)2.2 ELRS接收机无法点亮(第二次)2.3 触发EdgeTX固件更新2.4 elrsV2.lua脚本执行失败2.5 ELRS发射机和接收机如何对频2.6 ELRS接收机LED…

DIY基于树莓派的OpenTX航模遥控器(一)

【前言】 在正式讨论OpenTX遥控器之前&#xff0c;先罗列一下自己以往DIY遥控器的经历&#xff0c;正是通过这些不断摸索逐步积累了DIY的经验&#xff0c;以及大部分的驱动代码。基于对Python的热爱&#xff0c;所有制作都是基于Python编程的&#xff0c;虽然对于实时运行系统…

stm32f429 pcb 原理图工程文件 OPENTX遥控器可用

stm32f429 pcb 原理图工程文件 OPENTX遥控器可用。拍下只发stm32f429 pcb工程文件。id664624938682&

基于opentx开源软件,DIY属于自己的uav遥控器

硬件方面&#xff1a;开关&#xff0c;自稳按钮&#xff0c;方向控制遥感&#xff0c;油门遥感&#xff0c;一键降落按钮&#xff0c; 1.根据开源源码找到引脚对应功能&#xff0c;以及实际各模块&#xff0c;按钮等&#xff0c;进行原理图的绘制&#xff0c;出个初板 2…

EdgeTX/OpenTX逻辑开关教程

目录 一、介绍 二、Taranis遥控的逻辑开关屏幕示例 三、Companion软件中的逻辑开关界面 四、开关功能 一、介绍 如果是T-Pro也可先学习本文的逻辑开关原理&#xff0c;这样在进行双击解锁/长按上锁的设置就得心应手了。 ⼿动激活开关标记为 SA 到 SH。在本文示例中SF 是两…

OpenTX学习笔记

一 OpenTX 开源的无线电遥控系统 二 文件夹结构 1 FIRMWARE 您可以将模块或无线广播设备的固件放在此文件夹中。此文件夹中的文件不会自动应用。 2 IMAGES 2.2:BMP重命名为图像&#xff08;IMAGES&#xff09;&#xff0c;以保持Taranis和Horus之间的一致性。您可以将模型和其…

ping通说明什么

ping是icmp ping通说明 网络层&#xff0c;链路层没问题

虚拟机可以ping通主机,主机无法ping通虚拟机的解决方法

虚拟机可以ping通主机&#xff0c;主机无法ping通虚拟机的解决方法 关闭虚拟机防火墙 关闭防火墙后就可以ping通了 如何还无法ping通&#xff0c;将虚拟机重新启动后再尝试。 再次要ping 虚拟机的时候又ping不通了&#xff0c;搞了好久终于发现&#xff0c;只要将网络连接…

Ubuntu无法ping通百度

1 问题 ubuntu在使用ping baidu.com命令时出现未知的服务或名称 2 解决 修改/etc/network/interfaces文件 修改完成之后保存退出 重启网卡 /etc/init.d/networking restart

VirtualBox主机与虚拟机互相ping通的方法

一般情况下&#xff0c;按照VirtualBox默认的配置&#xff0c;主机可以ping通虚拟机&#xff0c;但虚拟机不能ping通主机。需要两端都能ping通的话&#xff0c;需要按照以下配置&#xff1a; 1、连接方法选择“仅主机(Host-Only)网络”。 2、在高级部分&#xff0c;控制芯片不…

为什么 A 能 ping 通 B,B 却不能 ping 通 A ?

有开发小哥咨询了一个问题&#xff0c;记录一下处理过程分享给有需要的朋友。 问题如下&#xff1a; A、B 两台开发服务器连接交换机&#xff0c;并且 A、B 两台服务器的 IP 地址设置为同一个网段&#xff0c;却发现 A 能 ping 通 B &#xff0c;B 却不能 ping 通 A 。 如图&am…

网络何时能ping通?什么情况下不能ping通?

1. 在同一网段内 假设电脑A、B均在192.168.0.X的网络内&#xff0c;两台电脑不需要额外的设置&#xff0c;就可以互相ping通。如果ping不通&#xff0c;可能的原因是&#xff1a; 目标主机的防火墙没关闭目标主机有电脑管家/360等防护软件 2. 在不同网段 如上图&#xff0c;…

主机与虚拟机ping通

主机与虚拟机ping通&#xff0c;之前上课按老师的配置一步一步来&#xff0c;都忘带了脑子&#xff0c;这次自己也可以实现配置自由了。 1.第一步&#xff0c;查看主机ip&#xff0c;cmd->ipconfig 2.设置虚拟机&#xff0c;同一网段 子网ip:我设置为192.168.172.0 子网掩码…

能ping通,TCP就一定能连通吗?

平时&#xff0c;我们想要知道&#xff0c;自己的机器到目的机器之间&#xff0c;网络通不通&#xff0c;一般会执行ping命令。 一般对于状况良好的网络来说&#xff0c;你能看到它对应的loss丢包率为0%&#xff0c;也就是所谓的能ping通。如果看到丢包率100%&#xff0c;也就…

关于虚拟机能ping通主机,而主机不能ping通虚拟机的问题

Ping不通虚拟机或者主机这个问题恐怕让很多同学头疼吧&#xff1f;如果你是关于标题的问题&#xff0c;可以参考一下&#xff0c;如果是其他问题请移步其他博客。当然也欢迎大家前来阅读指正&#xff01;第一次写&#xff0c;写的不好的地方大家多包涵&#xff01; 这个问题是我…

不同网段怎么ping通

A 类地址子网掩码是 255.0.0.0 &#xff0c;也可写作 /8 B 类地址子网掩码是 255.255.0.0 &#xff0c;也可写作 /16 C 类地址子网掩码是 255.255.255.0 &#xff0c;也可写作 /24 。 网段地址是主机号全为 0 的地址&#xff0c;表示某个网段&#xff0c;比如&#xff1a;网段地…

主机无法Ping通虚拟机

VMware主机无法Ping通虚拟机 原因分析 虚拟机未设置成nat网络模式&#xff1b;虚拟机设置成桥接模式&#xff0c;但是未和主机配置统一网段ip&#xff1b;或是主机网卡故障。而具体的虚拟机ping不通主机原因&#xff0c;在不同模式下可能的情况&#xff1a; 1、桥接模式 可能…