2 软件安装及新建工程
2.1 软件安装
2.2 新建工程
- STM32的开发方式主要有基于寄存器的方式、基于标准库(库函数)和基于HAL库的方式;
- 基于寄存器的方式和基于51单片机的方式一样,是用程序直接配置寄存器,以达到想要的功能;
- 该方式最底层、最直接、效率也很高,但是由于STM32的结构复杂、寄存器太多,所以不推荐使用这种方式;
- 基于库函数的方式是使用ST官方提供的封装好的函数,通过调用这些函数来间接地配置寄存器;
- 由于ST对寄存器封装得比较好,所有这种方式既能满足对寄存器的配置,对开发人员也比较友好,有利于提高开发效率,本课程使用的就是这种方式;
- 基于HAL库的方式,就是使用图形化界面来快速配置STM32;
- 基于寄存器的方式和基于51单片机的方式一样,是用程序直接配置寄存器,以达到想要的功能;
- 步骤:
-
前面几步和51一样;
-
芯片选择:
- 会弹出一个Keil软件的新建工程小助手,可以帮助我们快速新建工程,此处不需要,直接关掉;
-
在工程中新建一个
Start
文件夹,加入以下文件(从课程资料中获取,注意有三处获取文件的地方):
- 第一处:STM32入门教程资料\固件库\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm;
- 是STM32的启动文件,STM32的程序就是从启动文件开始执行的;
- 第二处:STM32入门教程资料\固件库\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x;
stm32f10.h
就是STM32的外设寄存器描述文件,它的作用就跟51单片机的头文件REGX52.H
一样,是用来描述STM32有哪些寄存器和这些寄存器的对应地址的;- 其余两个
system_
开头的文件是用来配置时钟的,STM32主频是72MHz,就是在这两个文件中的函数配置的;
- 第三处:STM32入门教程资料\固件库\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport;
- 因为STM32是内核和内核外围的设备组成的,而且这个内核的寄存器描述和外围设备的描述文件不是在一起的,所以还需要添加一个内核寄存器的描述文件;
- 这两个Cortex-M3(简称:cm3)文件就是内核的寄存器描述,当然还带了一些内核的配置函数;
- 第一处:STM32入门教程资料\固件库\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm;
-
修改文件夹名(选中文件夹后,再次单击即可修改文件夹名)的同时,只需要加入以下5个文件到工程中即可(这些文件的图标上都带了一个小钥匙,代表这些文件是只读的);
-
添加
Start
文件夹的头文件路径:- 因为如果想使用自己建的文件夹中的
.h
文件,必须要先按照以下步骤声明以下该文件夹(就是让Keil这个编译器知道这个文件夹的存在),才可以使用该文件夹中的.h
文件;
- 因为如果想使用自己建的文件夹中的
-
先通过Windows的文件管理器,在工程中新建一个
User
文件夹,然后再通过下面的方式导入该文件夹,再修改文件夹名字为User
:
-
新建
main.c
文件,注意要修改文件存放路径为User
文件夹:
-
STM32和STLINK的接线图:
- 接好线后,将STLINK插在电脑上。若连接正确,STM32板子上的灯应该是电源灯常亮,另一个连接在PC13口上的灯默认是闪烁状态,这是芯片里的一个测试程序;
-
配置:
- 再按下
Download
键后,程序会被下载到单片机中,会发现闪烁的灯已经不闪了;
- 再按下
-
通过配置寄存器的方式点灯:
#include "stm32f10x.h" // Device header int main(void) { RCC->APB2ENR = 0x00000010; GPIOC->CRH = 0x00300000; GPIOC->ODR = 0x00000000; //若配置0x00002000,灯PC13就灭了 while(1) { } }
- 会发现PC13的灯亮起来了;
-
新建
Library
文件夹,用于存放库函数(文件夹的创建方式在上面已经陈述),添加以下文件(从课程资料中获取,注意有两处处获取文件的地方);
- 第一处:STM32入门教程资料\固件库\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver\src;
misc.c
就是内核的库函数,其它的就是内核外的外设库函数;
- 第二处:STM32入门教程资料\固件库\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver\inc;
- 这些是库函数的头文件;
- 第一处:STM32入门教程资料\固件库\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver\src;
-
将
Library
文件夹及其里面的文件添加进工程中:
-
在
User
文件夹中添加以下文件:
- 文件来源:\STM32入门教程资料\固件库\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template;
- conf(configuration)文件是用来配置库函数头文件的包含关系的,里面还有个用来做参数检查的函数定义,是所有库函数都需要的;
- 两个it(interrupt)文件是用来存放中断函数的;
- 文件来源:\STM32入门教程资料\固件库\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template;
-
配置:
- 下面
#ifdef
是一个条件编译,意思是定义了其后面的那个字符串,下面的#include
语句才可以生效;
- 下面
-
移动目录(将无法更改的目录放在最下面,更直观一点):
-
开启代码提示:
-
测试使用:
#include "stm32f10x.h" // Device header int main(void) { //通过配置寄存器的方式点亮PC13 // RCC->APB2ENR = 0x00000010; // GPIOC->CRH = 0x00300000; // GPIOC->ODR = 0x00000000; //若配置0x00002000,灯PC13就灭了 //开启使能时钟。第一个参数选择外设,第二个参数选择新的状态 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //配置端口模式 //定义一个结构体 GPIO_InitTypeDef GPIO_InitStructure; //配置结构体的参数(Ctrl+Alt+空格可以提示参数) GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //第一个参数是选择哪一个GPIO,第二个参数是一个指向结构体的指针 GPIO_Init(GPIOC, &GPIO_InitStructure); //设置端口的高低电平进行点灯,GPIO_Pin_13端口置高电平时灯被点亮 //下面这个函数可以把指定端口设置为高电平 // GPIO_SetBits(GPIOC, GPIO_Pin_13); //下面这个函数可以把指定端口设置为低电平 GPIO_ResetBits(GPIOC, GPIO_Pin_13); while(1) { } }
-
- 步骤总结:
- 建立工程文件夹,Keil中新建工程,选择型号;
- 工程文件夹里建立Start、Library、User等文件夹,复制固件库里面的文件到工程文件夹;
- 工程里对应建立Start、Library、User等同名称的分组,然后将文件夹内的文件添加到工程分组里;
- 工程选项,C/C++,Include Paths内声明所有包含头文件的文件夹;
- 工程选项,C/C++,Define内定义USE_STDPERIPH_DRIVER;
- 工程选项,Debug,下拉列表选择对应调试器,Settings,Flash Download里勾选Reset and Run。
2.3 STM32F1系列型号分类及缩写
缩写 | 释义 | Flash容量 | 型号 |
---|---|---|---|
LD_VL | 小容量产品超值系列 | 16~32K | STM32F100 |
MD_VL | 中容量产品超值系列 | 64~128K | STM32F100 |
HD_VL | 大容量产品超值系列 | 256~512K | STM32F100 |
LD | 小容量产品 | 16~32K | STM32F101/102/103 |
MD | 中容量产品 | 64~128K | STM32F101/102/103 |
HD | 大容量产品 | 256~512K | STM32F101/102/103 |
XL | 加大容量产品 | 大于512K | STM32F101/102/103 |
CL | 互联型产品 | - | STM32F105/107 |
- 根据不同的型号选择不同的启动文件;
- 若使用的是
STM32F100
型号,就选择带VL
的启动文件,再根据Flash的大小选择LD
、MD
还是HD
; - 若使用的是
STM32F101
、STM32F102
、STM32F103
型号,就选择不带VL
的启动文件,再根据Flash的大小选择LD
、MD
、HD
还是XL
; - 若使用的是
STM32F105
、STM32F107
型号,直接选择CL
的启动文件即可; - 此处使用的是
STM32F103
的芯片,又因为C8T6的Flash是64K,所以选择MD
的启动文件。