韩国电影医生免费观看:关于ARM寄存器头文件

来源:百度文库 编辑:九乡新闻网 时间:2024/04/28 21:11:28

大家都知道51单片机都有定义寄存器的头文件,如。里面定义了各种寄存器的地址和名称,如果你想操作寄存器,就对头文件中定义好的寄存器名进行读写即可,如:P1=0;但是在32位的ARM内核处理器中,由于各家的MCU特点各不相同(如:定时器的数量有的是两个,有的是多个)总之,就是外设突出的特点各不相同,每个公司都有其设计的特点,ARM只是ARM公司设计的内核,他最多给设计了一个大体的轮廓,如:Cortex M3,他分配了4G的空间,规定了不同的总线,不同的外设,RAM,代码等所在的大体范围,如:内部RAM的地址范围是0x20000000~0x3FFFFFFF共0.5G的空间,这个范围的意思是:如果哪家MCU的设计公司要买我的ARM内核授权,你的MCU的内部RAM就必须在这个范围,至于多大,只要不超过0.5G,设计多大有MCU设计公司决定。所以我们可以买到有不同RAM的MCU。
   再回到寄存器头文件的问题,基于上面的原因,很难有一个统一的标准来规定每种外设和内部控制寄存器的具体地址,所以在学习32位MCU时的一些系统设置时就觉得很别扭,没有51那样顺畅(看看寄存器的功能,设置一下就ok了),其实每种32位MCU的库文件中都有寄存器头文件的,只是风格各不相同,都是他们公司内部工程师设计的,其实这种头文件最好还是我们自己设计,各种寄存器的名字我们自己取,这样操作起来就会得心应手了。或者对库里的头文件很熟也会熟练运用的。举个例子:TI公司的Cortex M3的MCU,LM3S8962

他们的库文件中对寄存器是这样设计的:在hw_memmap.h头文件中存放了所有的内存和外设的基地址(如:#define SRAM_BASE    0x20000000  // 定义SRAM的基址为0x20000000).

在hw_sysctl.h头文件中存放定义了系统控制寄存器的地址,如:#define SYSCTL_RCC   \           0x400FE060  // Run-mode clock config register,定义了运行模式时钟配置寄存器的地址,但是这种定义是没有意义的,0x400FE060在处理器中,只能识别为一个十六进制数值,具体是地址还是数值,它并不能自动区分。

那么怎么办呢?这就需要用户自己来进行编写,在hw_types.h 头文件中是这样做的:#define HWREG(x)     (*((volatile unsigned long *)(x)))

首先使用(volatile unsigned long *)(x) 将数据x进行强制转换,如:(volatile unsigned long *)(0x400FE060) 表明0x400FE060是一个无符号的长整型地址指针。关键字volatile告诉编译器,它指向的内容是很容易变的,可能会被硬件等意外的修改,无需优化处理,(*((volatile unsigned long *)(x))) 则是获取指针所指向地址x处的内容,从而使预处理语句对寄存器进行读写操作。