苏州大学实验报告
院、系 年级专业 姓名 学号
课程名称 成绩
指导教师 同组实验者 实验日期
实验名称: Flash在线编程实验
一.实验目的
通过该实验,进一步熟悉MT-IDE嵌入式开发系统环境、汇编和C语言以及调试方式;进一步学习串口的相关内容;掌握Flash存储器在线编程的基本概念;熟悉GP32芯片Flash存储器在线编程擦除和写入的步骤;理解课本中的程序代码。
二.实验内容
通过PC机的串口发送数据到MCU方,然后将接受到的数据写入到flash中以0x8000地址开始的一页中。最后将写入的数据读出发送到PC端校验。
三.实验过程
(一)基本过程
(1)页擦除操作
下面过程可以擦除GP32的Flash存储器的一页(128字节):
① $2→FLCR(1→ERASE位,0→MASS位):进行页面擦除;
② 读Flash块保护寄存器FLBPR;
③ 向被擦除的Flash页内任意一个地址写入任意值,为方便起见,一般向待擦除页首地址写入0;
④ 延时tnvs(>10μs);
⑤ $A→FLCR(1→HVEN位);
⑥ 延时terase(>1ms);
⑦ $8→FLCR(0→ERASE位);
⑧ 延时tnvh(>5μs);
⑨ $0→FLCR(0→HVEN位);
⑩ 延时trcv(>1μs),完成一页的擦除操作。
(2)整体擦除操作
下面过程擦除GP32的整个Flash区域,以便把新的程序装入Flash存储器,这是应用系统研制过程中开发工具对GP32编程的准备工作。
① 6→FLCR(1→ERASE位,1→MASS位):进行整体擦除;
② Flash块保护寄存器FLBPR;
③ 向被擦除的Flash任意一个地址写入任意值,为方便起见,一般向首地址写入0;
④ 延时tnvs(>10μs);
⑤ $E→FLCR(1→HVEN位、MASS位、ERASE位);
⑥ 延时tMerase(>4ms);
⑦ $C→FLCR(0→ERASE位);
⑧ 延时tnvhl(>100μs);
⑨ $0→FLCR(0→HVEN位、MASS位);
⑩ 延时trcv(>1μs),完成整体擦除操作。
(3)编程操作
MC68HC908GP32的Flash编程操作以行(64字节)为单位进行的。当然,一次写入可以小于一行,但不能大于一行。对于已经写过的部分未经擦除不能重新写入变更其数据,否则将引起数据出错。写入过程如下:
a. $1→FLCR(1→PGM位);
b. 读Flash块保护寄存器FLBPR;
c. 向将要写入的Flash行内任意一个地址写入任意值,为方便起见,一般向行首地址写入0,这一步选定了所要编程的行,以下的目标地址必需在这一行中;
d. 延时tnvs(>10μs);
e. $9→FLCR(1→HVEN位);
f. 延时tpgs(>5μs);
g. 待写数据写入对应的Flash地址;
h. 延时tprog(>30μs),完成一个字节的写入(编程)工作;
i. 重复g、h,直至同一行内各字节写入完毕;
j. $8→FLCR(0→PGM位);
k. 延时tnvh(>5μs);
l. $0→FLCR(0→HVEN位);
m. 延时trcv(>1μs)以后,完成本行写入工作,可以读出校验。
四.编程
(一)流程图
开始
头文件
和声明
MCU、SCI初始化
复位
1 ?
结束
图1 Flash存储器流程图
(二)所用寄存器名称及其所用的位
Flas控制寄存器(Flash Control Register,FLCR)
数据位
D7 D6 D5 D4 D3 D2 D1 D0
定义
x x x x HVEN MASS ERASE PGM
复位
0 0 1 0 0 0 0 0
Flash块保护寄存器(Flash Block Protect Register,FLBPR)
Flash块保护寄存器设定的只是保护区域的起始地址,保护区域的结束地址始终为Flash存储区的结束地址($FFFF)。对MC68HC908GP32而言,FLBPR设定的是16位起始地址的第14~7位(第15位恒为1)。
(三)主要代码段
1.汇编方式:
主程序部分代码
……
MainInit:: //复位后程序从此开始执行
//[系统初始化]
SEI
LDHX #$023F //堆栈初始化
TXS
JSR MCUInit //调系统初始化子程序GP32Init
//[串行口初始化]
JSR SCIInit
//[程序总循环入口]
MainLoop:
//[发送1个握手信号86]
LDA #86 //发送握手信号86
JSR SCISend1
//[等待接收1的握手信号56]
JSR SCIRe1
CMP #56 //是否是56?
BNE MainLoop //否,继续握手
//[等待接收1个字节=要写入的字符个数(<=64)并存到N中]
JSR SCIRe1
STA N
//[等待接收N个字节并存到以DATA1为首址的内存中]
LDA N
LDHX #DATA1
JSR SCIReN
//[擦除以Fdata为首地址的Flash区(1页,GP32:128字节)]
LDA #%00000010 //保护$8100~$FFFF的FLASH区域
STA FLBPR
LDHX #Fdata
JSR EraseSub
//[将以DATA1开始的N个数写入以Fdata为首址的Flash区]
LDA #%00000010 //保护$8100~$FFFF的FLASH区域
STA FLBPR
LDHX #DATA1 //RAM首地址->RAMandFlash[0-1]
STHX RAMandFlash
LDHX #Fdata //Flash首地址->RAMandFlash[2-3]
STHX RAMandFlash+2
LDA N //写入FLASH的数据个数
JSR WriteSub
//[向PC机发送写入Flash区的N个数据,供PC机接收并比较]
LDHX #Fdata
LDA N
JSR SCISendN
//[转程序总循环入口]
JMP MainLoop
……
2.C语言方式:
主程序部分代码
…………
void main()
{
INT8U *p;
MCUInit(); //MCU初始化
SCIInit(); //串口初始化
//主循环开始
while(1)
{
SCISend1(86); //发送握手信号86
//等待接收一个字节的握手信号
if(SCIRe1(p)!=56) //是否是56?
continue; //否,继续握手
//等待接收写入的数据个数(N<=128)并存放到N中
SCIReN(1,data);
N=data[0];
//等待接收N个字节的数据并存放到以data数组中
SCIReN(N,data);
//调用EarseFlash()程序之前要保护后一页之后的区域
//如:EarseFlash(0x8000),则要保护的为$8100后的区域
FLBPR=0b00000010; //保护$8100~$FFFF的FLASH区域
EraseFlash(0x8000);//擦除0x8000为始址的一个页
//调用WriteFlash()程序之前要保护后一页之后的区域
//如:WriteFlash(0x8000),则要保护的为$8100后的区域
FLBPR=0b00000010; //保护$8100~$FFFF的FLASH区域
WriteFlash(0x8000);//将数据写入flash
//读出flash中的数据发给pc机比较
SCISendN(N,(INT8U *)0x8000);
}
}
五.实验问答(根据实验指导书所列举的问题)
1.flash在线编程的过程中有哪些注意点?
在进行flash在线编程过程中,有如下几点需要注意:一、严格按照芯片手册上的步骤和时序编程,进行恰当的延时,以避免延时过长或过短。二、由于flash在线编程时需要对其加高压,导致对flash存储器的存储区读取不稳定。可能导致程序不能正常执行。因而擦除、写入子程序要转入RAM区执行。三、由于擦写子程序要在移到RAM区所以在调用子程序时要注意使用BSR指令。
2.当用flash区存储一些需要变动的参数时,应如何注意哪些问题?
当用flash区存储一些需要变动的参数时,要注意flash擦除后才能写入的特性、并且一次擦除至少为一页。所以如果一些参数变动时,需要先将该参数所在页的数据读出后更新,再擦除整页,最后重新写入。
六.实验小结
通过该实验,了解了flash在线编程的基本概念,熟悉和掌握了MT-IDE嵌入式开发系统环境及其调试方式,进一步熟悉汇编编程和C语言编程;通过在GP32上的练习,了解了如何GP32上进行Flash在线编程。
第5页
展开阅读全文