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

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 运行模式,
请添加图片描述
测试成功。以上,是标准库新建工程的流程。

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

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

### 创建基于STM32F103的FreeRTOS工程项目 #### 准备工作 为了在STM32F103上建立一个新的FreeRTOS工程项目,确保已经安装了必要的开发工具链,包括但不限于Keil MDK、STMCubeMX以及相应的编译器和支持库。 #### 使用STM32CubeMX配置硬件资源 通过STM32CubeMX软件初始化目标板的相关外设设置。启动STM32CubeMX后,选择对应的微控制器型号(即STM32F103系列),然后按照需求配置时钟树和其他外设功能。完成这些设定之后导出项目到指定IDE环境如Keil uVision中[^1]。 #### 添加FreeRTOS源码至工程结构内 在所选IDE环境中打开由STM32CubeMX生成的基础框架代码,在此基础之上引入FreeRTOS组件: - **创建目录**: 在项目的根目录下新增名为`FreeRTOS`的文件夹用于存放操作系统核心及相关支持模块;该文件夹内部继续细分出`inc`, `src`, 和`port`三个子文件夹分别用来放置头文件(.h), 实现文件(.c),以及特定于处理器架构端口层实现。 - **导入必要文件**: 将官方发布的FreeRTOS版本中的对应部分复制粘贴进入上述各相应位置,并注意调整路径使得所有include语句能够正确解析依赖关系。 #### 配置FreeRTOSConfig.h参数 编辑位于`FreeRTOS/inc/`下的`FreeRTOSConfig.h`文件来定义适合应用场合的具体行为特性,比如最大优先级数量、时间片轮转间隔等重要选项都需要在此处明确指出其取值范围和默认状态。 ```c #define configCPU_CLOCK_HZ ( SystemCoreClock ) #define configTICK_RATE_HZ ((TickType_t)1000) #define configMAX_PRIORITIES (7) // 更多配置项... ``` #### 编写应用程序逻辑 最后一步是在main函数或者其他适当的地方编写实际业务处理流程,利用FreeRTOS API接口管理任务调度与同步机制等功能特性。例如下面展示了一个简单的例子展示了如何创建两个独立运行的任务实例并让它们周期性的打印消息给串口终端设备查看效果。 ```c void vTask1(void *pvParameters){ while(1){ printf("This is Task 1\n"); vTaskDelay(pdMS_TO_TICKS(500)); } } void vTask2(void *pvParameters){ while(1){ printf("This is Task 2\n"); vTaskDelay(pdMS_TO_TICKS(1000)); } } int main(){ /* 初始化系统 */ // 启动 RTOS 调度程序前先创建一些测试用途的任务对象 xTaskCreate(vTask1, "TASK_1", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL); xTaskCreate(vTask2, "TASK_2", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 2, NULL); // 开始执行多线程并发控制循环体 vTaskStartScheduler(); for (;;); // 如果到达这里说明内存不足无法开启更多进程,则陷入死循环等待重启恢复常态 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猫猫的小茶馆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值