文章目录
- 内存模型
- 程序
内存模型
https://qq742971636.blog.csdn.net/article/details/108892807
单片机的Flash里面的区域不是全都能写的:https://blog.csdn.net/u014470361/article/details/79297601
找一下手册看看MSP430F5529单片机哪些地址区域能写:
下图:
闪存内存可以通过 JTAG 端口、Spy-Bi-Wire (SBW)、BSL 或者由 CPU 在系统中进行编程。CPU 可以对闪存内存进行单字节、单字和长字的写入操作。
闪存内存的特性包括:
闪存内存由 n 个主存储器段和四个信息存储器段(A 到 D)组成,每个信息存储器段的大小为 128 字节,每个主存储器段的大小为 512 字节。
段 0 到 n 可以一次擦除,或者可以逐个段进行擦除。
段 A 到 D 可以单独进行擦除,这些段也被称为信息存储器。
段 A 可以单独上锁。
下图大概的意思:
这段文本描述了一个内存模型的地址范围和用途。下面是各个地址范围及其属性的解释:
00000h-00FFFh:包含有间隙的外设
00000h-000FFh:保留给系统扩展使用
00100h-00FEFh:外设 x
00FF0h-00FF3h:描述符类型 (2) x
00FF4h-00FF7h:描述符结构的起始地址 x
01000h-011FFh:BSL 0 x x
01200h-013FFh:BSL 1 x x
01400h-015FFh:BSL 2 x x
01600h-017FFh:BSL 3 x x x
017FCh-017FFh:BSL 签名位置
01800h-0187Fh:信息 D x
01880h-018FFh:信息 C x
01900h-0197Fh:信息 B x
01980h-019FFh:信息 A x
01A00h-01A7Fh:设备描述符表 x
01C00h-05BFFh:16KB RAM
05B80h-05BFFh:备用中断向量
05C00h-0FFFFh:程序 x x (1) x
0FF80h-0FFFFh:中断向量
10000h-45BFFh:程序 x x x
45C00h-FFFFFh:空闲
其中,一些关键词的含义如下:
BSL:表示主引导加载程序(Bootstrap Loader)
Info A/B/C/D:信息区域
RAM:随机访问存储器
程序:存放代码的区域
中断向量:存放中断处理程序的区域
此内存模型的特点包括:
在读取/写入/获取时可以生成NMI(非屏蔽中断)
获取访问时生成PUC(CPU保护状态更改)
可以保护读取/写入操作
总是能够从(1)访问PMM寄存器;用户可以进行大规模擦除操作,包括整个存储器擦除、按照块擦除和按照段擦除。
程序
#include <msp430.h>
//从地址addr开始写,写len个
void write_data(unsigned int addr, const unsigned char dat[], unsigned char len) {
unsigned char i;
FCTL1 = FWKEY + ERASE; //设置擦除模式
FCTL3 = FWKEY;
for (i = 0; i < len; i++) {
*(unsigned char *) (addr + i) = 0;
}
FCTL1 = FWKEY + WRT; //设置写入模式
for (i = 0; i < len; i++) {
*(unsigned char *) (addr + i) = dat[i];
}
FCTL1 = FWKEY;
FCTL3 = FWKEY + LOCK;
}
//从地址addr开始读,读len个
void read_data(unsigned int addr, unsigned char dat[], unsigned char len) {
unsigned char i;
for (i = 0; i < len; i++) {
dat[i] = *(unsigned char *) (addr + i);
}
}
const unsigned char data[] = "ABCDEDF";
unsigned char data_read[10];
int main(void) {
WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer
write_data(0x001800, data, 7);
read_data(0x001800, data_read, 7);
while (1);
}