📄 main.c
字号:
//-------------------------------------------------------------------------*
//工 程 名:DG128FLASHS1格式(FlashS1) *
//硬件连接:MCU的串行口与PC机的串行口相连 *
//程序描述:实现对Flash指定区域的擦除,写入,读取 *
//说 明: *
//目 的:初步掌握Flash擦写的基本知识 *
//-------《嵌入式系统-使用HCS12微控制器的设计与应用》教学实例-------------*
//头文件
#include "includes.h" //总头文件
//由于在Flash擦写时会在Flash区产生高压,造成擦写不稳定,本工程把在高压时执行
//的程序转换成机器码存放在RAM区,在执行擦写操作时,执行RAM区的机器码,
//擦写操作稳定,该机器码存放在下面数组中,其中'0x3D'是'RTS'的机器码
const INT8U P[18] = {0x18,0x0B,0x80,0x01,0x05,0xF6,0x01,0x05,0x87,
0x87,0xC4,0x40,0x8C,0x00,0x00,0x27,0xF4,0x3D};
const INT8U Line_end[2] = {0x0D,0x0A}; //ASCII码的换行回车符
//内部子程序声明
INT8U CvtPage(INT8U buff[8]);
INT16U CvtAddr(INT8U buff[8]);
//主函数
int main()
{
INT8U i;
INT8U j;
INT8U k;
INT8U flag; //写字节奇偶个数标志
DISABLE_INTERRUPTS; //禁止总中断
//1. 芯片初始化
MCUInit();
//2. 模块初始化
SCIInit(); //串行口初始化
//3.内存初始化
//把存放在RAM区的机器码赋值给数组PrgOfRam,供Flash擦写函数调用
for (i=0; i<18; i++)
PrgOfRam[i] = P[i];
//主循环
while (1)
{
i = SCIReN(1,SerialBuff);
if (i != 0) continue;
switch (SerialBuff[0])
{
//收到提问信号
case '?' :
{
SCISendN(11,"E:PAGE:ADDR"); //擦除命令格式
SCISendN(2, (void *)Line_end);
SCISendN(18,"W:PAGE:ADDR:N:DATA"); //写入命令格式
SCISendN(2, (void *)Line_end);
SCISendN(13,"R:PAGE:ADDR:N"); //读取命令格式
SCISendN(2,(void *)Line_end);
break;
}
//收到擦除信号
case 'E' :
{
j = SCIReN(8,SerialBuff);
if (j == 0)
{
//将收到的字符数据转换成十六进制数据
for (k=1; k<8; k++)
if((SerialBuff[k]>='0') && (SerialBuff[k]<='9'))
SerialBuff[k] = SerialBuff[k]-'0';
else SerialBuff[k] = SerialBuff[k]-'A'+0x0A;
//对页号和地址处理
page=CvtPage(SerialBuff);
addr=CvtAddr(SerialBuff);
//擦除指定的扇区
Flash_Erase_Sector(page,addr);
//发送擦除结果
SCISendN(250,(void *)addr);
}
break;
}
//收到写入信号
case 'W' :
{
j = SCIReN(11,SerialBuff);
if (j == 0)
{
//将收到的字符数据转换成十六进制数据
for (k=1; k<10; k++)
if ((SerialBuff[k]>='0') && (SerialBuff[k]<='9'))
SerialBuff[k] = SerialBuff[k]-'0';
else SerialBuff[k] = SerialBuff[k]-'A'+0x0A;
//对页号和地址处理
page=CvtPage(SerialBuff);
addr=CvtAddr(SerialBuff);
//接收写入的数据个数
N = SerialBuff[9];
//接收写入的数据
k = SCIReN(N,SerialBuff);
//对数据的奇偶个数进行处理
if (k == 0)
{
flag = 0;
if(1 == N%2)
{
SerialBuff[N] = 0xFF;
N += 1;
flag = 1;
}
//写入数据
Flash_Write_Nword(page,addr,(INT16U)SerialBuff,N/2);
if(1 == flag)
{
N -= 1;
}
//发送写入到Flash的数据
SCISendN(N,(void *)addr);
}
}
break;
}
//收到读取信号
case 'R' :
{
i = SCIReN(10,SerialBuff);
if (i == 0)
{
//将收到的字符数据转换成十六进制数据
for (i=1; i<10; i++)
if((SerialBuff[i]>='0') && (SerialBuff[i]<='9'))
SerialBuff[i] = SerialBuff[i]-'0';
else SerialBuff[i] = SerialBuff[i]-'A'+0x0A;
//对页号和地址处理
page=CvtPage(SerialBuff);
PPAGE = page;
addr=CvtAddr(SerialBuff);
//接收要读取的数据个数
N = SerialBuff[9];
//发送要读取的数据
SCISendN(N,(void *)addr);
}
break;
}
}
}
}
//内部子程序实现
//CvtPage:从字节数组中提取页号---------------------------------------------*
//功 能:从字节数组buff中提取页号 *
//参 数:buff--字节数组 *
//返 回:页号 *
//注 意:无 *
//-------------------------------------------------------------------------*
INT8U CvtPage(INT8U buff[8])
{
INT8U page;
page = buff[1]<<4;
page = buff[2]+page;
return page;
}
//CvtAddr:从字节数组中提取地址---------------------------------------------*
//功 能:从字节数组buff中提取地址 *
//参 数:buff--字节数组 *
//返 回:地址 *
//注 意:无 *
//-------------------------------------------------------------------------*
INT16U CvtAddr(INT8U buff[8])
{
INT16U addr;
addr = buff[4]<<4;
addr = buff[5]+addr;
addr = addr<<8;
addr = addr+(buff[6]<<4);
addr = buff[7]+addr;
return addr;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -