⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 《嵌入式系统-使用HCS12微控制器的设计与应用》在CodeWarrior开发环境下的源程序。
💻 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 + -