1. 外部扩展程序存储器
由于C54x内部没有Flash或EEPROM,掉电后程序不能保存下来,脱机使用时需要外接的Boot ROM在上电时将程序加载到内部RAM中运行,因此必须为C54x DSP扩展一个非易失程序存储器,用以存放待执行的指令和执行中所用的系数(常数)。
C54xx有1~8M字的程序地址空间,其中程序地址空间的每16位地址空间的高32k(xx8000H-xxFFFFH)可以映射到外部存贮器。YK5000实验仪的CPU板上集成了一片256k×16bit的Flash。由于外部地址空间有限,在YK5000实验仪的设计中,外部程序存储器的所有页占用的是同一地址空间0x8000~0xFFFF,可寻址范围为32k。当外部存储器容量大于32k时,就将存储器空间以32k为单位分为多个存储页。例如, 256k的Flash以32k为一页,共被分为256/32=8页。
由于外部程序存储器的存储页一般不同时使用,因此可由CPLD来控制切换。控制页面切换的寄存器被映射到IO地址0x8000,上电时默认为0,此时Flash的第0页有效,Flash的其他页无法访问,如需要访问这些空间,在程序中写0x1~0x7到IO端口0x8000就可以把地址空间0x8000~0xFFFF由Flash Page0映射到其他的存储页。
表2.2 YK5000外部存储器映射
页面寄存器 (IO端口地址0x8000) 外部存储器(占用地址空间0x8000~0xFFFF) 说明
0x 0 Flash Page0 Flash程序存储器的第0页
0x 1 Flash Page 1 Flash程序存储器的第1页
0x 2 Flash Page 2 Flash程序存储器的第2页
0x 3 Flash Page 3 Flash程序存储器的第3页
0x 4 Flash Page 4 Flash程序存储器的第4页
0x 5 Flash Page 5 Flash程序存储器的第5页
0x 6 Flash Page 6 Flash程序存储器的第6页
0x 7 Flash Page 7 Flash程序存储器的第7页
上电时页面寄存器的值可以由板上的拨动开关SWX2的状态设定,用来选择上电时默认加载Flash中哪一个32k的存贮页中的程序。
2.Flash芯片—SST39VF400A介绍
Flash是一种体积小,容量大的非易失性存贮器,可以反复烧写十万次。但其写操作比较麻烦:一是先要擦除,后写数据;二是写擦除/写操作之前需要加上一定前导指令码。
YK5000实验仪板载Flash芯片型号为SST39VF400A,此芯片是Silicon Storage Technology生产的4M位(256k×16)FLASH存储器。以下是SST39LF400A写操作指令码:
表9.1 SST39LF400A指令序列
指令序列 1 2 3 4 5 6
Addr D Addr D Addr D Addr D Addr D Addr D
写数据 5555 AA 2AAA 55 5555 A0 WA Data
擦除扇区 5555 AA 2AAA 55 5555 80 5555 AA 2AAA 55 SAX 30
擦除区块 5555 AA 2AAA 55 5555 80 5555 AA 2AAA 55 BAX 50
擦除整片 5555 AA 2AAA 55 5555 80 5555 AA 2AAA 55 5555 10
WA表示写数据地址,SAX表示扇区地址,扇区大小是2k Word;BAX表示区块地址,区块大小是32k Word。
需要特别注意的是,Flash指令序列中的Addr格式是A14~A0,默认其高位地址线为0。在YK5000实验仪中,Flash被映射到DSP的高32k地址(0x8000~0xFFFF),因此,在DSP中访问Flash空间的时候,写地址Addr都需要加上基地址0x8000。
详细内容,请阅读SST39LF400A的数据手册。
实验内容
本小节的实验内容是在CCS里编写一个擦除、烧写YK5000实验仪上Flash芯片的程序。
要求:
1. 擦除Flash的存储区;
2. 将Flash切换到第0页;
3. 将数据0x0000~0x8000烧写到第0页存储区内。
在CCS的仿真、调试环境下,读者可以实时的观察到Flash中存储区变化情况,掌握Flash读写操作的知识。
(1)整块Flash的擦除
只要在相应地址写入表9.1所示的指令序列,就能对SST39LF400A进行各种擦除操作,下面是擦除整片Flash所用的函数形式:
//定义指向地址0x8000的IO端口变量,用来控制Flash页面切换
ioport unsigned port8000h;
//擦除整块Flash
void EraseChip()
{
unsigned int i;
*(volatile unsigned int *)(0x8000+0x5555) = 0xAA;
delay(10);
*(volatile unsigned int *)(0x8000+0x2AAA) = 0x55;
delay(10);
*(volatile unsigned int *)(0x8000+0x5555)= 0x80;
delay(10);
*(volatile unsigned int *)(0x8000+0x5555)= 0xAA;
delay(10);
*(volatile unsigned int *)(0x8000+0x2AAA)= 0x55;
delay(10);
*(volatile unsigned int *)(0x8000+0x5555)= 0x10;
delay(10);
//验证
for( i=0x0; i<07FFF; i++ ) //在此仅验证页0擦除操作是否正确完成
while( *(volatile unsigned int *)(0x8000+i) != 0xffff );
}
(2)为Flash写入特定的数据
为了方便观察起见,将数据0x0000~0x8000烧写到Flash的第0页存储区内。函数形式如下:
//向Flash中写数据,依次为0x0000--0xFFFF
void WriteChip()
{
unsigned int i;
for( i=0; i<=0x7FFF; i++ )
{
*(volatile unsigned int *)(0x8000+0x5555) = 0xAA;
delay(PERIOD);
*(volatile unsigned int *)(0x8000+0x2AAA) = 0x55;
delay(PERIOD);
*(volatile unsigned int *)(0x8000+0x5555)= 0xA0;
delay(PERIOD);
*(volatile unsigned int *)(0x8000+i) = i;
delay(PERIOD);
//在此仅验证当前字写入操作是否正确完成
while( *(volatile unsigned int *)(0x8000+i) != i );
上一篇:单片机系统中红外通信接口的设计
下一篇:MCU应用系统调试方法
推荐阅读最新更新时间:2024-03-16 13:52