在PlatformIO使用标准库开发STM32(解决冲突)

博主也是刚开始学stm32,觉得keil不好看,想用更加熟悉的VS Code来开发STM32。我学的教材用的是标准库,可是网上大部分教程都是针对HAL库的。终于找到一篇教程之后,发现复制进去的库在链接时会和PlatformIO自带的库冲突。

这个是我很久之前写的,不知道现在还能不能用,现在我在用STM32CubeIDE(HAL库)

这是我参考的文章:

STM32F103 在VSCode下使用Platform IO 基于CMSIS标准库函数开发 - Zennn - 博客园 (cnblogs.com)

编译报错

研究一番之后,是因为system_stm32f10x.c和PlatformIO自带的system_stm32f1xx.c冲突了,解决方法如下:

把这几个文件放进include目录,作为全局头文件。如果不想分类的话,直接放进src目录也行。

stm32f10x_conf.h
stm32f10x_it.h
stm32f10x.h
system_stm32f10x.h

然后把stm32f10x_it.c文件、FWlib目录放进src目录。

具体结构如下:

目录结构

然后修改platformio.ini文件:

[env:genericSTM32F103VE]
platform = ststm32
board = genericSTM32F103VE      ; 板块
framework = cmsis               ; 标准库
upload_protocol = stlink        ; 上传工具
debug_tool  = stlink            ; 调试工具
build_flags =                   ; Build 选项
    -Isrc/FWlib/inc				; 添加搜索,目录
    -D STM32F10X_MD             ; 设备类型
    -D USE_STDPERIPH_DRIVER

如果需要使用其他容量的芯片,可以参考下面修改设备类型:

STM32F10X_LD: 		STM32 Low density devices 
STM32F10X_LD_VL: 	STM32 Low density Value Line devices 
STM32F10X_MD: 		STM32 Medium density devices 
STM32F10X_MD_VL: 	STM32 Medium density Value Line devices 
STM32F10X_HD: 		STM32 High density devices 
STM32F10X_HD_VL: 	STM32 High density value line devices 
STM32F10X_XL: 		STM32 XL-density devices 
STM32F10X_CL: 		STM32 Connectivity line devices 

注意,不需要复制core_cm3这些文件到工程目录,也省掉修改736行和753行这些操作。一般到这里就可以正常编译了,如果想调试,必须在platformio.ini文件填写调试工具。

虽然VS Code很好看,但是不建议在实际生产环境中使用,因为不知道有没有隐藏的bug,本教程仅供学习使用。

### PlatformIO 开发 STM32 标准库配置与示例 #### 1. 平台环境搭建 为了在 PlatformIO开发基于 STM32标准库项目,需先完成必要的软硬件准备。具体来说,硬件部分需要一块支持目标芯片的最小系统板以及调试工具(如 ST-LINK V2)。软件方面则依赖于 Visual Studio Code 和其插件 PlatformIO Core/IDE[^2]。 安装完成后,在 PlatformIO 中创建新项目时应指定框架为 `STM SVD` 或者手动调整至 CMSIS Standard Library 支持模式下运行。这一步骤可通过编辑项目的 `platformio.ini` 文件来实现自定义设置: ```ini [env:generic_stm32f103c8] platform = ststm32 board = generic_stm32f103c8 framework = stm32cube upload_protocol = stlink build_flags = -D USE_STDPERIPH_DRIVER lib_ldf_mode = deep+ ``` 上述配置片段中特别注意 `-D USE_STDPERIPH_DRIVER` 宏定义的存在,它指示编译器采用标准外设驱动而非 HAL 库作为基础构建模块。 #### 2. 初始化工程结构 新建一个简单的 LED 点亮实验可以验证整个流程是否正常工作。假设我们控制 PA5 引脚上的 LED,则主程序大致如下所示: ```c #include "stm32f1xx.h" void GPIO_Configuration(void); int main(void){ // 配置GPIO口 GPIO_Configuration(); while (1){ GPIO_SetBits(GPIOA, GPIO_Pin_5); /* Turn ON the LED */ Delay(500); GPIO_ResetBits(GPIOA, GPIO_Pin_5); /* Turn OFF the LED */ Delay(500); } } // 延迟函数模拟等待时间 void Delay(__IO uint32_t nTime){ volatile uint32_t delay; for(delay=0;delay<nTime*1000;delay++); } /** * @brief Configures the different system clocks. */ static void SystemClock_Config(void){...} /** * @brief Configure the GPIO ports. */ void GPIO_Configuration(void){ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE ); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 ; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; GPIO_Init(GPIOA,&GPIO_InitStructure); } ``` 此代码展示了如何利用标准库初始化并操控特定 IO 口的操作过程[^1]。 #### 3. 处理多线程需求下的资源竞争问题 当引入操作系统级功能比如 FreeRTOS 后,原先单片机裸跑环境中使用的简单机制可能不再适用。例如互斥锁管理就需要依据实际场景选用合适的方式处理。如果是在 RTOS 上层调用 SPI 接口访问外部设备,则推荐通过 OS 提供的标准 API 实现同步逻辑而不是直接关闭全局中断[^3]。 同样地,对于定时任务也可以借助更高层次抽象后的服务替代原始轮询式的延迟方法从而提高效率和可维护性。 --- ###
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值