使用CLion开发STM32(标准库版本)完整指南

  • 时间:2025-11-10 17:37 作者: 来源: 阅读:0
  • 扫一扫,手机访问
摘要:STM32F10x 标准外设库开发指南 环境准备 1.1 获取标准库 从ST官网下载STM32F10x标准外设库 或使用以下目录结构: STM32F10x_StdPeriph_Lib/ ├── Libraries/ │ ├── CMSIS/ │ └── STM32F10x_StdPeriph_Driver/ ├── Project/ │ └── Template/ └── Utilit

STM32F10x 标准外设库开发指南

环境准备
1.1 获取标准库

从ST官网下载STM32F10x标准外设库

或使用以下目录结构:

STM32F10x_StdPeriph_Lib/
├── Libraries/
│ ├── CMSIS/
│ └── STM32F10x_StdPeriph_Driver/
├── Project/
│ └── Template/
└── Utilities/

项目配置
2.1 项目目录结构
MySTM32Project/
├── Core/
│ ├── Inc/ # 用户头文件
│ ├── Src/ # 用户源文件
│ └── startup/ # 启动文件
├── Drivers/
│ ├── CMSIS/ # Cortex内核支持
│ └── STM32F10x_StdPeriph_Driver/ # 标准库
├── Build/ # 编译输出
└── CMakeLists.txt

2.2 CMakeLists.txt(标准库版本)
cmake_minimum_required(VERSION 3.20)
project(STM32F103_StdPeriph C CXX ASM)

工具链设置

set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR ARM)

set(CMAKE_C_COMPILER arm-none-eabi-gcc)
set(CMAKE_CXX_COMPILER arm-none-eabi-g++)
set(CMAKE_ASM_COMPILER arm-none-eabi-gcc)
set(CMAKE_OBJCOPY arm-none-eabi-objcopy)
set(CMAKE_OBJDUMP arm-none-eabi-objdump)
set(CMAKE_SIZE arm-none-eabi-size)

MCU配置

set(MCU_MODEL STM32F103xB)
set(MCU_FLAGS “-mcpu=cortex-m3 -mthumb”)
set(CMAKE_C_FLAGS “MCUFLAGS−std=gnu11−Os−g3")set(CMAKECXXFLAGS"{MCU_FLAGS} -std=gnu11 -Os -g3") set(CMAKE_CXX_FLAGS "MCUF​LAGS−std=gnu11−Os−g3")set(CMAKEC​XXF​LAGS"{MCU_FLAGS} -std=gnu++17 -Os -g3”)
set(CMAKE_ASM_FLAGS “${MCU_FLAGS} -x assembler-with-cpp”)

宏定义

add_definitions(
-DUSE_STDPERIPH_DRIVER
-D${MCU_MODEL}
-DHSE_VALUE=8000000
)

包含路径

include_directories(
Core/Inc
Drivers/CMSIS/Include
Drivers/CMSIS/Device/ST/STM32F10x/Include
Drivers/STM32F10x_StdPeriph_Driver/inc
)

链接配置

set(LINKER_SCRIPT CMAKESOURCEDIR/STM32F103C8TxFLASH.ld)set(CMAKEEXELINKERFLAGS"{CMAKE_SOURCE_DIR}/STM32F103C8Tx_FLASH.ld) set(CMAKE_EXE_LINKER_FLAGS "CMAKES​OURCED​IR/STM32F103C8TxF​LASH.ld)set(CMAKEE​XEL​INKERF​LAGS"{MCU_FLAGS}
-specs=nosys.specs
-specs=nano.specs
-TLINKERSCRIPT−Wl,−Map={LINKER_SCRIPT} -Wl,-Map=LINKERS​CRIPT−Wl,−Map={PROJECT_NAME}.map
-Wl,–gc-sections"
)

源文件

set(SOURCES
Core/startup/startup_stm32f103xb.s
Drivers/CMSIS/Device/ST/STM32F10x/Source/Templates/system_stm32f10x.c
Core/Src/main.c
Core/Src/stm32f10x_it.c
Drivers/STM32F10x_StdPeriph_Driver/src/stm32f10x_gpio.c
Drivers/STM32F10x_StdPeriph_Driver/src/stm32f10x_rcc.c
Drivers/STM32F10x_StdPeriph_Driver/src/stm32f10x_usart.c
Drivers/STM32F10x_StdPeriph_Driver/src/stm32f10x_tim.c
Drivers/STM32F10x_StdPeriph_Driver/src/stm32f10x_exti.c
Drivers/STM32F10x_StdPeriph_Driver/src/misc.c
)

生成可执行文件

add_executable(${PROJECT_NAME} ${SOURCES})

后处理命令

add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_OBJCOPY} -O ihex ${PROJECT_NAME} ${PROJECT_NAME}.hex
COMMAND ${CMAKE_OBJCOPY} -O binary ${PROJECT_NAME} ${PROJECT_NAME}.bin
COMMAND ${CMAKE_SIZE} ${PROJECT_NAME}
COMMENT “生成 HEX 和 BIN 文件”
)

标准库代码示例
3.1 系统时钟配置
// Core/Inc/system_clock.h
#ifndef SYSTEM_CLOCK_H
#define SYSTEM_CLOCK_H

#include “stm32f10x.h”

void SystemClock_Config(void);
void Delay_Init(void);
void Delay_ms(uint32_t ms);

#endif

// Core/Src/system_clock.c
#include “system_clock.h”

static __IO uint32_t TimingDelay;

void SystemClock_Config(void)
{
ErrorStatus HSEStartUpStatus;


RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON);
HSEStartUpStatus = RCC_WaitForHSEStartUp();

if (HSEStartUpStatus == SUCCESS) {
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
    FLASH_SetLatency(FLASH_Latency_2);
    
    RCC_HCLKConfig(RCC_SYSCLK_Div1);
    RCC_PCLK1Config(RCC_HCLK_Div2);
    RCC_PCLK2Config(RCC_HCLK_Div1);
    
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
    RCC_PLLCmd(ENABLE);
    
    while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
    while (RCC_GetSYSCLKSource() != 0x08);
}

}

void SysTick_Handler(void)
{
if (TimingDelay != 0x00) {
TimingDelay–;
}
}

void Delay_Init(void)
{
if (SysTick_Config(SystemCoreClock / 1000)) {
while (1);
}
}

void Delay_ms(uint32_t ms)
{
TimingDelay = ms;
while (TimingDelay != 0);
}

3.2 主程序
// Core/Src/main.c
#include “stm32f10x.h”
#include “system_clock.h”

#define LED_GPIO_PORT GPIOC
#define LED_GPIO_PIN GPIO_Pin_13
#define LED_GPIO_CLK RCC_APB2Periph_GPIOC

void LED_GPIO_Config(void);
void USART1_Config(void);

int main(void)
{
SystemClock_Config();
Delay_Init();
LED_GPIO_Config();
USART1_Config();


while (1) {
    GPIO_WriteBit(LED_GPIO_PORT, LED_GPIO_PIN, 
                 (BitAction)(1 - GPIO_ReadOutputDataBit(LED_GPIO_PORT, LED_GPIO_PIN)));
    
    USART_SendData(USART1, 'A');
    while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
    
    Delay_ms(500);
}

}

void LED_GPIO_Config(void)
{
/* 实现代码 */
}

STM32F10x 标准外设库开发指南

1. 环境准备

1.1 获取标准库


# 从ST官网下载STM32F10x标准外设库
# 或使用以下目录结构:
STM32F10x_StdPeriph_Lib/
├── Libraries/
│   ├── CMSIS/
│   └── STM32F10x_StdPeriph_Driver/
├── Project/
│   └── Template/
└── Utilities/

2. 项目配置

2.1 项目目录结构


MySTM32Project/
├── Core/
│   ├── Inc/           # 用户头文件
│   ├── Src/           # 用户源文件
│   └── startup/       # 启动文件
├── Drivers/
│   ├── CMSIS/         # Cortex内核支持
│   └── STM32F10x_StdPeriph_Driver/ # 标准库
├── Build/             # 编译输出
└── CMakeLists.txt

2.2 CMakeLists.txt(标准库版本)


cmake_minimum_required(VERSION 3.20)
project(STM32F103_StdPeriph C CXX ASM)

# 工具链设置
set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR ARM)

set(CMAKE_C_COMPILER arm-none-eabi-gcc)
set(CMAKE_CXX_COMPILER arm-none-eabi-g++)
set(CMAKE_ASM_COMPILER arm-none-eabi-gcc)
set(CMAKE_OBJCOPY arm-none-eabi-objcopy)
set(CMAKE_OBJDUMP arm-none-eabi-objdump)
set(CMAKE_SIZE arm-none-eabi-size)

# MCU配置
set(MCU_MODEL STM32F103xB)
set(MCU_FLAGS "-mcpu=cortex-m3 -mthumb")
set(CMAKE_C_FLAGS "${MCU_FLAGS} -std=gnu11 -Os -g3")
set(CMAKE_CXX_FLAGS "${MCU_FLAGS} -std=gnu++17 -Os -g3")
set(CMAKE_ASM_FLAGS "${MCU_FLAGS} -x assembler-with-cpp")

# 宏定义
add_definitions(
    -DUSE_STDPERIPH_DRIVER
    -D${MCU_MODEL}
    -DHSE_VALUE=8000000
)

# 包含路径
include_directories(
    Core/Inc
    Drivers/CMSIS/Include
    Drivers/CMSIS/Device/ST/STM32F10x/Include
    Drivers/STM32F10x_StdPeriph_Driver/inc
)

# 链接配置
set(LINKER_SCRIPT ${CMAKE_SOURCE_DIR}/STM32F103C8Tx_FLASH.ld)
set(CMAKE_EXE_LINKER_FLAGS 
    "${MCU_FLAGS} 
    -specs=nosys.specs 
    -specs=nano.specs 
    -T${LINKER_SCRIPT} 
    -Wl,-Map=${PROJECT_NAME}.map 
    -Wl,--gc-sections"
)

# 源文件
set(SOURCES
    Core/startup/startup_stm32f103xb.s
    Drivers/CMSIS/Device/ST/STM32F10x/Source/Templates/system_stm32f10x.c
    Core/Src/main.c
    Core/Src/stm32f10x_it.c
    Drivers/STM32F10x_StdPeriph_Driver/src/stm32f10x_gpio.c
    Drivers/STM32F10x_StdPeriph_Driver/src/stm32f10x_rcc.c
    Drivers/STM32F10x_StdPeriph_Driver/src/stm32f10x_usart.c
    Drivers/STM32F10x_StdPeriph_Driver/src/stm32f10x_tim.c
    Drivers/STM32F10x_StdPeriph_Driver/src/stm32f10x_exti.c
    Drivers/STM32F10x_StdPeriph_Driver/src/misc.c
)

# 生成可执行文件
add_executable(${PROJECT_NAME} ${SOURCES})

# 后处理命令
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
    COMMAND ${CMAKE_OBJCOPY} -O ihex ${PROJECT_NAME} ${PROJECT_NAME}.hex
    COMMAND ${CMAKE_OBJCOPY} -O binary ${PROJECT_NAME} ${PROJECT_NAME}.bin
    COMMAND ${CMAKE_SIZE} ${PROJECT_NAME}
    COMMENT "生成 HEX 和 BIN 文件"
)

3. 标准库代码示例

3.1 系统时钟配置


// Core/Inc/system_clock.h
#ifndef SYSTEM_CLOCK_H
#define SYSTEM_CLOCK_H

#include "stm32f10x.h"

void SystemClock_Config(void);
void Delay_Init(void);
void Delay_ms(uint32_t ms);

#endif

// Core/Src/system_clock.c
#include "system_clock.h"

static __IO uint32_t TimingDelay;

void SystemClock_Config(void)
{
    ErrorStatus HSEStartUpStatus;
    
    RCC_DeInit();
    RCC_HSEConfig(RCC_HSE_ON);
    HSEStartUpStatus = RCC_WaitForHSEStartUp();
    
    if (HSEStartUpStatus == SUCCESS) {
        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
        FLASH_SetLatency(FLASH_Latency_2);
        
        RCC_HCLKConfig(RCC_SYSCLK_Div1);
        RCC_PCLK1Config(RCC_HCLK_Div2);
        RCC_PCLK2Config(RCC_HCLK_Div1);
        
        RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
        RCC_PLLCmd(ENABLE);
        
        while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
        while (RCC_GetSYSCLKSource() != 0x08);
    }
}

void SysTick_Handler(void)
{
    if (TimingDelay != 0x00) {
        TimingDelay--;
    }
}

void Delay_Init(void)
{
    if (SysTick_Config(SystemCoreClock / 1000)) {
        while (1);
    }
}

void Delay_ms(uint32_t ms)
{
    TimingDelay = ms;
    while (TimingDelay != 0);
}

3.2 主程序


// Core/Src/main.c
#include "stm32f10x.h"
#include "system_clock.h"

#define LED_GPIO_PORT    GPIOC
#define LED_GPIO_PIN     GPIO_Pin_13
#define LED_GPIO_CLK     RCC_APB2Periph_GPIOC

void LED_GPIO_Config(void);
void USART1_Config(void);

int main(void)
{
    SystemClock_Config();
    Delay_Init();
    LED_GPIO_Config();
    USART1_Config();
    
    while (1) {
        GPIO_WriteBit(LED_GPIO_PORT, LED_GPIO_PIN, 
                     (BitAction)(1 - GPIO_ReadOutputDataBit(LED_GPIO_PORT, LED_GPIO_PIN)));
        
        USART_SendData(USART1, 'A');
        while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
        
        Delay_ms(500);
    }
}

void LED_GPIO_Config(void)
{
    /* 实现代码 */
}
  • 全部评论(0)
最新发布的资讯信息
【系统环境|】MySQL系列—编译安装8.0版本时gcc及cmake版本说明(2025-11-10 18:06)
【系统环境|】调整随机森林超参数的可视化指南(2025-11-10 18:05)
【系统环境|】机器学习「铁三角」:Numpy、Pandas、Matplotlib协同实战指南(2025-11-10 18:05)
【系统环境|】在XGBoost和LightGBM模型中强制执行单调约束的python教程(2025-11-10 18:04)
【系统环境|】Python可视化交互库——dash——设置颜色(2025-11-10 18:04)
【系统环境|】MySQL 5.5 安装教程(附安装包下载)(2025-11-10 18:03)
【系统环境|】centos系统下安装MySQL5.7.18方法详解(2025-11-10 18:03)
【系统环境|】Windows安装Mysql及卸载(2025-11-10 18:02)
【系统环境|】MySQL安装(详细,适合小白)(2025-11-10 18:02)
【系统环境|】程序员必备技能——解压版MySQL安装(2025-11-10 18:01)
手机二维码手机访问领取大礼包
返回顶部