ARM嵌入式开发第六章:STM32代码结构Keil工程

前言

需安装完成Keil MDK软件,STM32 F103系列PACK包,原子哥论坛下载对应的例程代码,或者自己有其他单片机完整资源的都行。只要能打开代码工程正确编译都行。

一、文件夹目录

这是STM32正点原子开发板的例程代码,取第一个跑马灯实验代码工程进行分析

先说两个子文件,一个批处理脚本文件keilkill.bat一个readme.txt

这两个文件可有可无,删了也无妨,一个是删除工程目录下缓存文件(编译过程中的过程文件,keil工程生成的配置文件等等)的批处理脚本文件,一个是说明这个工程实验内容的文本文件。

另外说明一下这个工程目录结构属于自定义的,没有规定说非要严格按照这种格式,如果有自己的想法也可以自定义格式目录,之所以用正点原子的例程文件举例只是方便罢了。

1. Drivers

readme中介绍了每个文件夹存放了哪些东西

1)BSP

STM32开发板上安装了不少其他传感器,开关,LED灯等东西,这些元器件和单片机引脚相连,由单片机驱动工作。而我们为了使这些元器件正常工作,就要通过C语言编写完整的驱动函数,并下载到单片机中,当需要打开某个元器件使其工作时就调用相应的函数驱动元器件正常工作,这就是板级支持包的驱动代码,LED就是LED灯,驱动包括了灯光的开关函数,BEEP就是蜂鸣器,驱动包含了蜂鸣器的开和关。甚至配置蜂鸣器响多少秒,配置灯光闪烁多久,闪烁几次的功能函数的实现都可以算在驱动之内。有了现成的驱动我们只需要调用相关接口函数就可,但若是你使用一个新型元器件,找不到对应的驱动函数,这种情况就需要参考元器件的数据手册来自行编写相关驱动了。

2)CMSIS

ARM提供的CMSIS代码。先了解什么是CMSIS,为什么会有CMSIS。

为了使代码更具移植性和兼容性,ARM同许多微控制器供应商和软件方案供应商共同努力,开发了CMSIS软件框架,适用于大多数Cortex-M处理器。

CMSIS主要提供了Cortex-M内核的函数接口,前面有章节介绍了单片机组成就包含了一些内核的知识,而内核的接口函数就有NVIC中断服务相关函数,还有一些C语言无法直接生成的特殊指令的封装函数等等,不止如此,一些寄存器,中断服务函数等等的命名都包含在CMSIS中。

而这里的CMSIS文件夹中就包含了封装好的.c.h文件

如图所示,就是CMSIS全部的.h文件属于标准的CMSIS接口函数

而另一个Device文件夹下则是STM32厂家按照单片机不同型号不同外设配置的外设寄存器结构体等信息。

3)STM32F1xx_HAL_Driver

子目录包含inc和src两个文件夹,其中Inc是.h头文件,src是.c文件

具体内容主要是STM32F1XX芯片的片上外设的驱动函数,芯片上除了ARM内核做运算,每个厂家还挂载了许多外设到内核总线接口上,然后统一封装留出引脚就是我们常见的单片机了,而这些外设包括下图所示功能

每种外设都需要操作相关寄存器,为了简化开发难度,提高代码可移植性,单片机厂家提供了外设相关库函数。就是上图所示内容,当我们需要某个外设功能时就调用函数接口即可,不需要一个一个查寄存器功能,在代码里读写寄存器。而且同一厂家不同型号的芯片调用统一的外设接口,代码移植时只需要替换不同的hal_driver函数即可。

4)SYSTEM

这一块是自己对STM32的库函数的按照自己需要的功能进行封装后的函数,属于需要自己实现的功能函数,如下图,第一个跑马灯实验用到了时钟配置,串口通信等外设,因此正点原子团队就编写了相关驱动函数供我们参考

2. Middlewares

中间层组件,具体介绍见下图

这方面我了解到的不算多,就讲一讲自己的理解吧,可能会有些错漏之处。

首先了解什么是中间层,中间层,顾名思义就是在中间一层的代码,那么是哪两个层中间呢?

前面我们已经了解过了驱动层,然后如果我们要实现跑马灯功能,这个功能函数可以称为应用层,中间层就是这两层直接的代码了。当然,如果应用足够简单,也没必要加那么多层让代码显得臃肿不堪。’

但是如果应用逻辑过于复杂,为了降低其开发难度,降低其移植和维护的难度就会引入中间层的概念。

例如操作系统,嵌入式开发中最底层应该是硬件电路了,在往上一层就是驱动层了,而操作系统就是在往上的中间层接管了全部的外设功能,同时实现自身的任务调度功能。最后就是应用层了,在应用层我们只需关注程序实现的功能逻辑,而不需要考虑任务调度外设配置相关的事项。

这种引入中间层的开发方式大大降低了代码耦合性,实现了任务逻辑和驱动逻辑解耦合,提高程序健壮性,可移植性,可维护性。

3.Output

.c文件到hex或者bin文件需要经过多个步骤,执行过程会生成多种过程文件,这些过程文件以及hex和bin文件就输出在Output文件夹中。

4.Projects

Keil软件相关的工程文件配置信息就放在这个文件夹下,当然不止keil,ARM开发软件除了Keil还有IAR。总之,与工程相关的都放在这个目录下即可

5.User

应用层代码,main函数就是我们跑马灯任务的运行函数,剩下的一个是STM32F103芯片的配置.h文件,一个是中断任务函数,也属于用户需要修改和实现的功能,因此也可以归类到User中。

二、 keil工程目录

打开Projects->MDA-ARM->***.uvprojx就能通过keil查看工程结构

关于Keil软件的如何使用这里就不作赘述了,总之,Keil工程结构也能自己定义,可以按照实际目录结构定义也可以自行定义

这里和文件夹目录有差异的地方大概就是Startup下的.s文件了。

先说这个文件具体在哪

每个ARM芯片都有自己的.s启动文件,程序开始就是从这里启动的,因此如果缺失了这个文件,代码就无法编译通过。其中包含了中断向量表,时钟初始化函数等等内容。

作者:奈何桥畔花名彼岸

物联沃分享整理
物联沃-IOTWORD物联网 » ARM嵌入式开发第六章:STM32代码结构Keil工程

发表回复