【STM32】基于STM32F103C8T6标准库的工程模板创建(使用离线固件包纯手动创建)

一、简介

       该文将展示STM32F103C8T6标准库的工程示例模板创建,但是,前提需要单片机入门的基础知识,提示这里不会展示如何安装Keil For ARM(MDK)和STM32F1系列的Keil固件包,这些将在其他文章进行阐述。

STM32F1系列标准库源码下载链接

二、工程创建

1.首先创建一个新的文件夹

2.在STM32_Example文件夹下建立以下文件夹

3.然后将ST提供的F1系列的标准固件包的STM32F10x_StdPeriph_Driver外设源码文件夹整个复制到STM32_Example文件夹下,同时将STM32F10x_StdPeriph_Driver更名为Library

这个网页链接可以删掉

4.将\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport下的core_cm3.c/h文件复制到StartUp文件夹下,这里的core_cm3.c/h是STM32F1系列需要的内核支持文件,即内核是属于ARM的Cortex-M3架构

5.将\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x文件夹下的这三个系统文件复制到StartUp文件夹下

6.在嵌入式开发中,.s 文件通常是用汇编语言编写的启动文件或底层初始化代码,其核心作用是建立硬件与高级语言(如 C)之间的桥梁,将\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm的所有.s文件复制到StartUp文件夹下

7.在ST给的例程中,即\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template文件夹下

main.c        stm32f10x_conf.h        stm32f10x_it.c/h        

四个文件复制到User文件夹下

8.文件移植完毕,就打开Keil创建工程,选择Project文件夹放Keil工程启动文件,命名并保存

9.选择MDK的对应芯片的支持包,选中STM32F103C8

这个是Keil自带的在线库配置工具,使用这个工具其实也可以配置标准库工程,但是,在这里我们是下载了离线的标准库来纯手动导入,那么就不使用这个工具了,直接点击OK关掉即可

以后启动该Keil工程就点击绿色可执行文件

10.点击红绿白彩色图标,创建我们的工程组结构

点红色的X可以删掉默认的组

建立4个组

11.选中中间的各组,点击ADD Files导入标准库文件

StartUp

添加3个文件,一般是要.c文件,和.s文件,.h头文件在后面配置文件路径后编译器可以自行找到,除非需要改动.h头文件就导入到工程里

Library

需要所有的外设源文件,或者按自己的需求导入

User

BSP

有些习惯写Hardware,但是作用都一样,主要存放用户自己写的函数和一些外设(如温湿度模块)的驱动文件

12.点击有些人常说的“魔法棒”,配置工程的详细设置

C/C++

Define这里添加一下宏 USE_STDPERIPH_DRIVER

优化等级最好选0,有些时候优化等级太高会出现一些问题

勾选C99,支持的C语言语法更丰富

最重要的就是最后一个框添加那些文件的具体路径,但是有些人会看到正点原子的包含头文件的方法写的是相对路径,如果以后那种遇到但是有问题就可以使用Keil的includepaths来添加文件

Debug

这里主要选择下载/烧写方式

这里点击setting后选择下载地址范围(一般是芯片自带默认配置),下载算法和下载模式(SW/JTAG),还有下载完成软件复位

13.除了汇编启动文件,main.c的main函数就是我们编写代码后的正式入口了,把这里移植过来的main.c里的东西删完

main.c

#include "stm32f10x.h"                  // Device header

int main(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOC, &GPIO_InitStructure);
	
	GPIO_SetBits(GPIOC, GPIO_Pin_13);
	while(1)
	{
		GPIO_SetBits(GPIOC, GPIO_Pin_13);
        //空循环当时间间隙使用,观察STM32F103C8T6最小系统开发板的板载LED(PC13)闪烁效果
		for(int i = 0 ;i < 3000;i++)
		{
			for(int j = 0 ;j < 200;j++)
			{
				
			}
		}
		GPIO_ResetBits(GPIOC, GPIO_Pin_13);
		for(int i = 0 ;i < 3000;i++)
		{
			for(int j = 0 ;j < 200;j++)
			{
				
			}
		}
	}
}

在Keil中,单片机的main函数初始化后就会一直执行while(1)里的内容,同时还要求每个.c/h文件最后必须有一行空行

三、实验效果

posted @ 2025-07-04 01:04  Molesidy  阅读(6)  评论(0)    收藏  举报  来源
//雪花飘落效果