一、STM32 的开发方式

        STM32 有寄存器和库函数两种开发方式,对比 STM32 的两种开发方式,库函数操作简单,但是效率不如寄存器操作的高;寄存器操作要熟悉上百个寄存器,很复杂,但是程序效率很高。但实际开发中以库函数编程为主要开发方式,在固件库的使用,首先要对重要寄存器有一定了解,这样可以更快的掌握寄存器操作。另外,虽然学习固件库,不需要记住每个寄存器的作用,但是通过寄存器操作可以对外设一些功能有所了解,这样对库函数的学习和使用也很有帮助。

二、STM32 的编程语言

        在嵌入式开发中可以混合使用 C 语言和汇编语言两种语言。汇编语言作为低级语言,是仅次于机器语言和硬件联系最紧密的语言。汇编的优点在于语句执行时序的精确性,执行效率高,对一些实时性要求很高的系统,汇编语言比较容易实现。汇编语言的实时性非常好,但可读性差,可移植性不强。现在 STM32 开发中,使用 C 语言作为编程语言的比较多,因为 C 语言有很好的结构性,比汇编语言更容易阅读与维护,而且功能化、模块化的代码有更好的移植性,方便从一个工程移植到另一个工程,C 语言也更符合人们的思考习惯,便于阅读和理解。

三、STM32 固件库介绍

3.1、CMSIS 标准

  1. ARM 与芯片厂商建立了 CMSIS 标准(Cortex Microcontroller Software Interface Standard),即 Cortex 微控制器软件接口标准。CMSIS 层位于硬件层与操作系统或用户层之间,提供了芯片与芯片厂商无关的硬件抽象层,可以为接口外设和实时操作系统提供简单的处理器软件接口,屏蔽了硬件差异。
  2. 基于 CMSIS,ST 公司提供了官方库。用户可以基于官方库进行软件开发。

CMSIS 分为3个基本功能层:

  1. 核内外设访问层:ARM 公司提供的访问,定义处理器内部寄存器地址以及功能函数。
  2. 中间件访问层:定义访问中间件的通用 API。由ARM提供,芯片厂商根据需要更新。
  3. 外设访问层:定义硬件寄存器的地址以及外设的访问函数。

3.2、STM32固件库结构

  1. Libraries 文件夹下面有 CMSIS 和 STM32F10x_StdPeriph_Driver 两个目录,包含驱动库的源代码及启动文件。
  2. CMSIS 文件夹存放的是符合 CMSIS 规范的一些文件。包括 STM32F1 核内外设访问层代码,RTOS API,以及 STM32F1 片上外设访问层代码等。
  3. STM32F10x_StdPeriph_Driver 放的是 STM32F1 标准外设固件库源码文件和对应的头文件。inc 目录存放的是 stm32f10x_ppp.h 头文件,无需改动。src 目录下面放的是stm32f10x_ppp.c 格式的固件库源码文件。每一个.c 文件和一个相应的.h 文件对应
  4. Project 文件夹:STM32F10x_StdPeriph_Examples 文件夹中存放的是 ST 官方提供的固件实例源码,STM32F10x_StdPeriph_Template 文件夹中存放的是工程模板。
  5. Utilities 文件下就是官方评估板的一些对应源码。 stm32f10x_stdperiph_lib_um.chm 文件是固件库的帮助文档,主要讲的是如何使用驱动库来编写自己的应用程序。

关键文件有:

  1. core_cm3.c 文件
  2. system_stm32f10x.c 文件
  3. stm32f10x.h 文件

启动文件

  1. stm32f10x_it.c、 stm32f10x_conf.h 文件
  2. stm32f10x_ppp.c 和 stm32f10x_ppp.h 文件
  3. misc.c 和 misc.h  

四、使用 MDK5 搭建 STM32 开发环境流程

4.1、创建工程文件

4.2、创建新工程

4.2.1 往 start 目录添加文件

将固件中 startup 中的 arm 所有文件放入项目中 start

将固件中的 STM32F10x 复制到 start 目录中

 将固件中的 CoreSupport 复制到 start

将 start 目录添加到项目中

4.2.2 给 libraries 中添加文件

将固件中 Libraries --src

将固件中 Libraries --inc

4.2.3 给 user 添加文件

4.3、程序编译配置

添加宏定义 USE_STDPERIPH_DRIVER,STM32F10X_MD

新建工程步骤:

  1. 建立工程文件夹,Keil 中新建工程,选择芯片型号 STM32F10X
  2. 工程文件夹里建立 Start、Library、User 等文件夹,复制固件库里的文件到工程文件夹
  3. 工程里建立 Start、Library、User 等对应同名称的分组,然后将文件夹内文件添加到工程分组里
  4. 工程选项 --> C/C++ --> Include Paths 内申明所有包含头文件的文件夹
  5. 工程选项 --> C/C++ --> Define 内定义 USE_STDPERIPH_DRIVER
  6. 工程选项 --> Debug -->下拉列表 选择对应调试器,Setting --> Flash Download --> Reset and Run

4.4、烧录程序

五、两种开发模式模版

5.1、基于寄存器开发模版

https://download.csdn.net/download/t281531576/92798155

        这种方式虽然执行效率高,但由于嵌入式系统寄存器资源非常多,使用此法,开发效率低,容易出错。

5.1.1、创建保持工程文件的文件夹

5.1.2、使用 MDK keil5 新建项目

挑选芯片型号

项目向导,直接关闭就好

5.1.3、在保存项目的文件夹中新建 Start、User 文件夹

  

Start:存放启动所需,不可更改文件
 


User:存放用户添加的文件

5.1.4、在 MDK keil5 项目中新建 Start、User 组,并将相应的文件加入组中;

5.1.5、添加 start 路径

 

5.1.6、设计编译器

注意:不要使用 compiler version 5,不然编译不了。

5.1.7、编译结果

5.2、基于库函数开发模版

5.2.1、前面同基于寄存器开发模版

5.2.2、在项目文件夹中新建文件夹 Library

复制 Libraries --> STM32F10_Driver --> src 中所有文件到 Library 中
复制 Libraries --> STM32F10_Driver --> inc 中所有文件到 Library 中

   

5.2.3、在 User 文件中添加库函数配置文件

复制 Project --> __Template --> conf.h 、it.c、it.h

5.2.4、添加宏定义与路径

USE_STDPERIPH_DRIVER 8296

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐