二、STM32文件架构
我们先来看下ARM的文件架构图
从图中我们不难看出,其实最简单的路径就是直接从Application Code(应用层代码)调用CMSIS-Core来实现对CPU-Core、Core-Peripherais、Other--Peripherais来运算和控制。这种方法可不可行呢,肯定是可行的。但是这样会存在一些问题。
第一:CMSIS-CORE中是对CORE和Peripherais的一些定义。这些定义一般是 *** 作硬件的寄存器的结构体。例如你想要 *** 作某一个外设,你就必须知道这个外设的每个寄存器的位置在哪里,以及每个寄存器的作用,并且确保你不会在设置寄存器的值的时候出错。这种方式称为寄存器开发
第二:即使不怕困难完成了第一步,那么接下来你就会面临第二个问题:移植。你通过第一步完成的程序的移植性是很低的。为什么呢?你每切换一款芯片都会可能导致不兼容,因为即使采用的同一个框架,每个厂家都可以根据自己的需求去改变外设的数量以及位置。这就可能导致你在应用层设置的寄存器地址和结构是不通用,甚至同一个厂家同一个架构下也会有不同型号的芯片,那就更加不用提更换厂家甚至是更换芯片架构的情况了。
为了解决寄存器开发的不足,Silicon Vendor(生产制造商)提供了一套叫做HAL(硬件抽象层)的东西。什么是HAL?按照个人理解就是把 *** 作硬件也就是 *** 作寄存器的动作有机的封装起来,让我们不再需要去关注怎么 *** 作寄存器也就是硬件,而是使用了一些有意义的宏或者函数来代替,方便我们的编写程序。这个解决了上面的问题一。对于问题二是怎么解决的呢,刚才也说到HAl使用了一些有意义的宏或者函数来代替,这些宏纳谨袭或者函数在这个厂家对每一个同架构的芯片都是一样。例如在STM32F1的串口初始化的LL库函数为LL_USART_Init(USART1),那么即使你切换到STM32F3也是在应用层调用LL_USART_Init(USART1),只洞兄需要把STM32的HAL文件替换为STM32F3的HAL文件就行,如果他们USART1外设的寄存器位置不一样,那么在HAL文件的定义中就已经修改好了,应用层的代码无需修改。这样就大大的减少了移植的难度。
现在我们的路径变为了Application Code(应用层代码)------>DEVICE HAL -------->CMSIS-Core -------->CPU-Core、Core-Peripherais、Other--Peripherais。这种方式我们称为库函数开发。
三、库函数开发的基础工程文件(不带系统)
根据上面的描述,我们把文件分成四个大的部分(不带系统):CMSIS-CORE,STARTUP,HAL,Application Code
其中CMSIS-CORE也会细分三个部分:Peripherais-CORE,Peripherais-Device,compiler:
Peripherais-CORE:
具体文件:
1.cmsis_compiler.h(compiler)晌携
2.cmsis_armcc.h (compiler)
3.cmsis_version.h (compiler)
4.core_cm3.h(Peripherais-CORE)
5.stm32f1xx.h(Peripherais-Device)
6.stm32f103xe.h(Peripherais-Device)
1.cmsis_compiler.h
该文件是一个编译声明文件,主要作用:
1.声明使用哪个编译器编译。本文采用的Keil的环境所以使用的是armcc的编译方式
2.cmsis_armcc.h
该文件是一个编译器头文件,主要作用:
1.申明编译器的部分特殊寄存器的 *** 作
3.cmsis_version.h
该文件是一个编译器版本文件,主要作用:
1.申明编译器的版本
4.core_cm3.h
该文件的是一个申明M3架构的内核外设的文件,主要作用:
1.申明core_register
2.申明NVIC_register
3.申明SCB_register
4.申明Systick_register
5.申明Debug_register
6.申明MPU_register(可选)
5.stm32f1xx.h
该文件使用制造商提供的头文件,主要作用是:
1.根据Keil的宏定义去添加对于F1系列芯片的外设申明文件
6.stm32f103xe.h
该文件的使用制造商的头文件,主要作用是:
1.申明stm32f103系列芯片的所有外部外设的中断、位置,结构体,以及寄存器 *** 作的相关宏定义
Startup:
1.startup_stm32f103xe.s
2.system_stm32f1xx.c
3.system_stm32f1xx.h
1.startup_stm32f103xe.s
该文件是一个启动文件,主要的作用有:
1.初始化堆栈
2.异常以及中断的定义,以及部分异常的实现
3.调用SystemInit函数初始化时钟(system)
4.调动main函数进入application code
2.system_stm32f1xx.c
该文件主要是系统时钟初始换函数实现。主要作用:
1.初始化时钟
3.system_stm32f1xx.h
该文件主要是系统时钟初始换函数申明。主要作用:
1.申明时钟初始化函数
HAL:本文采用的ST的LL库,下面采用的也是LL库的示例。目前示例的工程的点亮一个LED
1. stm32f1xx_ll_bus.h
该文件主要是申明对外设总线时钟 *** 作宏定义。主要作用:
1.定义总线时钟相关的 *** 作
2.stm32f1xx_ll_gpio.c 和stm32f1xx_ll_gpio.c
这两个文件是LL库对GPIO外设文件,主要作用:
1.对GPIO外设数量、位置、结构、基本 *** 作的申明以及定义
3.其他:LL库线的C文件以及H文件还有很多,我们可以根据我们自己的需要进行添加,不一定需要把整个LL库都添加进去。例如:ADC,USART等等等等。该工程只是点亮LED,所以不需要其他文件。LL库的头文件以及源文件有以下这些(STM32F1系列)
Application Code:应用层代码,主要是我们业务逻辑。该工程只有main.c文件,用于点亮LED
main.c的主要代码如下:
整体文件架构图:
PS:以上就是该项目的本地树结构。该结构只是个人的风格,每个人可以根据自己的风格创建自己的结构
三、如何在KEIL中建立该工程并编译烧录
1、KEIL安装,网上有很多优秀的文章,自行参考,不在赘述
2、建立基本工程(选择芯片STMF103ZE)
3、建立工程文件架构、添加源文件。参考其他文章。个人喜欢和本地目录的架构保持一致,添加好文件后的Keil工程架构如图:
4.添加头文件到编译路径
魔术棒----》c/c++------》Include Paths
5.添加全局的宏定义
STM32F103xE和USE_FULL_LL_DRIVER
STM32F103xE:用于告诉stm32f1xx文件,最后添加f1系列具体哪个型号的头文件进来
USE_FULL_LL_DRIVER:用来启动LL库的编译。
6.编写application code(main.c)文件
7.编译
8.烧录(需要连接电脑,模拟器,芯片)具体你使用的是哪个模拟器相关设置请参考其他文章
9.LED指示灯正常亮起。
四、总结
至此,一个最最最基本的用LL库去点亮LED的工程已经建好了。本文只是在描述stm32工程文件的架构思路,在实际应用中你们可以使用的不同框架以及型号的芯片,不要照搬,要懂得根据自己的实际情况是使用合适的文件。本文仅作为参考
打开CSDN APP,看更多技术内容
STM32 三种开发方式:寄存器、标准库函数、HAL库_太阳火神的美丽人生的博...
STM32 单片机是由芯片内嵌的处理器内核和外设电路构成,相当于PC电脑的CPU、内存、主板、硬盘,所有这些都集成在一块不到一厘米见方的芯片中,通过引脚与外围电路集成,连接不同设备,以不同协议进行通过,如 USART、SPI、IIC、CAN,所有这些...
继续访问
STM32笔记(二)初识寄存器与固件库开发的简介_CYRIL0124的博客-CSDN博 ...
后面我们还可以再定义一个函数用于 *** 作所需要 *** 作的寄存器,这时候只需要填入参数就可以实现运用函数来 *** 作配置各种寄存器或者各种外设的功能了,这也就是固件库实现的基本思想。 这是固件库 *** 作GPIO外设的一个函数,可以简单参考一下 ...
继续访问
stm32入门 第二周 IO口实验,了解库函数开发和寄存器开发的区别
本文内容基于https://www.bilibili.com/video/BV1Lx411Z7Qa P11 GPIO工作模式: 输入模式1:浮空输入 输入模式2:输入上拉模式 输入模式3:输入下拉模式 由于浮空输入模式的电压不确定,容易误读,检测高电平时一般用输入下拉模式,检测低电平时一般用输入上拉模式。 输入模式4:模拟模式 输出模式1:开漏输出 输出控制电路输出1时,N-MOS断开,实际输出由外部上拉下拉决定,输出0时,N-MOS闭合,实际输出0,实际输出可以由输入数据..
继续访问
Stm32寄存器与库函数概览(摘自固件库使用手册).doc
本手册内容为STM32各标准库 *** 作相应寄存器的手册,可为STM32库函数开发提供参考
STM32寄存器版和库函数版.zip
STM32寄存器版和库函数版,配合stm32日更2nd使用更佳,本文讲述了STM32寄存器版和库函数版的创建
Stm32寄存器与库函数概览(摘自固件库使用手册).zip
在网上看到一份关于STM32单片机开发资料,其中整理了STM32单片机常用寄存器的名称和功能,还有各个功能相关库函数的函数名和函数功能。可做为开发时的参考。
STM32学习笔记(二):新建STM32F103工程
1、前言 前面已经介绍了怎么安装keil5.29和破解keil5.29,下面进行STM32F103的新建工程。 2、工程的准备 在进行创建工程前,需要做好如下几个前提。 1)STM32F103的芯片包 2)准备好STM32的固件库 3)创建好工程文件和目录 以下为上面三个准备的步骤: 2.1:芯片包的下载 下面这个是芯片包的官方下载地址。 链接:https://www.keil.com/dd2/Pack/ 下载完芯片包之后直接双击打开进行安装就行了,这个安装的路劲是默认的,就是你的keil安装的路劲下的某个文件夹,这个不用理会,直接傻瓜式点击下一步,一直点击就行了,然后等待安装 大家可以下载相
STM32学习笔记1:KEIL5配置stm32开发环境,以及新建工程的步骤。
一、下载安装keil5.(这里不多做介绍,网上有很多资料了) 二、下载安装stm32的pack包。 –>pack包下载链接点这里 正常界面如下,使用浏览器的ctrl+F功能快速搜索到对应的系列进行下载。 如果网页打不开,或者找不到下载包的地方,解决方法请点击这里。 下载下来的包是一个zip文件。这个包应该有两种使用方法。我目前尝试的是第一种,后续再补第二种。 第一种: 把后缀名改zip改为pack,然后双击打开安装。这样是直接集成到keil软件里面了。这种方法快可以快速上手,配置简单。但是一旦更
继续访问
STM32官方标准固件库开发与寄存器开发的区别
一句话概括关系:固件库就是函数的集合,固件库函数的作用就是:向下负责与寄存器直接打交道,向上提供用户函数调用的接口(API)。对于STM32这种级别的MCU,数百个寄存器记起来何谈容易,于是推出了官方固件库,固件库将这些寄存器底层 *** 作都封装起来,提供一套API供开发者使用。大多数情况下,你不需要知道 *** 作的是哪个寄存器,你只需要知道调用哪些函数即可。 对比一下:入下面只需要知道GPIO_SetBi...
继续访问
最新发布 STM32使用寄存器开发底层驱动学习(USART+DMA)
代码简洁明了,当然需要我们注释好,不然比标准库更难看懂。方便快捷,只需要一本《手册》就可以查看所有的寄存器,不需要像标准库那样记、找每个函数、每个参数的作用。
继续访问
STM32之GPIO配置(寄存器/库函数)
GPIO初始化结构体 GPIO初始化 先声明GPIO初始化的结构体;然后打开GPIO所挂载的总线的时钟;再对结构体成员进行配置,包括GPIO的引脚,模式,速度;最后对GPIO的结构体进行初始化并选定指定的GPIO组。 GPIO_Mode相关内容 模拟输入、浮空输入、下拉输入、上拉输入、通用开漏输出、通用推挽输出、复用开漏输出、复用推挽输出。 GPIO相关函数 ①GPIO初始化函数 void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_In
继续访问
库函数开发与寄存器开发
在以前 8 位机时代的程序开发中,一般直接配置芯片的寄存器,控制芯片的工作方式,如中断,定时器等。配置的时候,常常要查阅寄存器表,看用到哪些配置位,为了配置某功能,该置 1还是置 0。这些都是很琐碎的、机械的工作,因为 8位机的软件相对来说较简单,而且资源很有限,所以可以直接配置寄存器的方式来开发。 对于 STM32,因为外设资源丰富,带来的必然是寄存器的数量和复杂度的增加,这时直接配置寄存器方...
继续访问
cmsis_iar.h
发现了"cmsis_iar.h",需要的人可以下载来看看!
C语言中头文件和源文件的注意事项
C语言中头文件和源文件的注意事项 文章目录C语言中头文件和源文件的注意事项0.前言1.实现步骤1.1 拆分前1.2 拆分后2.总结2.1头文件内容2.2 源文件(.c)内容2.3 函数声明和定义 0.前言 因为C语言编程或者C++语言编程,经常要添加头文件,不像Python中直接引入第三库就可以(import),但是嵌入式编程中C还是主流,Python目前这方面的应用还是比较少的,故如果完成一个大...
继续访问
C++中头文件与源文件的区别
本文转自:http://www.sytarena.com/article-451-1.html 一、源文件如何根据#include来关联头文件 1,系统自带的头文件用尖括号括起来,这样编译器会在系统文件目录下查找。 2,用户自定义的文件用双引号括起来,编译器首先会在用户目录下查找,然后在到C++安装目录(比如VC中可以指定和修改库文件查找路径,Unix和Linux中可以通过环境变量来
继续访问
STM32库函数与寄存器的区别
#STM32库函数与寄存器# 1.固件库是什么?与寄存器有什么关系? 固件库就是函数的集合,向下与寄存器直接打交道,向上提供用户调用函数的接口(API) 2.最佳使用情况 寄存器:单独对IO口状态控制,对寄存器进行位 *** 作(如51) 调试debug时对寄存器进行位 *** 作(需要理解与什么寄存器有关并理解过程,调试时翻阅寄存器手册) 库函数:寄存器数量过多(如STM32)调用库函数 ...
继续访问
stm32初学者是应该学寄存器好还是学库函数好?
作者:jiwangbujiu链接:https://www.zhihu.com/question/30409588/answer/244613385来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。我个人认为,在回答这个问题之前,你得先问清楚自己,我学习stm32、或者再往更深的地方走,我学习单片机,究竟是为了什么?你现在是处于什么状态?你是学生还是已经参加工作了?你的专...
继续访问
AT24CXX系列芯片在STM32F103单片机下的读写程序
本程序取自正点原子开发板,应用于STM32F103单片机,适用AT24C01,AT24C02,AT24C04,AT24C08,AT24C16,AT24C32,AT24C64,AT24C128,AT24C256,AT24C512系列I2C存储芯片。 一、sys.h #ifndef __SYS_H #define __SYS_H #include "stm32f10x.h" //////////////////////////////////////////////////////////////.
继续访问
STM32开发方式及基本介绍
STM32的开发有三种方式 1.寄存器版本 2.库函数版本 3.HAL库版本 一、库函数开发与寄存器开发的关系 很多人都是从学51单片机转而想进一步学习STM32,他们习惯了51单片机的寄存器开发方式,ST官方库摆在面前会不知道从何下手。其实简单来说,固件库就是函数的集合,固件库函数的作用是向下负责与寄存器直接打交道,向上提供用户函数调用的接口。 举一个例子来解释 STM32 固件库到底是什么,和寄存器开发有什么关系。 在51的开发中我们常常是直接 *** 作寄存器,比如要控制某些 IO 口的状态,我们直接
继续访问
热门推荐 STM32库函数和寄存器的区别
库函数版和寄存器版的系统时钟设置的区别: **1.**库函数的目的是让用户应用的,而寄存器更加原始 库函数的系统时钟是默认设置的,且放在启动文件里。而寄存器版的系统时钟是Stm32_Clock_Init(336,8,2,7). **2.**库函数的快捷的,但不是每个芯片都有的;寄存器是复杂的,但是每个芯片厂商都有提供系统的寄存器设置信息。 分别打开库函数和寄存器版的I/O口设置: 库函数: RC...
继续访问
CMSIS玩家的“阴间成就”指南
【说在前面的话】认真说起来,从事嵌入式系统开发职业的“玩家”们基本都听说过CMSIS吧?虽然不清楚它在系统中具体“有什么卵用”,但或多或少都接受过“CMSIS的毒打”——不知不觉间,达成了...
继续访问
C 语言 *** 作寄存器开发
在使用C语言 *** 作寄存器前,仍需要先分析《开发板原理图》和《参考手册》,从而得知需要 *** 作哪些外设寄存器,假设读者已经了解需要 *** 作哪些外设寄存器。 本章涉及的代码位于100ASK_STM32F103开发板资料的“5_程序源码\0_单片机开发模式的发展\2_C语言 *** 作寄存器开发\”。 使用C语言之前,需要先设置栈,如代码段 6.3.1 所示,在上电复位后立即设置栈,随后跳入main函数执行。 代码段 6.3.1 设置栈(startup_stm32f10x_hd.s) Reset handler Reset_H
继续访问
stm32寄存器开发与库开发
stm32
这个不一定,要看情况。有些系统的头文件,乎判就没有对应的.c或.s文渣顷饥件。一般自己写的.c文件都要带一个.h头文件。当然这个也是为了代码如返结构和可读性。所以这个没有绝对性,自己玩的话,随自己喜好。工作上就要根据你的代码规范来写了。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)