历史上的今天
返回首页

历史上的今天

今天是:2025年01月09日(星期四)

正在发生

2020年01月09日 | stm32中core_m3.h和core_m3.c详解

2020-01-09 来源:eefocus

CMSIS是Cortex微控制器软件接口标准(Cortex MicroController Software Interface Standard)的缩写,这个是ARM定制的一个用于Cortex-M系列的一个标准,主要是为了提供通用api接口来访问内核和一些片上外设,提高代码的可移植性。


CMSIS有三个层:核内外设访问层Core Peripheral Access Layer(CPAL),中间件访问层Middleware Access Layer(MWAL),设备访问层(Device Peripheral Access Layer)。

CPAL用于访问内核的寄存器和组件,如NVIC,调试系统等。该层是由ARM实现的。


MWAL用于对中间件的访问,现在该层还未实现。(也不知道所谓的中间件是什么东西)。

DPAL用于定义一些硬件寄存器的地址和一些外设访问函数,由芯片制造商实现。

 

CPAL层的实现就是Core_cm3.c文件,DPAL层的实现就是system_stm32f10x.c文件(似乎还应该加上外设的函数库)。

 

接下来就来了解一下Core_cm3.c里面有什么东东:

首先是汇编关键字__ASM和__INLINE的宏定义,支持不同的编译器。由于使用的是Keil,所以就只看第一种,__CC_ARM。


这里面的函数调用都只符合ARM过程调用标准的,如R0到R3用作参数和返回值传递,这也是这里面唯一用到的。


此外,在Keil中使用了__asm关键字后,编译器不会为函数增加返回指令,所以需要自己编写返回命令,也就是每个函数后面的  bx lr。

1.__ASM uint32_t __get_PSP(void):获取进程堆栈指针PSP。

2.__ASM void __set_PSP(uint32_t topOfProcStack):设置PSP。

3.__ASM uint32_t __get_MSP(void):获取主堆栈指针MSP。

4.__ASM void __set_MSP(uint32_t mainStackPointer):设置MSP。

5.__ASM uint32_t __REV16(uint16_t value):反转半字中字节顺序,如0xABCD反转后得到0xCDAB。

6.__ASM int32_t __REVSH(int16_t value):反转字节顺序,并做符号拓展。就是在__REV16函数得到的结果上再进行一次符号拓展。这两个函数主要是方便进行大小端的切换。

7.__ASM void __CLREX(void):清除由LDREX指令造成的互斥锁。LDREX和STREX是Cortex用来实现互斥访问,保护临界资源的指令,LDREX执行后,只有离它最近的一条存储指令(STR,STREX)才能执行,其他的存储指令都会被驳回,而CLREX就是用于清除互斥访问状态的标记。

8.__ASM uint32_t  __get_BASEPRI(void):获取BASEPRI寄存器的值,优先级号高于该寄存器的中断都会被屏蔽(优先级号越大,优先级越低),为零时不屏蔽任何中断。

9.__ASM void __set_BASEPRI(uint32_t basePri):设置BASEPRI的值。

10.__ASM uint32_t __get_PRIMASK(void):PRIMASK是一个只有一位的寄存器,置位时屏蔽绝大部分的异常中断,只剩下NMI和HardFault可以响应。

11.__ASM void __set_PRIMASK(uint32_t priMask):设置PRIMASK的值。

12.__ASM uint32_t  __get_FAULTMASK(void):FAULTMASK也是一个只有一位的寄存器,为1时只有NMI才能响应,其他异常与中断全部被屏蔽。

13.__ASM void __set_FAULTMASK(uint32_t faultMask):设置FAULTMASK的值。

14.__ASM uint32_t __get_CONTROL(void):获取CONTROL的值。寄存器CONTROL只有两位。CONTROL[0]选择特权级别,0为特权级,1为敌用户级。CONTROL[1]用于选择堆栈指针,0为MSP,1为PSP。

15.__ASM void __set_CONTROL(uint32_t control):设置CONTROL寄存器的值。

BASEPRI,PRIMASK,FAULTMASK,CONTROL都只能在特权模式下被修改。

还有两个文件,一个是Core_cmFunc.h 和 Core_cmInstr.h  这两个文件时干嘛的,第一个文件是不同编译器下的一些系统级的汇编函数,第二个文件是不同编译器下的指令,我猜Keil公司这样做是为了兼容不同的编译器做设计的。把这两个头文件在Core_cm3.h头文件里注释掉也是可以的。说明这两个头文件对于keil开发环境是不需要的。

最后剩下Core_cm3.h文件了,这个文件时内核文件,就是定义了一些Cortex-M3的寄存器和一些函数,包括NVIC,MPU,SCB,SysTick,Debug寄存器。

 

最近在看LPC17XX系列的东东,发现这个文章说得有一些不对(上面是复制别人的),我用的是MDK4.14版本的开发环境。


说说我对这几个文件的理解:core_cm3.c和core_cm3.h,Core_cmFunc.h 和 Core_cmInstr.h


第一个:core_cm3.c是定义了一些兼容各个开发环境的一些内嵌汇编函数,都是关于M3内核寄存器操作的函数。其实这个函数在工程中根本没有使用到,用的是Core_cmFunc.h的汇编函数,因为Core_cmFunc.h里的函数和core_cm3.c差不多是一样的。不信自己建一个工程,调试一下就知道不是进去core_cm3.c,而是去Core_cmFunc.h执行的。所以core_cm3.h包含了Core_cmFunc.h 和 Core_cmInstr.h头文件。


第二个:core_cm3.h定义了兼容各种编译器的关于debug和NVIC的一些函数,这些函数在中断设置中是很好用的。其中还有系统节拍器函数。我觉得core_cm3.h和core_cm3.c是一点关系都没有的,虽然他们同名。担不是头文件和源文件的关系。当然这个文件一开头还有内核寄存器的定义。下面才能用操作内核寄存器。


第三个:Core_cmInstr.h定义了很多内核指令的函数,这个应该不常用,先不管。


第四个:Core_cmFunc.h和core_cm3.c是非常相似的,大多数函数连函数名都一样的,不知道为什么要这样做,实际用函数是在Core_cmFunc.h里的函数,甚至把core_cm3.c从工程里删除,都没有问题的。但是屏蔽core_cm3.h里的Core_cmFunc.h 和 Core_cmInstr.h,就不行了。说明这个core_cm3.c是没什么用的,起码在Keil开发环境下是没用的。


暂时研究到这里,后面开始实践咯,就是使用几个文件中的各种函数试试。

上一篇:stm32 ADC理解

下一篇:STM32 nvic 解释

推荐阅读

史海拾趣

EiKO Global LLC公司的发展小趣事

随着LED技术的不断成熟,EiKO敏锐地意识到这将为照明行业带来革命性的变革。于是,公司投入大量研发资源,开始研发LED照明产品。经过数年的努力,EiKO成功推出了一系列高效、节能、环保的LED照明产品,如LED灯具、LED改装和替换灯等。

这些LED照明产品不仅具有出色的性能和品质,还满足了不同用户的需求。例如,EiKO的LED灯具适用于室内和室外各种场所,包括高棚、超薄面板、暗灯槽等;而LED改装和替换灯则为用户提供了多种瓦数、形状和色温的选择,满足不同场景下的照明需求。

绿宝石(BERYL)公司的发展小趣事

绿宝石公司注重品牌建设和形象提升。公司加大了广告宣传的投入力度,通过电视、网络、户外广告等多种渠道进行品牌推广。此外,绿宝石公司还积极参与社会公益活动,履行企业社会责任。这些举措不仅提升了公司的知名度和美誉度,也增强了消费者对绿宝石品牌的认同感和忠诚度。

ANYSOLAR LTD.公司的发展小趣事

近年来,随着全球能源结构的调整和光伏产业的快速发展,市场竞争日益激烈。ANYSOLAR也面临着来自同行的竞争压力和成本上升的挑战。为了应对这些变革和危机,ANYSOLAR积极调整战略,优化生产流程,降低成本。

同时,公司还加大了对新兴市场的开拓力度,通过参加国际展会、建立海外销售渠道等方式,拓展新的业务增长点。这些措施有效缓解了公司的经营压力,为公司的持续发展注入了新的活力。

Amphenol Aerospace公司的发展小趣事

ANYSOLAR深知技术创新是企业发展的核心动力。因此,公司不断加大研发投入,引进高端人才,建立完善的研发体系。通过持续的技术创新,ANYSOLAR不断推出性能更优、成本更低的光伏产品,引领着行业的发展潮流。

同时,ANYSOLAR还积极参与行业标准的制定和修订工作,推动整个行业的规范化发展。这些举措不仅提升了ANYSOLAR在行业内的地位,也为公司的长期发展奠定了坚实的基础。

HiRel Connectors Inc公司的发展小趣事
确保所选电源的电压和电流满足摄像头的需求。
Display Engineering Services公司的发展小趣事
确保电源插头已牢固插入插座,插座无损坏且通电正常。

问答坊 | AI 解惑

dSPACE快速控制原型在金属带式无级变速器控制中的研究

1.引言     金属带式无级变速器已经成为现代汽车变速器发展的趋势,其中电液系统的控制是该研究所涉及的一个核心问题。能否快速有效的对CVT进行研究,在很大程度上取决于电液控制系统尤其是ECU的软硬件设计能力。 &n ...…

查看全部问答>

元器件接地问题?

就是一般单片机有模拟地和数字地,外围的元器件接地怎么判断是接模拟地,还是数字地?是根据元器件的性质,还是看通过的信号?…

查看全部问答>

Verilog HDL 综合实用教程

给verilog学习者的,希望对大家有帮助!…

查看全部问答>

有关VHDL语言的资料

一些简单的基础知识,供大家参考…

查看全部问答>

D题资料下载

本帖最后由 paulhyde 于 2014-9-15 09:35 编辑 希望大家喜欢!!!!  …

查看全部问答>

硬件工程师必读攻略(上)

一 、数模混合设计的难点 二、提高数模混合电路性能的关键 三、仿真工具在数模混合设计中的应用 四、小结 五、混合信号 PCB 设计基础问答 前言: 数模混合电路的设计,一直是困扰硬件电路设计师提高性能的瓶颈。众所周 知,现实的世界 ...…

查看全部问答>

30岁后职业人的发展突围之策

都说“三十而立,四十不惑”,在跨过了20多岁因全力拼搏而快速上升的飞跃期,到了三十多、四十岁的时候,本应处在一种稳步前进的状态,工作能力已经得到检验,拥有充沛的精力和赚钱的实力,可以为自己应得的报酬同老板讨价还价,然而你却丝毫舒坦不 ...…

查看全部问答>

非接触式IC卡的时钟信号从哪来?

非接触式IC卡,如公交卡,电源似乎是线圈感应读卡器的磁场产生电流,不知这样说对否? 还有就是这样的IC卡的时钟信号从哪来?…

查看全部问答>

请教:EVC编译环境中,怎样在程序中输入韩文?

我在控件中输入的韩文怎么都是“?”,程序中的字符串也无法显示正确的韩文,哪位高手帮帮忙呀。…

查看全部问答>

高分求助 音频转换问题 WAV和AMR的转换

http://blog.eeworld.net/jinlking/archive/2009/06/10/4256311.aspx 我已经在网上找了些资料,上面这个最清楚,但是我不确定是否正确,而且好多函数是没有提供的 也在网上下载了写源码,是VC的,我现在要在EVC下实现,但是从网上下载的源码 跟博 ...…

查看全部问答>