LM3S811寄存器操作(有感)

Other Parts Discussed in Thread: LM3S811

通过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,有不对的地方还请指正。