【STM32】从新建一个工程开始:STM32 新建工程的详细步骤

ops/2025/3/19 18:16:35/

STM32 开发通常使用 Keil MDKSTM32CubeMXIAR 等工具来创建和管理工程。此处是 使用 Keil MDK5 + STM32CubeMX 创建 STM32 工程的详细步骤。

新建的标准库工程文件已上传至资源中,下载后即可直接使用。

标准库新建 STM32 工程的基本目录结构:STD_STM32F103RC_Demo

1. 新建 STM32 工程的基本目录结构

在 STM32 工程中,通常会有以下几个文件夹:
工程构架
新建工程

外设库(FWLib):存放 STM32 官方提供的驱动库,例如 HAL 库或标准外设库(StdPeriph Lib
用户文件(USER):存放用户编写的代码,如 main.c
工程文件(MDK-ARM):存放 Keil 相关的 *.uvprojx 工程文件
核心文件(COER):CMSIS 核心支持库
编译中间文件(OBJ):存放编译过程中生成的 .o 文件
系统文件(SYSTEM):存放 STM32 系统初始化相关的 system_stm32f10x.c

2. 使用 STM32CubeMX 生成工程

⭐ 2.1 安装必要的软件
Keil MDK-ARM(用于编写和编译代码)
STM32CubeMX(用于生成初始化代码)
ST-Link 驱动 和 FlyMcu(用于调试和烧录)

⭐ 2.2 创建 STM32CubeMX 工程

  1. 打开 STM32CubeMX,点击 “New Project
  2. 选择目标 STM32 芯片(例如 STM32F103C8T6)
  3. 配置文件:时钟(RCC)、串口(USART)、GPIO、定时器(TIM)等外设
  4. 选择代码生成方式
    • 库类型:HAL 库(推荐)或 LL 库
    • IDE 选择:Keil MDK-ARM
  5. 点击“Generate Code” 生成工程
    流程一
    流程二
    流程三
标准库移植 STM32F10x_StdPeriph_Lib_V3.5.0:

标准库目录:
在这里插入图片描述
移植第一 步在 COER 文件夹下:

G:\(stm32)\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport
文件夹下的文件:

在这里插入图片描述
文件夹:

G:\(stm32)\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm
添加文件:startup_stm32f10x_hd.s   和    startup_stm32f10x_md.s

在这里插入图片描述
移植第二步在 USER 文件夹下:
进入标准库的文件夹中:

G:\(stm32)\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x

在这里插入图片描述
在标准库的文件夹中:

G:\(stm32)\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template

在这里插入图片描述

移植第三步在 FWLib 文件夹下:

G:\(stm32)\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver
将 文件夹 inc 和 src 复制到工程目录的 FWLib 下

在这里插入图片描述
第四步 在 Keil uVision5 中新建的工程目录中,将标准库的 .c.h 文件分别加入在工程中:
在这里插入图片描述
在这里插入图片描述

以上。便添加完成了标准库中的所有 .c 文件,之后点击魔法棒,开始添加 .h 文件。

第一步:改为V5版本:
在这里插入图片描述
第二步:进入C/C++目录下新增目录:

\COER
\FWLib\inc
\USER

在这里插入图片描述
在这里插入图片描述
然后在 Define 中添加宏:

STM32F10X_HD,USE_STDPERIPH_DRIVER

点击 OK 结束。以上,便完成了标准库的前置配置。接下来我们测试一下代码是否能够调试与运行↓:

在这里插入图片描述
配置一下,将生成文件的目录放在OBJ文件夹下:
在这里插入图片描述

LED 亮灭:写一段点亮 LED 灯的代码:

main.c 中编写代码:

int	 main(void)
{GPIO_InitTypeDef GPIO_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC, &GPIO_InitStruct);GPIO_WriteBit(GPIOC, GPIO_Pin_7, Bit_RESET);}
编译工程
  • 点击“Build”按钮(F7)编译代码
  • 若无报错,生成 *.hex 文件

然后点击编译:此时会将代码生成至OBJ文件夹下:
打开 FlyMcu.exe
在这里插入图片描述
在这里插入图片描述
这里按一下开发板上的复位键(记得此时开发板的按钮开关模式为 ISR)

开发板的 ISR(Interrupt Service Routine)和 RUN(运行模式)ISR(中断服务程序) 是 当外部或内部事件发生时,CPU 自动执行的特定函数,用于响应和处理中断事件。
📌 1.1 ISR 主要用于:外部中断(按键、传感器触发)定时器中断(周期性任务、PWM 计时)串行通信中断(USART、I2C、SPI 数据接收)DMA 传输完成中断异常处理(如硬件故障)✅ 1.2 ISR 的运行流程1.中断发生(如 GPIO 触发、定时器超时)。2.CPU 停止当前任务,保存上下文(寄存器、堆栈)。3.跳转到 ISR 处理程序,执行中断任务。4.ISR 结束,恢复原任务,继续运行。在嵌入式系统中,RUN 模式指的是 MCU 正常运行的状态。
📌 MCU 可能有多种运行模式,如:RUN 模式(正常运行)SLEEP 模式(低功耗模式,CPU 暂停但外设运行)STOP 模式(更低功耗,RAM 保持但 CPU 停止)STANDBY 模式(最低功耗,RAM 断电)

流程四
以上。代码便烧录成功了。然后将按钮切换至 RUN 运行模式,
请添加图片描述
测试成功。以上,是标准库新建工程的流程。

以上。仅供学习与分享交流,请勿用于商业用途!转载需提前说明。

我是一个十分热爱技术的程序员,希望这篇文章能够对您有帮助,也希望认识更多热爱程序开发的小伙伴。
感谢!


http://www.ppmy.cn/ops/167080.html

相关文章

Vue3中正确解析RefImpl对象

在 Vue 3 中,当你看到 RefImpl 对象时,说明这是一个通过 ref() 创建的响应式引用。要获取它的实际值,直接访问 .value 属性即可。以下是具体方法: 直接获取值(标准方式) javascript 复制 console.log(&q…

【蓝桥杯】每天一题,理解逻辑(4/90)【Leetcode 二进制求和】

题目描述 我们解析一下题目 我们可以理解到两个主要信息 给的是二进制的字符串返回他们的和 我们知道,十进制的加减法需要进位,例如:9716是因为91之后进了一位,二进制也是如此,只不过十进制是逢10进1,二…

Go string 字符串底层逻辑

在 Go 语言中,string 类型的底层结构是一个结构体,包含两个字段:一个指向字节数组的指针和该字节数组的长度。以下是其在 Go 源码中的大致定义:type stringStruct struct {str unsafe.Pointerlen int } str:这是一个指…

Git的基本指令

一、回滚 1.git init 在项目文件夹中打开bash生成一个.git的子目录,产生一个仓库 2.git status 查看当前目录下的所有文件的状态 3.git add . 将该目录下的所有文件提交到暂存区 4.git add 文件名 将该目录下的指定文件提交到暂存区 5.git commit -m 备注信…

R语言入门课| 02 R及Rstudio的下载与安装

视频教程 先上教程视频,B站同步播出: https://www.bilibili.com/video/BV1miNVeWEkw 完整视频回放可见:R语言入门课回放来啦 "R语言入门课"是我们认为生信小白入门不得不听的一个课程,我们也为这个课程准备了许多干…

ffmpeg基础整理

FFmpeg 是一个开源的跨平台 多媒体处理工具 ,可以用于 录制、转换、编辑、流式传输 音视频文件。它支持几乎所有常见的音视频格式,功能极其强大,是开发者、视频创作者常用的命令行工具。 一、FFmpeg 核心功能 格式转换:将视频/音频…

【SpringMVC】常用注解:@RequestBody

1.作用 用于获取请求实体内容,直接使用得到的是keyvalue&keyvalue的数据。获取请求实体内容不适用get请求。 2.属性 required 描述是否有请求体,默认值为true。当取值为true时,get 请求方式会报错。如果取值为false,get请…

pytorch小记(十一):pytorch中 `torch.nn.Dropout` 详解

pytorch小记(十一):pytorch中 torch.nn.Dropout 详解 PyTorch torch.nn.Dropout 详解1. 什么是 Dropout?2. torch.nn.Dropout 语法3. torch.nn.Dropout 示例📌 示例 1:基本用法📌 示例 2&#x…