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

二、工程创建
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文件最后必须有一行空行


三、实验效果


浙公网安备 33010602011771号