摘要:
本文以MSP430G2231为例,整理了其存储器组织各个部分的内容,包括特殊功能寄存器、外围模块、RAM、FLASH、中断向量表。
PS:本文系学习MSP430的整理笔记,为了是将Contiki移植到LaunchPad。
一、存储器组织[1]
1.1 小模式
从0x0000到0xFFFF分别是:特殊功能寄存器SFR、外围模块、数据存储器、程序存储器、中断向量表。不同型号的存储器组织不尽不同,使用时得具体参考数据手册,但具有以下共性[1]:
(1)特殊功能寄存器、8位外围模块、16位外围模块地址范围一样
特殊功能寄存器 0x0000~0x000F;
8位外围模块 0x0010~00FF
16位外围模块 0x0100~0x01FF
(2)数据存储器开始于相同的地址,即0x0200
(3)中断向量(存放中断服务程序首地址)地址范围一样,即0xFFE0~0xFFFF
所有器件的中断向量置于地址空间的最顶端,但其具体内容因器件不同而不同。
(4)代码存储器置于地址空间的顶端,即起始地址=0x10000-该器件的代码容量
(5)信息存储器(仅FLASH有)未必是挨着代码存储器,比如MSP430G2231,但容量皆是256Byte
(6)引导存储器(仅FLASH有)紧挨着信息存储器??,容量皆是1KB(有的器件没有)
数据存储器RAM一般用作保存数据及堆栈使用,特殊场合也可用于程序存储(做程序存储器时只能字操作)。代码存储器可存放指令代码、数据表格或者用户信息。
具体到某个型号的芯片,还得看数据手册,比如LaunchPad上面用的MSP430G2231[4]的存储器组织示意图如下:
看存储器映射图(Memory Map)会更形象,如下[3]:
二、特殊功能寄存器
特殊功能寄存器SFR位于地址空间的最低端,即0x0000~0x000F,共16个字节。MSP430G2231只用到4字节,这点可以从数据手册得到,如下:
图1 MSP430G2231特殊功能寄存器示意图
关于寄存器各位的含义,可参考数据手册。MSP430G2231特殊功能寄存器各位含义如下:
图2 MSP430G2231特殊功能寄存器各位含义示意图
三、外围模块
MSP430外围模块地址范围0x0010~0x01FF,分为字节寻址(0x0010~0x00FF)和字寻址(0x0100~0x01FF)。
3.1字模块
字模块是经16位总线相连的模块,这部分空间又被分割成16帧,每个帧8个字。每个字模块占用1~3帧[1]。MSP430G2231的字模块示意图如下[4]:
3.2 字节模块
字节模块是经总线的低8位相连,只能以字节的方式访问,若用字方式访问,会产生不可预期的结果。通常也分为16组,每组8字。MSP430G2231的字节模块示意图如下[4]:
四、RAM
MSP430数据存储器总是开始于相同的地址,即0x0200,本例RAM是128B,即从0x0200~0x027F。
五、FLASH
FLASH存储器分为主存储器和信息存储器(有些器件FLASH还含引导存储器),代码和数据可以放在任意一种存储区域,操作上没什么区别,但段的大小及物理地址不同。信息存储器是2个128Byte的段(Segment),主存储区域是若干个512Byte的段。段又可以细分为块(Block),块大小是64Byte。FLASH写可以是位、字节、字,但擦除的最小单位是段[2]。
图3 MSP430G2231FLASH示意图
六、中断向量
6.1 中断向量
中断向量,存放中断服务程序首地址,地址范围0xFFC0~0xFFFF,共32个中断。值得注意的是,不同器件,中断向量含义不同,得参考数据手册,MSP430G2231的中断向量示意图如下:
6.2 向量表定义
在io430G2231.h文件定义了这些向量:
/************************************************************
* Interrupt Vectors (offset from 0xFFE0)
************************************************************/
#define PORT1_VECTOR (2 * 2u) /* 0xFFE4 Port 1 */
#define PORT2_VECTOR (3 * 2u) /* 0xFFE6 Port 2 */
#define USI_VECTOR (4 * 2u) /* 0xFFE8 USI */
#define ADC10_VECTOR (5 * 2u) /* 0xFFEA ADC10 */
#define TIMERA1_VECTOR (8 * 2u) /* 0xFFF0 Timer A CC1, TA */
#define TIMERA0_VECTOR (9 * 2u) /* 0xFFF2 Timer A CC0 */
#define WDT_VECTOR (10 * 2u) /* 0xFFF4 Watchdog Timer */
#define NMI_VECTOR (14 * 2u) /* 0xFFFC Non-maskable */
#define RESET_VECTOR (15 * 2u) /* 0xFFFE Reset [Highest Priority] */
6.3 编写中断服务程序
// 定时器中断服务程序
#pragma vector=[中断矢量变量]
__interrupt void ??????void)
{
/***中断服务程序内容***/
}
或者
interrupt [中断向量] void 函数名()
{
}
中断矢量变量表明了该中断服务函数对应的中断向量表中的中断地址。__interrupt关键字用于表明该函数是中断服务函数。
// 定时器中断服务程序
#pragma vector=TIMERA0_VECTOR
__interrupt void TimerA_ISR(void)
{
/***中断服务程序内容***/
}
参考资料:
[1] 魏小龙.《南航MSP430选修课》试用教材.
[2] 文档《MSP430系列十六位超低功耗单片机教学实验系统实验教程》
[3] 手册《MSP430x2xx Family User's Guide.pdf》
[4] MSP430G2231数据手册
上一篇:初学MSP-EXP430G2-LaunchPad(四)
下一篇:MSP430加密代码保护
推荐阅读最新更新时间:2024-11-10 10:28