Stm32 固件库移植

关键词: STM32 固件库

STM32F10x标准外设库是一个完整的软件包,包含所有标准设备外设的设备驱动程序,
用于STM32值线(高、中、低)、连接线、XL-、高、中、低密度设备32位闪存微控制器。

这个库是一个固件包,包含了一系列例程、数据结构和宏,涵盖了STM32外设的特性。
它包括对设备驱动程序的描述以及每个外围设备的一组示例。
固件库允许在用户应用程序中使用任何设备,而无需深入研究每个外围设备的规格。

使用标准外设库有两个优点:它节省了大量的时间,同时降低了应用程序开发和集成成本。

主要内容:

使用固件库创建一个STM32工程

  • 固件库获取和了解
  • 创建固件库工程(固件库移植)
  • 使用固件库点灯

文档参考:

  • 官方下载地址

最新地址: https://taotaodiy-mcu.readthedocs.io/en/latest/stm32/project_fwl.html

标准固件库

我们这里使用的版本为 V3.5.0

固件库下载

获取标准固件库,在官网注册一个账号,下载标准固件库。

官方下载地址
固件库下载 V3.5.0

固件库手册

解压固件库的压缩包我们就能看到 stm32f10x_stdperiph_lib_um.chm 固件库的使用手册。
手册介绍了固件库,支持的设备和工具链,以及如何移植和示例。

部分内容为百度翻译,请参考手册原文。

固件库手册下载

固件库目录

stm32f10x_stdperiph_lib //标准固件库
├── Libraries
│   ├── CMSIS/CM3 //内核相关
│   │   ├── CoreSupport //内核的寄存器映射
│   │   └── DeviceSupport
│   │         └── ST\STM32F10x //包括启动文件,外设寄存器映射,时钟配置等
│   └── STM32F10x_StdPeriph_Driver //标准固件库源文件
├── Project
│   ├── STM32F10x_StdPeriph_Examples //外设示例
│   └── STM32F10x_StdPeriph_Template //不同编译环境的工程示例
├── _htmresc
├── Utilities //官方评估板的示例
│   └── STM32_EVAL
└── stm32f10x_stdperiph_lib_um.chm //手册

STM32F10x标准固件库结构

STM32F10x标准固件库文件说明

  • stm32f10x_conf.h
    外设驱动程序配置文件,用户可以使用模板启用或禁用外围头文件包含,此文件还可用于在编译固件库驱动程序之前,通过预处理器define
    USE_FULL_ASSERT 启用或禁用库运行时故障检测
  • stm32f10x_ppp.h
    PPP(如ADC,I2C)外设头文件,此文件包括PPP外围函数和这些函数中使用的变量定义。
  • stm32f10x_ppp.c 用C语言编写的PPP外设驱动源代码文件
  • stm32f10x_it.h 包括所有中断处理程序原型的头文件
  • stm32f10x_it.c
    包含CortexM3异常的中断服务例程(ISR)的模板源文件。用户可以为所用外设添加额外的ISR(有关可用外设中断处理程序的名称,请参阅启动文件startup_stm32f10x_xx.s)。
  • stm32f10x.h CMSIS Cortex-M3
    STM32F10xxx设备外围访问层头文件。该文件是应用程序程序员在C源代码(通常在main.C中)中使用的唯一包含文件。该文件包含:配置部分;所有外设的数据结构和地址映射;外设寄存器声明和位定义;访问外设硬件寄存器的宏。
  • system.stm32f10x.h CMSIS Cortex-M3
    STM32F10xxx设备外围访问层系统头文件。
  • system.stm32f10x.c CMSIS Cortex-M3
    STM32F10xxx设备外围访问层系统源文件。
  • startup_stm32f10x_cl.s 连接线设备启动文件。
  • startup_stm32f10x_xl.s XL密度设备启动文件
  • startup_stm32f10x_hd.s 高密度设备启动文件。
  • startup_stm32f10x_hd_vl.s 高密度值线设备启动文件。
  • startup_stm32f10x_md.s 中等密度设备启动文件。
  • startup_stm32f10x_md_vl.s 中等密度值线设备启动文件。
  • startup_stm32f10x_ld.s 低密度设备启动文件。
  • startup_stm32f10x_ld_vl.s 低密度值线设备启动文件。

固件库移植

如何移植

大致步骤如下:

  • 创建文件夹,文件夹目录参考固件库工程模板和下一小节工程目录。
  • 复制固件库文件到对应的文件夹中。
  • 创建keil工程,利用工程管理一一添加对应的文件。
  • 配置工程:选择启动文件;在文件中包含stm32f10x.h;时钟配置(默认)。

固件库移植参考

工程目录

固件库工程模板 0-STM32F103C8T6_FWL

该模板结合固件库模板和参考了其他工程,工程目录如下:

STM32F103C8T6_FWL
├── CORE
│   ├── core_cm3.c
│   ├── core_cm3.h //Cortex-M3核心外设访问层头文件
│   ├── startup_stm32f10x_hd.s //启动文件
│   ├── startup_stm32f10x_ld.s
│   ├── startup_stm32f10x_md.s
│   ├── stm32f10x_conf.h //库配置文件
│   ├── stm32f10x.h //Cortex-M3设备外围访问层头文件
│   ├── stm32f10x_it.c
│   ├── stm32f10x_it.h //此文件为所有异常处理程序和外围设备提供模板中断服务程序
│   ├── system_stm32f10x.c
│   └── system_stm32f10x.h //Cortex-M3设备外围访问层系统源文件
├── HARDWARE //硬件驱动代码 如led等
├── JLinkSettings.ini //下载器设置
├── keilkilll.bat //删除中间文件的批处理文件
├── Listings
├── Objects //编译生成
│   ├── STM32F103C8T6_FWL.hex
│   └── STM32F103C8T6_FWL.sct
├── README.md //说明文件
├── STM32F103C8T6_FWL.uvprojx //工程配置文件
├── STM32F10x_FWLib //固件库
│   ├── inc
│   └── src
├── SYSTEM //系统文件 协议等
└── USER //用户文件└── main.c

工程创建

1.创建目录 0-STM32F103C8T6_FWL 及对应的文件夹

2.创建空工程

  • 打开keil软件新建工程
  • Project --> New uVision
  • Project --> 选择创建的0-STM32F103C8T6_FWL --> 填入工程名称
  • 配置工程,选择设备,STM32F103C8,确定

3.工程管理中添加相应的targets和groups

在 工程目录0-STM32F103C8T6_FWL下面添加对应的目录

4.拷贝固件库文件到我们创建的工程

//固件库文件 --> 当前工程目录
stm32f10x_stdperiph_lib\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\stm32f10x.h --> 0STM32F103C8T6_FWL\CORE
stm32f10x_stdperiph_lib\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\system_stm32f10x* --> 0STM32F103C8T6_FWL\CORE
stm32f10x_stdperiph_lib\Libraries\CMSIS\CM3\CoreSupport --> 0-STM32F103C8T6_FWL\CORE
stm32f10x_stdperiph_lib\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm\startup_stm32f10x* --> 0-STM32F103C8T6_FWL\CORE
stm32f10x_stdperiph_lib\Project\STM32F10x_StdPeriph_Template\stm32f10x_conf.h --> 0-STM32F103C8T6_FWL\CORE
stm32f10x_stdperiph_lib\Project\STM32F10x_StdPeriph_Template\stm32f10x_it* --> 0-STM32F103C8T6_FWL\CORE
stm32f10x_stdperiph_lib\Libraries\STM32F10x_StdPeriph_Driver --> 0-STM32F103C8T6_FWL\STM32F10x_FWLib新建0-STM32F103C8T6_FWL\README.md 添加进工程的时候选择 Text Document file
新建0-STM32F103C8T6_FWL\keilkilll.bat 清理中间文件的批处理文件

5.依次将添加的文件添加到工程中

配置工程

我使用的是STM32C8T6,板子的外部晶振为8M 板子开源,自己制作也很简单 STM32C8T6最小系统

配置启动文件和包含头文件路径

创建Keil工程时,选择stm32f103c8芯片,需要设置添加相应的启动文件。
同样在更换工程的启动文件(通常在选择芯片时,会根据芯片设置define内容),有如下三个选项:

  • STM32F10X_LD,USE_STDPERIPH_DRIVER 对应 STM32 Low density devices
  • STM32F10X_MD,USE_STDPERIPH_DRIVER 对应 STM32 Medium density devices
  • STM32F10X_HD,USE_STDPERIPH_DRIVER 对应 STM32 High density devices

添加main.c

#include "stm32f10x.h"
int main(void)
{while(1);
}

编译工程 通过

固件库点灯

使用标准外设库有两个优点:它节省了大量的时间,同时降低了应用程序开发和集成成本。
固件库的使用有一套固定模板,也就是固件库的灵魂。

  • 固件库点灯工程

固件库使用方法

固件库使用的一般套路

  • 声明PPP外围设备初始化结构体
  • 给结构体成员赋值
  • 通过调用PPP_Init(…)函数初始化PPP外围设备
  • 通过调用PPP_Cmd(…)函数来启用PPP外围设备

示例如LED的初始化,其实质是GPIO_InitTypeDef结构体的初始化。

添加LED测试程序

修改main.c,添加LED初始化,设置LED闪烁延时。

#include "stm32f10x.h"
#include "mydelay.h"
#include "led.h"int main(void)
{LED_Init();while(1){LED1TURN;delay_ms(3600000);}
}

添加延时函数,通过while循环实现。

/************************************************************************************
* @fileName     mydelay.h
* @brief        自定义延迟函数
* @author       Bluseli www.bluseli.cn www.bluseli.site 从此深耕不回头,谢谢关注。
* @date         2020-1-3
***********************************************************************************/
#ifndef __MYDELAY_H
#define __MYDELAY_H  void delay_ms(unsigned int nms);#endif
/************************************************************************************
* @fileName      mydelay.c
* @brief        自定义延迟函数
* @author       Bluseli www.bluseli.cn www.bluseli.site 从此深耕不回头,谢谢关注。
* @date         2020-1-3
***********************************************************************************/
#include "mydelay.h"void delay_ms(unsigned int nms)
{while(nms--);
}

添加LED初始化,操作接口等。LED1ON,LED1OFF,LED1TURN使用宏的形式调用固件库函数,对LED引脚进行操作。

/************************************************************************************
* @fileName      led.h
* @brief        LED驱动代码
* @author       Bluseli www.bluseli.cn www.bluseli.site 从此深耕不回头,谢谢关注。
* @date         2020-12-5
***********************************************************************************/
#ifndef __LED_H
#define __LED_H  #include "stm32f10x.h"#define LED_ON  1
#define LED_OFF 0//这个写法来自 火哥 方便移植
//LED1
#define LED1_GPIO_CLK       RCC_APB2Periph_GPIOC        /* 时钟 */
#define LED1_GPIO_PORT      GPIOC                       /* 端口 */
#define LED1_GPIO_PIN       GPIO_Pin_13                 /* 位 */#define LED1ON      GPIO_SetBits(LED1_GPIO_PORT,LED1_GPIO_PIN)
#define LED1OFF     GPIO_ResetBits(LED1_GPIO_PORT,LED1_GPIO_PIN)
#define LED1TURN    GPIO_WriteBit(LED1_GPIO_PORT, LED1_GPIO_PIN,!GPIO_ReadOutputDataBit(LED1_GPIO_PORT,LED1_GPIO_PIN))void LED_Init(void);//初始化#endif
/************************************************************************************
* @fileName      led.c
* @brief        LED驱动代码
* @author       Bluseli www.bluseli.cn www.bluseli.site 从此深耕不回头,谢谢关注。
* @date         2020-12-5
***********************************************************************************/
#include "led.h"/**
* @describe LED引脚初始化  修改头文件中的宏进行引脚配置
* @param        无
*
* @return       无
*/
void LED_Init(void)
{GPIO_InitTypeDef  GPIO_InitStructure;RCC_APB2PeriphClockCmd(LED1_GPIO_CLK, ENABLE);          //使能PA端口时钟GPIO_InitStructure.GPIO_Pin = LED1_GPIO_PIN;            //端口配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure);//GPIO_SetBits(LED1_GPIO_PORT,LED1_GPIO_PIN);           //输出高GPIO_ResetBits(LED1_GPIO_PORT,LED1_GPIO_PIN);           //输出低
}

添加了上述文件,在main.c中引用,会发现找不到led.h和mydelay.hal库工程。这时还需要在魔术棒中添加头文件的包含路径。

编译下载就能看到LED闪烁。

Stm32 固件库移植相关推荐

  1. STM32固件库移植(开发环境的搭建)

    STM32固件库移植(开发环境的搭建) 以下过程是手动移植,过程繁琐,不感兴趣的可以绕路学习CubeMX. 下文阐述两种基本开发环境的搭建方法,HAL库的添加将放在下期 1.基本开发环境的搭建 先创一 ...

  2. 8 . STM32固件库介绍

    STM32固件库介绍 前面为大家简单介绍了如何使用寄存器点亮开发板上LED,这种开发方式显然是不适合大众,对于STM32 这样庞大的芯片,内部寄存器实在太多,如果操作的外设比较多,那么就需要花很多时间 ...

  3. 第9章 初识STM32固件库—零死角玩转STM32-F429系列

    第9章     初识STM32固件库 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fire ...

  4. STM32 固件库外设 GPIO 讲解(关于 GPIO 寄存器讲解)

    GPIO 外设讲解 通过博主上一篇博客,相信大家已经初步了解到了对于 STM32 的控制原理,但是 STM32 到外设 / 引脚有这么多,是要一个一个的去记住它的地址?或者每一次使用一个外设都要看一下 ...

  5. USB学习笔记(5)STM32 USB库移植步骤

    USB学习笔记(5)STM32 USB库移植步骤 本文是将官网的USB驱动库文件移植到自己的工程里面,实现USB功能的具体移植步骤说明,实现Custom_HID功能. 1.先准备一个工程模板 获取工程 ...

  6. STM32固件库文件树及构成详解

    (想要pfd格式文件的可以留下邮箱) STM32固件库文件树及构成详解(库版本:STM32F10x_StdPeriph_Lib_V3.5.0) 库减压后所有文件夹构成如下: /

  7. STM32固件库文件分析

    STM32固件库文件分析 1.汇编编写的启动文件 startup/stm32f10x.hd.s:设置堆栈指针,设置pc指针,初始化中断向量,配置系统时钟,对用c库函数_main最后去c语言世界里. 2 ...

  8. STM32固件库(Standard Peripheral Libraries )官网下载方法

    首先进入ST官网http://www.stmicroelectronics.com.cn/content/st_com/zh.html  1:选择"产品目录" 2:选择" ...

  9. STM32固件库(标准外设库)入门学习 第四章OLED屏幕使用

    STM32固件库(标准外设库)入门学习 第四章OLED屏幕使用 本学习教程,参考B站江科大自化协STM32视频,型号为STM32F103C8T6. 文章目录 STM32固件库(标准外设库)入门学习 第 ...

  10. 最新下载STM32固件库F1

    2022-12最新下载stm32固件库32054方法 打开日服st网站 https://www.stmcu.jp/ 点击新会员注册 这里需要填写一个半角的啥 你复制过去就行 リ 其他的你随便填写 后面 ...

最新文章

  1. java aio为什么不稳定_为什么我不提倡在Java中使用static
  2. C语言 | 编程实现1
  3. 无ldf文件情况下恢复数据库数据纪实
  4. 系统操作日志设计(二)
  5. getopt()和getopt_long()用法
  6. wpf office 菜单_如何带回Office 2007中的旧菜单
  7. “菜”鸟理解.NET Framework(CLI,CLS,CTS,CLR,FCL,BCL)
  8. C/C++ 常见编程技巧!你学会了吗?
  9. 问题来了:哪个AI公司会签下张学友当代言人?
  10. (其他)用sublime text3编写的html网页用浏览器打开出现中文乱码的原理及解决方法(转)...
  11. 西南交通大学计算机应用基础,西南交通大学计算机应用基础作业-客观部分
  12. 如何在在线直播网站源码中,实现视频连麦直播?
  13. sql sever如何进行英文词频统计_英语语料库及词频表介绍
  14. Android取手机号码
  15. 《自己动手写爬虫网络》笔记1
  16. 做正确的事(效果)比正确的做事(效率)更重要
  17. 《活着》读后感4500字
  18. RabbitMQ整合SpringCloud
  19. AppCan MVVM框架简单介绍
  20. 重庆航天职业技术学院计算机系在哪个校区,重庆航天职业技术学院地址在哪里,哪个城市...

热门文章

  1. 推荐系统实战1——什么是推荐系统与常见的推荐系统评价指标
  2. 销售管理系统哪个好用?
  3. 管理系统项目-简历描述篇
  4. Linux分区类型EXT2、EXT3、EXT4详解
  5. 简约个人介绍主页源码,免费创建个人主页
  6. 基于Androidstudio的2048小游戏的设计与实现
  7. Android历史与版本变迁
  8. Python语法糖系列
  9. VS 2013安装教程
  10. MAC开机启动项的管理