历史上的今天
返回首页

历史上的今天

今天是:2025年02月12日(星期三)

正在发生

2019年02月12日 | 【stm32f407】库函数

2019-02-12 来源:eefocus

本文通过简单介绍 STM32库的各个文件及其关系,让读者建立 STM32库的概念,看完后对库有个总体印象即可


1.


1.1什么是 STM32 库?


在 51单片机的程序开发中,我们直接配置 51单片机的寄存器,控制芯片的工作方式,如中断,定时器等。配置的时候,我们常常要查阅寄存器表,看用到哪些配置位,为了配置某功能,该置 1还是置 0。这些都是很琐碎的、机械的工作,因为 51单片机的软件相对来说较简单,而且资源很有限,所以可以直接配置寄存器的方式来开发。STM32库是由 ST公司针对 STM32提供的函数接口,即 API(Application Program Interface),开发者可调用这些函数接口来配置STM32的寄存器,使开发人员得以脱离最底层的寄存器操作,有开发快速,易于阅读,维护成本低等优点。当我们调用库的 API的时候可以不用挖空心思去了解库底层的寄存器操作,就像当年我们学习 C语言的时候,用 prinft()函数时只是学习它的使用格式,并没有去研究它的源码实现,如非必要,可以说是老死不相往来。实际上,库是架设在寄存器与用户驱动层之间的代码,向下处理与寄存器直接相关的配置,向上为用户提供配置寄存器的接口。库开发方式与直接配置寄存器方式的区别。



1.2为什么采用库来开发?


对于 STM32,因为外设资源丰富,带来的必然是寄存器的数量和复杂度的增加,这时直接配置寄存器方式的缺陷就突显出来了:


1) 开发速度慢


2) 程序可读性差


这两个缺陷直接影响了开发效率,程序维护成本,交流成本。库开发方式则正好弥补了这两个缺陷。而坚持采用直接配置寄存器的方式开发的程序员,会列举以下原因:


1) 更直观


2) 程序运行占用资源少


初学 STM32的读者,普遍因为第一个原因而选择以直接配置寄存器的方法来学习。认为这种方法直观,能够了解到是配置了哪些寄存器,怎样配置寄存器。事实上,库函数的底层实现恰恰是直接配置寄存器方式的最佳例子,想深入了解芯片是如何工作的话,只要追踪到库的最底层实现就能理解,相信你会为它严谨、优美的实现方式而陶醉。要想修炼 C语言,就从 ST的库开始吧。


2


2.1. CMSIS标准


我们知道由 ST公司生产的STM32f407采用的是 Cortex-M4内核,内核是整个微控制器的 CPU。该内核是 ARM 公司设计的一个处理器体系架构。ARM公司并不生产芯片,而是出售其芯片技术授权。ST公司或其它芯片生产厂商如 TI,负责设计的是在内核之外的部件,被称为核外外设或片上外设、设备外设。如芯片内部的模数转换外设 ADC、串口UART、定时器 TIM 等。内核与外设,如同 PC上的 CPU与主板、内存、显卡、硬盘的关系。



因为基于 Cortex的某系列芯片采用的内核都是相同的,区别主要为核外的片上外设的差异,这些差异却导致软件在同内核,不同外设的芯片上移植困难。为了解决不同的芯片厂商生产的 Cortex微控制器软件 的兼容性问题,ARM与芯片厂商建立了 CMSIS标准(Cortex MicroController Software InterfaceStandard)。所谓 CMSIS标准,实际是新建了一个软件抽象层


CMSIS标准中最主要的为CMSIS核心层,它包括了:


 内核函数层:其中包含用于访问内核寄存器的名称、地址定义,主要由ARM公司提供。


 设备外设访问层:提供了片上的核外外设的地址和中断定义,主要由芯片生产商提供。


可见 CMSIS层位于硬件层与操作系统或用户层之间,提供了与芯片生产商无关的硬件抽象层,可以为接口外设、实时操作系统提供简单的处理器软件接口,屏蔽了硬件差异,这对软件的移植是有极大的好处的。STM32的库,就是按照 CMSIS标准建立的


2.2.库目录、文件简介


各文件夹内容说明见图



Libraries文件夹下是驱动库的源代码及启动文件。


Project文件夹下是用驱动库写的例子跟一个工程模板。


还有一个已经编译好的HTML文件,是库帮助文档,主要讲的是如何使用驱动库来编写自己的应用程序。


在使用库开发时,我们需要把 libraries目录下的库函数文件添加到工程中,并查阅库帮助文档来了解 ST提供的库函数,这个文档说明了每一个库函数的使用方法。


进入 Libraries文件夹看到,关于内核与外设的库文件分别存放在 CMSIS和STM32F10x_StdPeriph_Driver文件夹中。


core_cm3.c文件:内核功能的定义,比如NVIC相关寄存器的结构system_stm32f4xx.c,是由 ST 公司提供的,遵守 CMSIS标准。该文件的功能是设置系统时钟和总线时钟, M4比 51单片机复杂得多,并不是说我们外部给一个 8M的晶振,M4整个系统就以 8M为时钟协调整个处理器的工作。我们还要通过 M4核的核内寄存器来对8M的时钟进行倍频,分频,或者使用芯片内部的时钟。所有的外设都与时钟的频率有关,所以这个文件的时钟配置是很关键的。


system_stm32f4xx.c在实现系统时钟的时候要用到 PLL(锁相环),这就需要操作寄存器,寄存器都是以存储器映射的方式来访问的,所以该文件中包含了 stm32f4xx.h这个头文件。stm32f4xx.h文件stm32f4xx.h这个文件非常重要,是一个非常底层的文件。所有处理器厂商都会将对内存的操作封装成一个宏,即我们通常说的寄存器,并且把这些实现封装成一个系统文件,包含在相应的开发环境中。这样,我们在开发自己的应用程序的时候只要将这个文件包含进来就可以了startup_stm32f4xx.s。启动文件是任何处理器在上点复位之后最先运行的一段汇编程序。在我们编写的 c语言代码运行之前,需要由汇编为 c语言的运行建立一个合适的环境,接下来才能运行我们的程序。所以我们也要把启动文件添加进我们的的工程中去。


总的来说,启动文件的作用是:


1. 初始化堆栈指针 SP;


2. 初始化程序计数器指针 PC;


3. 设置堆、栈的大小;


4. 设置异常向量表的入口地址;


5. 配置外部 SRAM作为数据存储器(这个由用户配置,一般的开发板可没有外部 SRAM);


6. 设置 C库的分支入口__main(最终用来调用 main 函数);


7. 启动文件还调用了在 system_stm32f4xx.c文件中的


SystemIni()   函数配置系统时钟


推荐阅读

史海拾趣

Aces Electronics Co Ltd公司的发展小趣事

随着技术的不断进步和产品的日益成熟,Aces开始将目光投向国际市场。公司积极参与国际电子展会和技术交流,与多家国际知名企业建立了合作关系。通过引进国外先进的技术和管理经验,Aces不断提升自身竞争力,逐渐在国际市场上占据了一席之地。同时,公司还积极拓展海外市场,将产品销往全球多个国家和地区。

Amptek Inc公司的发展小趣事

随着技术的不断进步和产品的日益成熟,Aces开始将目光投向国际市场。公司积极参与国际电子展会和技术交流,与多家国际知名企业建立了合作关系。通过引进国外先进的技术和管理经验,Aces不断提升自身竞争力,逐渐在国际市场上占据了一席之地。同时,公司还积极拓展海外市场,将产品销往全球多个国家和地区。

Alpha-Micro Electronics公司的发展小趣事

Aces Electronics Co., Ltd.自成立之初,就致力于电子技术的研发与创新。在公司发展早期,Aces面临技术壁垒和市场竞争的双重压力。然而,公司通过不断投入研发资源,终于在某一关键领域取得了重大技术突破,推出了一款具有颠覆性的电子产品。这款产品凭借其卓越的性能和创新的设计,迅速在市场上获得了广泛认可,为Aces打开了新的发展空间。

安国国际(ALCOR)公司的发展小趣事

进入21世纪,安国继续深耕集线器控制芯片领域。2000年,公司发布了首款USB键盘集线器控制芯片——AU9432,这款芯片凭借其卓越的性能和稳定性,成功被Apple的iMAC键盘所采用。这一里程碑事件不仅证明了安国在集线器控制芯片领域的领先地位,也为其后续的产品研发和市场拓展奠定了坚实基础。

Amplitronix LLC公司的发展小趣事

Amplitronix LLC的创立,源于两位年轻工程师对电子技术的热爱与执着。他们发现市场上存在一种需求,即高性能、高精度的电子测量仪器。于是,他们决定携手创业,将这个想法付诸实践。初创时期,资金短缺、技术难题、市场竞争激烈,每一道关卡都考验着他们的决心和毅力。但他们凭借着对技术的热情和对市场的敏锐洞察,不断研发创新,最终成功推出了首款产品,赢得了市场的初步认可。

Charcroft Electronics Ltd公司的发展小趣事

随着社会对环境保护和可持续发展的关注度不断提高,Charcroft Electronics Ltd公司积极履行社会责任,推动绿色生产和可持续发展。公司采用环保材料和节能技术,减少生产过程中的环境污染和资源消耗。同时,公司还积极参与社会公益事业,为社会做出贡献,展现了企业的良好形象和社会责任感。

这些故事虽然基于假设,但反映了电子行业中企业成长的一般路径和关键要素。如果您需要更具体、更详细的故事,建议您查阅Charcroft Electronics Ltd公司的官方资料、新闻报道或行业分析报告,以获取更准确的信息。

问答坊 | AI 解惑

哪位好心人帮帮我发一个keil软件给我

我的keil 老是出错, 比如: void main(void) { unsigned int w; w=10; } 程序执行到‘}’结束符就出错。 ***   error   65:   access   violation   at   C:0x0A00  &nb ...…

查看全部问答>

pxa310开发板

Marvell? PXA310?开发板简要介绍 产品图片 Product Photo PXA310 简介 PXA310 处理器专门为手持设备、GPS 定位系统、无线手持和其他消费类电子设备而设计。基于第三代Intel XScale 技术的这一Marvell PXA3XX 应用处理器系列产品(内部称为Mon ...…

查看全部问答>

渥瑞达“3G移动开发”免费试听课于北京交通大学举行,欢迎大家光临!

渥瑞达“3G移动开发”免费试听课于北京交通大学举行,欢迎大家光临! 渥瑞达“3G移动开发”免费试听课于北京交通大学举行,欢迎大家光临! 详情请参见 www.neworigin.net 同时欢迎大家与我们的609期学员交流!这期学员已与2月11日毕业 ...…

查看全部问答>

能提供CCS for c6000 v2.2补丁程序下载?

CCS for c6000 v2.2补丁程序下载 地址  能提供么…

查看全部问答>

我用一个数组输出一个三角波,为何输出的是这样的啊

我用一个数组输出一个三角波,为何输出的是这样的啊  不是三角波,而是一下一下的向上跳动?…

查看全部问答>

STM32虚拟串口驱动如何一次发送261个数据给上位机?

我设备的需求是:将网卡接收到的一帧数据(一帧包括261个数据,每个数据都是一个十六进制如0xc2),通过USB发送到上位机。      我将STM32的USB虚拟串口驱动(V3.1版)按照我的要求进行修改并实现了该功能,起初我USB虚拟串口 ...…

查看全部问答>

msp430 LaunchPad 的Arduino开发平台

http://energia.nu/ 使用很简单,从上面网站下载相应版本的软件,解压出来后,记得修改一下目录名,把后面一长串的数字字母去掉。 运行安装目录“energia.exe”, 打开软件后,把LAUCHPAD连接到USB接口,装好相应驱动,从\"Tools->Board\"菜单 ...…

查看全部问答>

基于RL78G14的双轮自平衡小车进度贴--体验心得

感觉特别不习惯瑞萨的编译器,比起keil iar 感觉差了不止一大截,可能习惯问题吧。 然后就是他那个芯片手册,引脚介绍的非常详细,功能、寄存器介绍方面我感觉还是有些不足的,看了半天不知道配置,可能是没有demo的原因,后来从这里http://am.ren ...…

查看全部问答>

ucos-ii的移植代码分析

移植的代码中,在时钟SysTick_Handler中OSIntExit()进行任务切换; 其中OSIntExit()的代码为: void  OSIntExit (void) { #if OS_CRITICAL_METHOD == 3                 ...…

查看全部问答>

四旋翼飞行器 MSP430编写的程序,电机驱动的电路图

请各位大神帮帮忙,急求!(不含飞控板的)…

查看全部问答>