通过TI的大力推广,相信现在有很多人在使用Stellaris系列ARM。我发现一个现象,使用TI Stellaris系列ARM的人更偏向于使用驱动库的库函数进行编程,很少有人直接操作寄存器编程,而使用STM32的人,好一部分都直接操作寄存器编程,我学习LM3S811不久,一直使用的是驱动库进行编程,但是今天我想写点直接操作寄存器编程的感悟,纯粹是个人的感悟,有不正确的地方还请指正,谢谢!
在使用库函数编程时我们通常会把这几个头文件加进工程中“hw_memmap.h” “sysctl.h” “hw_types.h” “hw_ints.h”
其中 hw_memmap.h - 定义内存的映射(定义有全部片内外设在存储器里的基地址)
sysctl.h - 系统控制驱动程序的原型
hw_types.h - 包含硬件寄存器访问宏
hw_ints.h - 宏定义的Stellaris中断分配
1、hw_types.h 里边有如下定义
{
typedef unsigned char tBoolean;
#ifndef true
#define true 1
#endif
#ifndef false
#define false 0
#endif
}
驱动库是用C 语言编写的,而在C 语言里没有代表布尔类型的关键字bool 以及表示真
假的关键字true 和false (在C++语言里才有这几个关键字)。因此,在头文件 “hw_types.h”
里,定义了布尔类型tBoolean,以及与其相关的常量true 和false,以方便操作。
tBoolean 被定义为布尔类型,定义方式为:
typedef unsigned char tBoolean;
tBoolean 本质上就是unsigned char 类型,可以用来定义变量、函数参数、函数返回值等
的类型。
true 和false 被定义为表示布尔类型真和假的常量,定义方式为:
#define true 1
#define false 0
HWREG(x): 以全字(32位)方式访问硬件寄存器
HWREGH(x):以半字(16位)方式访问硬件寄存器
HWREGB(x):以字节( 8位)方式访问硬件寄存器
HWREGBITW(x,b):以“bit-banding”方式访问全字寄存器x当中的第b位
HWREGBITH(x,b):以“bit-banding”方式访问半字寄存器x当中的第b位
HWREGBITB(x,b):以“bit-banding”方式访问字节寄存器x当中的第b位
在 《Stellaris 外设驱动库》里,访问片内外设的库函数最终都是由在头文件“hw_types.h”
里定义的3 个硬件寄存器访问宏函数HWREG( )、HWREGH( )、HWREGB( )实现的
现在举一个例子说明对硬件寄存器的具体操作方法
#include <hw_types.h>
#define SYSCTL_BASE 0x400FE000 // 定义系统控制模块的基址
#define RCGC2 (SYSCTL_BASE + 0x108) // 定义时钟选通控制寄存器2(偏移量0x108)
int main(void)
{
HWREGBITW(RCGC2, 1) = 1; // 选通GPIOB 模块的时钟
//RCGC2是一个32位(全字)的硬件寄存器 GPIOB是它的第一位
//以“bit-banding”方式访问全字寄存器RCGC2当中的第1位
//上条语句等同于HWREG(RCGC2) |= 0x00000002; // 以全字(32位)方式访问硬件寄存器,选通GPIOB 模块的时钟
for (;;)
{
}
}
这是第一个例子,后面会持续发一些自己的感悟,自己还是一名学生,刚入门M3,有不对的地方还请指正。