文章目录
- 标准外设库点亮STM32流水灯
- 一、工程的创建
- (一)官网下载标准外设库
- (二)工程创建
- 1.新建工程总文件夹
- 2.从标准库中复制文件
- 3.打开keil,新建工程
- 二实验波形及现象
- (一)波形
- 1.进入keil仿真波形
- 2.调试波形
- 3.运行波形
- 4.波形图
- (二)实验现象
- 三.总结
标准外设库点亮STM32流水灯
一、工程的创建
(一)官网下载标准外设库
1.打开网站:https://www.st.com/zh/embedded-software/stm32-standard-peripheral-libraries.html
2.页面找到F1 蓝色方块(STM32F1 系列),点击进入,点击获取软件
3.作为访客下载,填写相关信息,ST 会发一封邮件到你填的邮箱,邮件里面有下载链接,点链接下载
(二)工程创建
1.新建工程总文件夹
在 D 盘新建文件夹,命名为led,进入该文件夹,创建四个子文件夹,分别命名为User,CORE,FWLIB,OBJ
2.从标准库中复制文件
(1)复制到CORE文件夹
路径Libraries\CMSIS\CM3\CoreSupport复制:core_cm3.c、core_cm3.h
路径Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x复制stm32f10x.h、system_stm32f10x.c、system_stm32f10x.h
路径Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm复制:startup_stm32f10x_md.s
(2)复制到 FWLIB 文件夹
进入Libraries\STM32F10x_StdPeriph_Driver
src目录复制stm32f10x_gpio.c,stm32f10x_rcc.c,misc.c
inc目录复制stm32f10x_gpio.h,stm32f10x_rcc.h,misc.h
(3) User 文件夹
新建空白文本文件,改名字为main.c(注意:要把后缀.txt改成.c、)
3.打开keil,新建工程
(1)新建工程,保存到创建的USER子文件夹中
(2)选择芯片(标准外设库不使用 Keil 自带的软件包)
(3)在工程窗口新建 4 个分组
左侧 Project 窗口,右键Target 1→Add Group,依次创建 4 个分组USER,CORE,FWLIB,STARTUP
(4)打开魔法棒配置
按照下述设置
双击左侧USER下的main.c
#include"stm32f10x.h"// Device header#include"Delay.h"intmain(void){GPIO_InitTypeDef GPIO_InitStructure;//开启GPIOA、GPIOC时钟(PA1 PA3 PA5、PC13)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE);// PA1 PA3 PA5 推挽输出 50MHzGPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_3|GPIO_Pin_5;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);// PC13 推挽输出 50MHzGPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;GPIO_Init(GPIOC,&GPIO_InitStructure);//初始全部熄灭(输出高电平,低电平点亮LED)GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_3|GPIO_Pin_5);GPIO_SetBits(GPIOC,GPIO_Pin_13);while(1){//点亮PA1,其余熄灭GPIO_ResetBits(GPIOA,GPIO_Pin_1);GPIO_SetBits(GPIOA,GPIO_Pin_3);GPIO_SetBits(GPIOA,GPIO_Pin_5);GPIO_SetBits(GPIOC,GPIO_Pin_13);Delay_ms(1000);//点亮PA3,其余熄灭GPIO_SetBits(GPIOA,GPIO_Pin_1);GPIO_ResetBits(GPIOA,GPIO_Pin_3);GPIO_SetBits(GPIOA,GPIO_Pin_5);GPIO_SetBits(GPIOC,GPIO_Pin_13);Delay_ms(1000);//点亮PA5,其余熄灭GPIO_SetBits(GPIOA,GPIO_Pin_1);GPIO_SetBits(GPIOA,GPIO_Pin_3);GPIO_ResetBits(GPIOA,GPIO_Pin_5);GPIO_SetBits(GPIOC,GPIO_Pin_13);Delay_ms(1000);//点亮PC13,其余熄灭GPIO_SetBits(GPIOA,GPIO_Pin_1);GPIO_SetBits(GPIOA,GPIO_Pin_3);GPIO_SetBits(GPIOA,GPIO_Pin_5);GPIO_ResetBits(GPIOC,GPIO_Pin_13);Delay_ms(1000);}}二实验波形及现象
(一)波形
1.进入keil仿真波形
2.调试波形
依次添加自己的引脚,全部改完
3.运行波形
4.波形图
(二)实验现象
LED灯
三.总结
寄存器开发是直接操作硬件寄存器;标准外设库将寄存器操作封装为函数,简化开发,便于快速编写和维护程序,但底层仍然是寄存器操作。寄存器开发直接操作寄存器地址与比特位;标准库通过结构体和 API 函数配置外设,屏蔽底层寄存器细节。
| 对比项 | 直接寄存器编程 | 标准外设库 SPL |
|---|---|---|
| 操作对象 | 直接操作寄存器地址、bit 位 | 调用库函数 + 结构体,底层由库函数操作寄存器 |
| 代码长度 | 代码简短,但需要记忆寄存器名字、位编号 | 代码行数多,填写结构体参数,不用记寄存器每一位 |
| 学习门槛 | 高。要看懂芯片手册寄存器说明,容易写错 bit 位置 | 低。只需要记住函数名、结构体成员,适合入门 |
| 可读性 | 差,一堆移位<<,别人很难看懂 | 可读性好,函数名字语义清晰:GPIO_Init、RCC_APB2PeriphClockCmd |
| 出错概率 | 高。移位写错、寄存器选错,报错很难排查 | 低。库已经封装好,参数写错更容易定位 |
| 可移植性 | 差。换芯片寄存器地址、位定义变了,代码大量修改 | 较好。同系列 F1 芯片,修改少量宏即可移植 |
| 运行效率 | 最高,没有函数调用开销 | 几乎和寄存器一致,函数 inline 优化后差距极小 |
| 调试难度 | 难,需要对照手册看寄存器值 | 容易,Keil 可以直接看库函数参数 |
| 适合场景 | 底层优化、资源极度受限、想深入理解单片机原理 | 课程实验、项目快速开发,学校最常用 |