STM32F10x 标准外设库开发指南
环境准备STM32F10x_StdPeriph_Lib/
├── Libraries/
│ ├── CMSIS/
│ └── STM32F10x_StdPeriph_Driver/
├── Project/
│ └── Template/
└── Utilities/
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)
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 "MCUFLAGS−std=gnu11−Os−g3")set(CMAKECXXFLAGS"{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
"CMAKESOURCEDIR/STM32F103C8TxFLASH.ld)set(CMAKEEXELINKERFLAGS"{MCU_FLAGS}
-specs=nosys.specs
-specs=nano.specs
-TLINKERSCRIPT−Wl,−Map={LINKER_SCRIPT}
-Wl,-Map=LINKERSCRIPT−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 文件”
)
#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)
{
/* 实现代码 */
}
# 从ST官网下载STM32F10x标准外设库
# 或使用以下目录结构:
STM32F10x_StdPeriph_Lib/
├── Libraries/
│ ├── CMSIS/
│ └── STM32F10x_StdPeriph_Driver/
├── Project/
│ └── Template/
└── Utilities/
MySTM32Project/
├── Core/
│ ├── Inc/ # 用户头文件
│ ├── Src/ # 用户源文件
│ └── startup/ # 启动文件
├── Drivers/
│ ├── CMSIS/ # Cortex内核支持
│ └── STM32F10x_StdPeriph_Driver/ # 标准库
├── Build/ # 编译输出
└── 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 文件"
)
// 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);
}
// 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)
{
/* 实现代码 */
}
¥80.00
steam游戏中文 女神异闻录4 黄金版 女神异闻录4 P4G 国区激活码cdkey 女神异闻录4无敌究极后桥背摔
¥28.80
PC中文正版 steam平台 国区 游戏 拳皇13 格斗之王十三 THE KING OF FIGHTERS XIII STEAM EDITION 激活码
¥7.20
Steam正版 国区激活码 城市天际线 Cities Skylines 全DLC都市天际线cdk机场工业园区key不夜城cdkey电脑游戏
¥179.00
PC 中文steam哆啦A梦牧场物语 自然王国与和乐家人 Doraemon Story of Seasons PC正版游戏CDKey国区激活码
¥32.80
PC中文正版 steam平台 国区 游戏 远方 涌变暗潮 FAR Changing Tides 激活码 CDkey
¥35.00
steam 3DMark激活码CDkey 正版PC游戏软件 key 国区 全球 显卡性能测试软件 显卡测试软件 中文 密钥 注册码