学习来源:[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