新建工程
目前STM32的工作方式主要有基于寄存器的方式,基于标准库(库函数),基于HAL库
基于寄存器:
- 和51单片的开发方式一样,用程序直接配置寄存器,达到想要的功能。
- 这种方式最底层,最直接,效率会更高一些
- 但是由于STM32的结构复杂,寄存器太多,所以不推荐
基于标准库(库函数):
使用ST官方提供的封装好的函数,通过函数调用间接配置寄存器
本课程使用
基于HAL库:
使用图形化界面快速配置STM32,适合快速上手
隐藏了底层逻辑,推荐学完标准库再使用此类
创建工程:
- 新建文件夹,命名为Project
3. 配置启动文件
在固件库中找到以下文件在Project中新建Start文件夹
进行粘贴
重新回到固件库中,将以下3个文件也放入Start文件夹
说明:
- 第一个.h文件为外设寄存器描述文件 两个system文件用于配置时钟
添加内核寄存器描述文件
(因为STM32是内核和外围寄存器一起的)
.c文件是内核配置函数
新建 Group 改名 Start
引入Keil 5中,在 Options for targtes 中找到 C/C++ 中添加Start路径
- 新建 main.c 文件进行测试
板子连线
在 Options for targtes 中找到 Debug 中设置
Settings 中勾选 Reset and Run
检查板子是否连接成功
- 检查连线,一定要对应
- 如果连接上 SWDIO 会显示如下
点击Build,再点击Load,灯灭
配置寄存器点灯
通过参考STM32手册
RCC 寄存器,来使能 GPIOC 的时钟(GPIO都是APB2的外设,可以在图纸里看到)
第一个寄存器可以在 7.3.7 APB2 外设时钟使能寄存器(RCC APB2ENR) 这个目录看到:
4 - IOPCEN 为使能 GPIOC 的时钟,写 1 打开,32位换算成16进制 4个一分组
GPIO 寄存器
第二个寄存器配置 PC13口的模式 :
8.2.2 端口配置高寄存器(GPIOx CRH)(X=A…E):CNF13[1:0] 和 MODE13[1:0] 是用来配置 13号口。 CNF 选择 通用推挽输出 00,MODE 为 输出模式 11
第三个寄存器配置 PC13 口输出数据
8.2.4端口输出数据寄存器(GPIOX ODR)(X=A…E) 对 ODR13 进行配置 1为高电平,0为低电平
#include "stm3210x.h'
int main(void){
RCC->APB2ENR = 0x00000010;
GPIOC->CRH = 0x003000002;
GPIOC->ODR = 0x00002000; //将2改为0,则亮灯
while (1){
}
}
缺点:
把除了 PC13 之外的位都配置成了 0,这样会影响其他端口原有配置
如果只配置 PC13 而不影响其他位,那还需要 &= 和 |= 的操作,较为麻烦
使用库函数点灯
- Projects 中新建 Library 文件夹
- 固件库中按照图中路径复制以下文件到 Library 文件夹
再打开 inc 文件夹继续全选并粘贴至 Library 文件夹
3. 在 Keil5 中进行配置
再去固件库中找到以下3个文件
添加到 User
打开 stm32f10x.h 以下语句说明 定义了 USE STDPERIPH DRIVER 这个字符串,该库函数才有效
需要在 工程选项 中配置
编译并加载
程序代码如下,设置高低电平GPIO_SetBits
进行操作
#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); //light on,高电平
//GPIO_ResetBits(GPIOC,GPIO_Pin_13);//light off,低电平
while(1){
}
}
每一句代码都可以右键找到参数说明进行配置
总结
- 启动文件根据 芯片型号 选择 对应缩写文件
- 新建工程步骤
1)建立工程文件夹,Keil中新建工程,选择型号
2)工程文件夹里建立Start、Library、User等文件夹,复制固件库里面的文件到工程文件夹
3)工程里对应建立Start、Library、User等同名称的分组,然后将文件夹内的文件添加到工程分组里(添加.h 文件方便查找)
4)工程选项, C/C++,Include Paths内声明所有包含头文件的文件夹程选项,
5)工程选项,C/C++,Define内定义USE STDPERIPH_DRIVER
6)工程选项,Debug,下拉列表选择对应调试器,Settings,FlashDownload里勾选Reset and Run - 工程架构
startup启动文件作为最基本文件startup_stm32f10x.mds 中定义了中断向量表,中断服务函数等。中断服务函数中的复位中断是整个程序的入口。