ARM学习笔记

简介: ARM学习笔记

在ARM程序的开发中,需要大量读写硬件寄存器,尽量缩短程序的执行时间,因此部分初始化代码一般使用汇编语言来编写,比如ARM的启动代码,ARM的操作系统的移植代码等,除此之外,绝大多数代码可以使用C语言来完成。


C语言使用的是标准的C语言,ARM的开发环境实际上就是嵌入了一个C语言的集成开发环境,只不过这个开发环境和ARM的硬件紧密相关。


ARM使用C语言编程基本规则

在应用系统的程序设计中,若所有的编程任务均由汇编语言来完成,其工作量巨大,并且不易移植。由于ARM的程序执行速度较高,存储器的存储速度和存储量也很高,因此,C语言的特点充分发挥,使得应用程序的开发时间大为缩短,代码的移植十分方便,程序的重复使用率提高,程序架构清晰易懂,管理较为容易等等。因此,C语言的在ARM编程中具有重要地位。


在ARM程序的开发中,需要大量读写硬件寄存器,尽量缩短程序的执行时间,因此部分初始化代码一般使用汇编语言来编写,比如ARM的启动代码,ARM的操作系统的移植代码等,除此之外,绝大多数代码可以使用C语言来完成。


C语言使用的是标准的C语言,ARM的开发环境实际上就是嵌入了一个C语言的集成开发环境,只不过这个开发环境和ARM的硬件紧密相关。


在使用C语言时,有时要用到和汇编语言的混合编程。当汇编代码较为简洁,则可使用直接内嵌汇编的方法,否则,将汇编程序以文件的形式加入项目当中,通过ATPCS(ARM/Thumb Procedure Call Standard)的规定与C程序相互调用与访问。


ATPCS,就是ARM、Thumb的过程调用标准,它规定了一些子程序间调用的基本规则。如寄存器的使用规则,堆栈的使用规则,参数的传递规则等。


在C程序和ARM的汇编程序之间相互调用必须遵守ATPCS。而使用ADS的C语言编译器编译的C语言子程序满足用户指定的ATPCS的规则。但是,对于汇编语言来说,完全要依赖用户保证各个子程序遵循ATPCS的规则。具体来说,汇编语言的子程序应满足下面3个条件:

.  在子程序编写时,必须遵守相应的ATPCS规则;

.  堆栈的使用要遵守相应的ATPCS规则;

.  在汇编编译器中使用-atpcs选项。


基本的ATPCS规定,详情请见相关PDF文档,简单说明就是:

  1. 汇编程序调用C程序

.  汇编程序的设置要遵循ATPCS规则,保证程序调用时参数正确传递。

.  在汇编程序中使用IMPORT伪指令声明将要调用的C程序函数。

.  在调用C程序时,要正确设置入口参数,然后使用BL调用。


  1. C程序调用汇编程序

.  汇编程序的设置要遵循ATPCS规则,保证程序调用时参数正确传递。

.  在汇编程序中使用EXPORT伪指令声明本子程序,使其他程序可以调用此子程序。

.  在C语言中使用extern关键字声明外部函数(声明要调用的汇编子程序)。

在C语言的环境内开发应用程序,一般需要一个汇编的启动程序,从汇编的启动程序,跳到C语言下的主程序,然后,执行C程序,在C环境下读写硬件的寄存器,一般是通过宏调用,在每个项目文件的Startup2410/INC目录下都有一个2410addr.h的头文件,那里面定义了所有关于2410的硬件寄存器的宏,对宏读写,就能操作2410的硬件,具体的编程规则同标准C语言。


ARM Cortex™ 微控制器软件接口标准(CMSIS:CortexMicrocontroller Software Interface Standard) 是 Cortex-M 处理器系列的与供应商无关的硬件抽象层。


基于CMSIS标准的软件架构主要分为以下4层:用户应用层、操作系统及

中间件接口层、CMSIS层、硬件寄存器层。其中CMSIS层起着承上启下的作用:一方面该层

对硬件寄存器层进行统一实现,屏蔽了不同厂商对Cortex‐M系列微处理器核内外设寄存器

的不同定义;另一方面又向上层的操作系统及中间件接口层和应用层提供接口,简化了应用

程序开发难度,使开发人员能够在完全透明的情况下进行应用程序开发。也正是如此,CMSIS

层的实现相对复杂。

stm32f10x.h:CMSIS 的

Cortex‐M3 STM32f10xxx微

控制器外设访问层头文件

system_stm32f10x.h :

CMSIS 的 Cortex‐M3

STM32f10xxx 微控制器外

设访问层头文件

system_stm32f10x.c :

CMSIS 的 Cortex‐M3

STM32f10xxx 微控制器外

设访问层源文件

首先新建一个项目并设置工具链对应的启动文件,可以使用标准外设库中提供的模板,也可

以自己根据自己的需求新建。标准外设库中已经提供了不同工具链对应的文件,位于

STM32F10x_StdPeriph_Lib_V3.4.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup

目录下。


其次按照使用产品的具体型号选择具体的启动文件,加入工程。文件主要按照使用产品的容

量进行区分,根据产品容量进行选择即可。


stm32f4xx_it.h外设中断函数文件 用户可以相应的加入自己的中断程序的代码,对于指向同一个中断向量的多个不同中断请求,用户可以通过判断外设的中断标志位来确定准确的中断源,执行相应的中断服务函数 │  system_stm32f4xx.c  文件  函数Sysem_ExtMemCtl,用来配置外部存储器控制器。它位于文件startup_stm32f10x_xx.s /.c,在跳转到main前调用 SystemFrequncy,该值代表系统时钟频率

Libraries\STM32F10x_StdPeriph_Driver\下的内容很好理解就是stm32的各个

外设模块驱动代码。

misc.h和misc.c是和CM3内核有关的NVIC和SysTick的驱动代码。

Libraries\CMSIS下是什么呢?cmsis英文全称:CortexMicrocontroller

Software Interface Standard,是Cortex系列处理器硬件抽象层,可以理解为cortex

内核的软件接口。


core_cm3.c, core_cm3.h

它们的目录名为CoreSupport,说明这两个文件是CM3内核支撑文件,其他使

用CM3内核的芯片也可以用,不一定是stm32。这两个文件用来获取设置CM3内

核,配置一些内核寄存器。

stm32f10x.h, system_stm32f10x.c,system_stm32f10x.h和

startup_stm32f10x_hd.s在DeviceSupport目录下,说明这几个文件是和具体的芯

片有关的,也就是stm32芯片的支撑文件。其中stm32f10x.h是标准外设库的入口,

使用标准外设库的代码中必须包含该头文件。system_stm32f10x.c,

system_stm32f10x.h这两个文件提供函数用来初始化stm32芯片,配置PLL、系

统时钟和内置flash接口。startup_stm32f10x_hd.s是大容量型stm32芯片的启动

文件

stm32f10x_it.c,stm32f10x_it.h是中断服务程序文件。stm32f10x_conf.h是标

准外设库的配置文件,对于工程中不需要的外设,可以注释掉里面的包含的头文件。

这里我建议先仅留下stm32f10x_gpio.h,stm32f10x_rcc.h,misc.h,用到什么再打

开什么,这样编译起来快一点,当然也可都留着。



相关文章
|
存储 Web App开发 Ubuntu
ARM嵌入式学习笔记——《Linux内核》
ARM嵌入式学习笔记——《Linux内核》
205 0
|
Ubuntu Linux 编译器
ARM嵌入式学习笔记——《根文件系统》
ARM嵌入式学习笔记——《根文件系统》
237 0
|
传感器 网络协议 Linux
ARM嵌入式学习笔记——《设备驱动基础》(三)
ARM嵌入式学习笔记——《设备驱动基础》
205 0
|
Linux C++
ARM嵌入式学习笔记——《设备驱动基础》(二)
ARM嵌入式学习笔记——《设备驱动基础》
103 0
|
存储 Web App开发 Unix
ARM嵌入式学习笔记——《设备驱动基础》(一)
ARM嵌入式学习笔记——《设备驱动基础》
139 0
|
缓存 Linux 开发工具
ARM嵌入式学习笔记——Linux字符设备驱动程序设计(三)
ARM嵌入式学习笔记——Linux字符设备驱动程序设计
198 0
|
缓存 Linux
ARM嵌入式学习笔记——Linux字符设备驱动程序设计(二)
ARM嵌入式学习笔记——Linux字符设备驱动程序设计
143 0
|
传感器 网络协议 Linux
ARM嵌入式学习笔记——Linux字符设备驱动程序设计(一)
ARM嵌入式学习笔记——Linux字符设备驱动程序设计
186 0
|
传感器
ARM | STM32F10xxx课堂学习笔记(时钟 & 高级控制定时器)
时钟 STM32F10xxx参考手册中文版 6.2 时钟 peripheral n.外部设备PCLK1 低速外设时钟PCLK2 高速外设时钟RC 阻容.
1671 0