学习来源:[2-2] 新建工程_哔哩哔哩_bilibili
目前STM32的开发主要有基于寄存器的开发方式、基于标准库也就是库函数的方式和基于HAL库的方式。本学习是基于库函数的方式。(各种资料去百度云下载)
1 建立工程文件夹
Keil中新建工程,选择型号


选择相应的芯片型号(STM32F103C8T6)

关掉工程小助手

2 在工程文件夹中新建文件
工程文件夹里建立Start、复制固件库里面的文件到工程文件夹;
2.1 STM32的启动文件
在工程文件夹里新建start文件夹

找到STM32的启动文件
\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm

和
\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\

stm32f10x.h是STM32的外设寄存器描述文件,作用和51单片机的REGX52.H一样,是用来描述STM32有哪些寄存器和它对应的地址的。
两个System文件主要是用了配置时钟的。STM32主频72MHz就是System中的函数配置的。
复制到Start文件夹中。
因为这个STM32是内核和内核外围的饺备组成的,所以添加内核寄存器的描述文件到Start文件下
\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport

2.2 将复制的文件添加到工程

添加启动文件(为什么选这个,后面会说)

剩下的.c和.h文件都要添加进来,结果如图

2.3 在工程选项中添加头文件的路径
添加start的路径

2.4 新建main函数
先在工程目录下添加User文件夹,再在界面新建User目录,添加c文件,将路径改到User下


#include "stm32f10x.h" // Device headerint main(void)
{while(1){}}
编译

这个工程目前还没有添加STM32的库函数,所以它还是基于寄存器开发的工程。(想使用寄存器开发STM32到这里就可以了,但是我们是基于库函数的学习)。
调编码格式(UTF-8)、字体、缩进

2.5 通过配置寄存器来完成点灯实验
【了解】


配置调试器

再点击设置按钮

勾上选项之后。我们下载程序后会立马复位并执行。这样方便些。
打开STM32的参考手册(STM32F10xxx参考手册)
(a)首先是RCC的寄存器,来使能GPIO的时钟,GPIO都是APB2的外设
RCC: Reset and Clock Control,即复位和时钟控制。
APB2 外设时钟使能寄存器(RCC_APB2ENR)

这一位就是使能GPIOC的时钟的

写1是打开时钟,即
RCC->APB2ENR = 0x00000010;
(b)需要配置PC13口的模式(端口配置高寄存器(GPIOx_CRH) (x=A..E))

CNF13和MODE13就是配置13号口的
CNF配置为通用推挽输出模式,MODE配置为输出模式。

即

其他全为0
GPIOC->CRH = 0x00300000;
(c)GPIO输出数据

测试代码
#include "stm32f10x.h" // Device headerint main(void)
{RCC->APB2ENR = 0x00000010;GPIOC->CRH = 0x00300000;GPIOC->ODR = 0x00000000; // 低电平点亮
// GPIOC->ODR = 0x00002000; // 灭while(1){}}
需要不断查手册,来了解寄存器的功能。(不方便)
2.6 通过库函数实现点灯实验
在工程目录下新建Library文件夹,将下述文件夹下的所有文件粘贴到Library下(库函数的源文件和头文件)
\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver\src
\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver\inc

结果如图

此时库文件还不能使用,需要再添加配置文件,将下述文件粘贴到User路径下,再在keil中将新加的文件加入
\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template

结果如图

最后需要一个宏定义

USE_STDPERIPH_DRIVER
将文件夹添加进来

代码步骤和配置寄存器是一样的
(1)配置时钟-RCC_APB2PeriphClockCmd

本质函数配置寄存器
(2)配置端口模式-GPIO_Init

两个参数,GPIO_TypeDef* GPIOx和GPIO_InitTypeDef* GPIO_InitStruct
GPIOx选择GPIOC即可;
GPIO_InitStruct是一个结构体

GPIO_Pin

GPIO_Mode

GPIO_Speed

测试代码
#include "stm32f10x.h" // Device headerint main()
{// 使能时钟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_SetBits(GPIOC, GPIO_Pin_13); // 高电平 灭GPIO_ResetBits(GPIOC, GPIO_Pin_13); // 低电平 亮GPIO_Init(GPIOC, &GPIO_InitStructure);while (1){}}
3 型号分类及缩写

前面选择启动文件的时候,选择后缀为md的文件。我们的型号是STM32F103,64k


4 总结新建工程
- 建立工程文件夹,Keil中新建工程,选择型号
- 工程文件夹里建立Start、Library、User等文件夹,复制固件库里面的文件到工程文件夹
- 工程里对应建立Start、Library、User等同名称的分组,然后将文件夹内的文件添加到工程分组里
- 工程选项,C/C++,Include Paths内声明所有包含头文件的文件夹
- 工程选项,C/C++,Define内定义USE_STDPERIPH_DRIVER
- 工程选项,Debug,下拉列表选择对应调试器,Settings,Flash Download里勾选Reset and Run
5 工程架构
