导航:首页 > 文档加密 > 飞思卡尔读取未加密程序

飞思卡尔读取未加密程序

发布时间:2022-04-29 05:42:56

1. 飞思卡尔单片机如何像51单片机那样下载程序(烧写hex文件)而不让别人看到源程序

飞思卡尔单片机下载程序没那么简单的,需要专门的编程器,网上可以买到。现在国内做飞思卡尔的比较好的就是清华大学的。

2. 这个飞思卡尔的芯片需要写程序吗

如果买来就是有程序的就不需要写了。如果是可编程的就需要写自己的程序的。

3. 飞思卡尔mc9s12xf512的用eeprom读写数据的完整程序代码该怎么写呢(只要这款芯片的)

voidEEPROM_erasure(UINT16number)//清除操作函数
{
UINT16*erase;
//erase=(unsignedchar*)(0x400+number);

erase=(UINT16*)(number);
*erase=0xff;
DisableInterrupts;
while(!(ECLKDIV&0x80))
{}
while(!(ESTAT&0x80))
{}
while(!(EPROT&0x80))
{}
ECMD=0x40;
ESTAT|=0x80;
while(!(ESTAT&0x40))
{}
EnableInterrupts;;
}
voidEEPROM_write(UINT16code,UINT16number)//写操作
{


UINT16*eeaddr;//对EEPROM进行写操作时的地址

/*
allow_calibration=0;
calibration=1;
*/
DisableInterrupts;
eeaddr=(UINT16*)(number);
while(!(ECLKDIV&0x80))//判断ECLKDIV是否被写入,是向下进行,否原地等待?
{}
while(!(ESTAT&0x80))//判断缓冲区是否准备好,准备好则向下进行,没有准备好则原地等待?
{}
while(!(EPROT&0x80))//判断EEPROM是否允许被写入,允许向下进行,不允许则原地等待?
{}
*eeaddr=code;

ECMD=0x20;
ESTAT|=0x80;
while(!(ESTAT&0x40))//判断EEPROM是否被写入,是向下进行,否原地等待;
{}
EnableInterrupts;
return;
}
*/
UINT16EEPROM_read(UINT16add)//读操作
{UINT16*erase;
UINT16m;

calibration=0;

DisableInterrupts;
erase=(UINT16*)(add);

m=*erase;
EnableInterrupts;
returnm;}

4. 飞思卡尔单片机程序怎样读出

单片机解密又叫单片机破解,芯片解密,IC解密,但是这严格说来这几种称呼都不科学,但已经成了习惯叫法,我们把CPLD解密,DSP解密都习惯称为单片机解密。单片机只是能装载程序芯片的其中一个类。能烧录程序并能加密的芯片还有DSP,CPLD,PLD,AVR,ARM等。当然具存储功能的存储器芯片也能加密,比如DS2401 DS2501 AT88S0104 DM2602 AT88SC0104D等,当中也有专门设计有加密算法用于专业加密的芯片或设计验证厂家代码工作等功能芯片,该类芯片业能实现防止电子产品复制的目的。

5. 能否读出飞思卡尔单片机中未加密的程序

可以的,就算加密的都可以读出来。现在有专门破解单片机的,可以花钱找人破解。

6. 飞思卡尔MC9S08GB60单片机怎么解密

大部分单片机为防止解密都有很多措施。建议还是努力学习吧,不要想破解了。破解有硬件破解,和软件破解,都需要大量时间,以及很专业知识。网络一下,会有专业破解的,可价格也摆在那了。

7. 怎样用CodeWarrior读出芯片的程序

利用向导创建一个新工程项目

•在新项目中加入或删除文件

•调试

•启动程序•PRM 文件设置

•如何对IO 及寄存器进行操作

•如何写中断程序

•嵌入式编程注意事项•Codewarrior 定购信息

8. 飞思卡尔程序

我这只有舵机,摄像头,和主程序,但是只是框架,要等调试。可以参考哈
#ifndef _WATCH_H_ //头文件保护
#define _WATCH_H_
#ifndef ULONG
#define ULONG unsigned long
#define UCHAR unsigned char
#define UINT unsigned int
#endif
#define ROAD_MAX 10
////////////////代设值
#define MP0 //捕捉象素引脚
#define HREF //捕捉行中断引脚
//////////////////
static unsigned char Colors[10][48]; //象素数组
static unsigned char JudgeMax; //最大象素
static unsigned char JudgeMin; //最小象素
unsigned char Over; //中断函数处理完成
//使用数组后要清零

struct ROADS
{
unsigned char LeftRight; //1 left, 0 right 2 表示没检测到黑线 4表示起始线
unsigned int road; //转向率,0表示直线或则没检测到黑线
}Roads[10]; //没检测到黑线一般为前方有大于90度的弯,
//行驶一会后数组会更新,不会因此丢掉跑道

unsigned long RoadLength; //mm单位
void GetRoads(); //取象素
void ProcessRoads(); //取转向率
void delay(UINT); //延时函数
void ColorToRoads(UINT); //2值化与赋值
#endif //_WATCH_H_
以下为实现文件:
//watch.c
#include <hidef.h> /* common defines and macros */
#include <MC9S12XS128.h> /* derivative information */
#include "watch.h"

#pragma CODE_SEG NON_BANKED
#pragma TRAP_PROC
void GetRoads() //场中断服务函数
{
UINT i;
UINT Href= 0;
delay(5);
while(HREF)
{
if(Href>= 270) //点读取完毕,退出循环
break;
if((270-Href)%21!= 0 || Href< 60) //取60-270行中平均间隔的行数,共30行
{
Href++;
while(HREF); //等待此行扫描结束
while(!HREF); //等待新行开始扫描
continue;
}
delay(...); //根据调式结果具体设置
for(i= 0; i< 48; i++)
{
Colors[((270-Href)%21)][i]= MP0; //读取引脚数据,后来会根据串口还是并口读取做相应修改
if(MP0> judgeMax) //取最大最小值
JudgeMax= MP0;
if(MP0< JudgeMin)
JudgeMin= MP0;
delay(...); //具体设置
}
Href++;
while(HREF);
while(!HREF); //等待行中断结束
}
Over= 1; //中断函数处理完成
}

#pragma CODE_SEG DEFAULT

void ColorToRoads(UINT Href)
{
UINT i;
UINT temp; //用于起始线判断
UINT temp2;
UINT temp3;
UCHAR Judge; //平均厥值
UINT j= 0;
UINT m_nCount= 0;

Judge= (JudgeMax+ JydgeMin)/2;
Roads[Href].road= 0;
Roads[Href].LeftRight= 0;
for(i= 0; i<48; i+= 3)
{
if(Colors[i]<= Judge||
Colors[i+ 1]<= Judge||
Colors[i+ 2]<= Judge)
{
Roads[Href].road&= (0x8000>> (UCHAR)j); //相应位赋值为1
m_nCount++;
}
j++;
}
if(Roads[Href].road== 0x00)
{
Roads[Href].LeftRight= 0x02; //没有捕捉到黑线设置2
}
if(m_nCount> 1) //若黑点数大于1,从左向右数出连续的点中的中间点
{
j= 0;
i= 0;
while(!(Roads[Href].road& (0x8000>>(UCHAR)i)))
{
i++;
}
j= i;
while((Roads[Href].road& (0x8000>>(UCHAR)i))
{
i++;
if(i> 15)
break;
}
if(i< 15) //起始线判断
{
temp= i;
while(!(Roads[Href].road& (0x8000>>(UCHAR)temp)))
{
temp++;
temp2= temp;
}
if(temp< 15)
{
while((Roads[Href].road& (0x8000>>(UCHAR)temp))
{
temp++;
temp3= temp;
if(temp> 15)
break;
}
if(temp< 15)
{
while(!(Roads[Href].road& (0x8000>>(UCHAR)temp)))
{
temp++;
}
if(temp< 15)
{
Roads[Href].LeftRight= 0x04;
Roads[Href].road&= 0x8000>>(UCHAR)((temp2+ temp3)/2);
return;
}
}
}
}
Roads[Href].road&= 0x8000>>(UCHAR)((i+j)/2);
}
}

void ProcessRoads() //路径处理函数,在主函数中调用
{
int i;
for (i= 0;i< 10; i++)
{
ColorToRoads(i);
}
}

void delay(UINT m) //延时函数根据调试结果相应做改动
{
UINT i;
UINT j;
for(i= 0; i< m; i++)
{
for(j= 0; j< 200; j++)
}
}

再下面就是主函数实现文件:

#include <hidef.h> /* common defines and macros */
#include <MC9S12XS128.h> /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12xs128"

#include "watch.h" //摄像头
#include "TurnAround.h" //舵机
//#include "..." //直流电机
//#include "..." //测速模块

#ifndef TRUE
#define TRUE 1
#define FLASE 0
#endif

#define ULONG unsigned long
#define UCHAR unsigned char
#define UINT unsigned int

#define LITTLE
#define LARGE
//////////////////////全局变量
UCHAR m_nCount; //圈数计算
UCHAR m_nCount2;

////////////////////////////////函数定义
void init(); //初始化函数 待修改
UCHAR CheckRoad(UCHAR*,UCHAR*); //第1参数返回第几个元素开始
//第2个参数返回第几个元素结束
//0 直线, 0x11有小弯道, 0x21大弯道, 0x31终点

void CarRun(UCHAR, UCHAR, UCHAR); //小车行驶函数

#pragma CODE_SEG NON_BANKED
#pragma TRAP_PROC
void Int_TimerOverFlow(void) //32MHz TCNT 50000--200ms
{
static int m= 0;
if(m== 15) //3秒
{
m_nCount2= 0;
TSCR1_TEN= 0; //关定时器
TFLG2_TOF = 1;
}
m++;
}

#pragma CODE_SEG DEFAULT

void TimerInit()
{
TIOS= 0x00;
TSCR2_PR= 7; //默认情况下是32MHz bus clock,所以分频后主时钟为 0.25MHz
TSCR2_TOI= 1; //OverFlow方式
TCNT= 65535- 50000;
TSCR1_TEN= 1; //开定时器
}

////////////////////////////////
void main() //主程序
{
UCHAR ret;
UCHAR number1= 0;
UCAHR number2= 0;
init();
while(1)
{
while(over); //等待扫描完毕
over= 0;
IRQCR_IRQEN= 0; //关外部中断IRQ
ProcessRoads(); //interface of watch.h
ret= CheckRoad(&number1, &number2); //检测路径
if(ret== 0x31)
break;
CarRun(number1, number2, ret);
}
PWME_PWME1= 0; //关闭PWM
while(1);
}

void init()
{
IRQCR_IRQE= 1; //下降沿触发IRQ
PE1= 1;
EnableInterrupts; //开总中断
INTCR_IRQEN= 1;
PWMInit(); //舵机初始化
Speed(MAX);
}

UCHAR CheckRoad(UCHAR* number1, UCHAR number2)
{
int i;
int sub= 0;
int psub= 0;
int temp;
bool flag;
UCHAR ret;
i= 0;
m_nCount2++;
while(!Roads[i].road)
{
i++;
}
*number1= i;
if(Roads[i].road>= Roads[i+ 1].road)
{
flag= TRUE;
psub= Roads[0].road- Roads[1].road;
}
else
{
flag= FALSE;
psub= Roads[1].road- Roads[0].road;
}
for(; i< 9; i++)
{
if(Roads[i].LeftRight== 0x04)
{
if(m_nCount2== 0)
{
m_nCount2= 1;
m_nCount++;
TimerInit();
}
}
if(m_nCount== 3)
{
Speed(0);
ret= 0x31;
goto _RET;
}
if(Roads[i+ 1].road== 0)
{
break;
}
if(flag)
{
sub= Roads[i].road- Roads[i+ 1].road;
}
else
{
sub= Roads[i+ 1].road- Roads[i].road;
}
sub>>= (UCHAR)i;
if(sub>= psub) //取差值
temp= sub- psub;
else
temp= psub- sub;
if(temp> LARGE) //大弯道
{
ret= 0x21;
while(Roads[i].road!= 0)
{
i++;
*number2= i;
if(i> 9)
break;
}
goto _RET;
}
if(temp> LITTLE) //小弯道
{
ret= 0x11;
while(Roads[i].road!= 0)
{
i++;
*number2= i;
if(i> 9)
break;
}
goto _RET;
}
*number2= i;
psub= sub;
}
_RET:
return ret;
}

void CarRun(UCHAR number1, UCHAR number2, UCHAR ret)
{
int end= Roads[number2].road;
Turn(number2- number1, end- 0x100, Roads[number2].LeftRight, ret); //舵机函数
IRQCR_IRQEN= 1; //开IRQ
}
下面为舵机头文件:
//TurnAround.h
#ifndef _TURNAROUND_H_ //头文件保护
#define _TURNAROUND_H_

void Turn(unsigned char, unsigned int, unsigned char, unsigned char); //转角函数
void PWMInit(); //优先初始化

#endif

再以下为实现文件:(表内容待实验后求得)
//TurnAround.c
#include <hidef.h> /* common defines and macros */
#include <MC9S12XS128.h> /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12xs128"
#include "TurnAround.h"
#include "..." //直流电机

#ifndef ULONG
#define ULONG unsigned long
#define UCHAR unsigned char
#define UINT unsigned int
#endif

/////////////////////////转角定义
#define RIGHT60 1083
#define RIGHT45 1000
#define RIGHT30 917
#define RIGHT15 833
#define RIGHT5 778

#define MIDDLE 750

#define LEFT5 722
#define LEFT15 667
#define LEFT30 583
#define LEFT45 500
#define LEFT60 417

/////////////////////////速度定义
#define SPEED0 //直线速度
#define SPEED5
#define SPEED15
#define SPEED30
#define SPEED45
#define SPEED60

//PWM查询表 7*10*2
static UINT PWMTable[]=
{
//Left
LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60,
LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60,
LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60,
LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60,
LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60,
LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60,
LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60,
//Right
RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60,
RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60,
RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60,
RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60,
RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60,
RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60,
RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60
};

//延时查询表 6*6
static UNIT DelayTable[]=
{
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0
}

void PWMInit() //32HHz
{
PWMCTL_CON01= 1; //0, 1合为16bit
PWMCAE_CAE1= 1; //Center mode
PWMCLK_PLCK1= 0; //Clock A
PWMPRCLK_PCKA= 5; //Clock A= 32MHz/32= 1MHz
PWMPOL_PPOL1= 0; //开始为低电压
PWMPER0,1= 10000; //50Hz PWM输出
PWMDTY0,1= MIDDLE; //(10000- 750)* 100%= 92。5%占空比,1.5ms高电压时间
PWME_PWME1= 1; //enable
}

static void delay(int ms)
{
int ii,jj;
if (ms<1) ms=1;
for(ii=0;ii<ms;ii++)
for(jj=0;jj<2770;jj++); //32MHz--1ms
}

static void SetPWM(UINT m_nPWM) //PWM设置
{
PWMDTY0,1= m_nPWM;
}

//number 9种情况,sub 7种情况,LeftRight 2中情况
//共128种情况,采用模糊控制暂时归纳为11种情况
//11种情况将填入表中提供查询,11中情况分别为:
//左右5, 15, 30, 45, 60度
//和正中间0度
static UINT GetPWM(UCHAR number, UINT sub, UCHAR LeftRight)
{
switch(sub) //通过sub算出索引值
{
case 0x8000- 0x0100:
case 0x0100- 0x0001;
case 0x0100- 0x0002;
sub= 0;
break;
case 0x4000- 0x0100:
case 0x0100- 0x0004:
sub= 1;
break;
case 0x2000- 0x0100:
case 0x0100- 0x0008:
sub= 2;
break;
case 0x1000- 0x0100:
case 0x0100- 0x0010:
sub= 3;
break;
case 0x0800- 0x0100:
case 0x0100- 0x0020:
sub= 4;
break;
case 0x0400- 0x0100:
case 0x0100- 0x0040:
sub= 5;
break;
case 0x0200- 0x0100:
case 0x0100- 0x0100:
case 0x0100- 0x0080:
sub= 6;
break;

}
return PWMTable[number+ sub* 10+ LeftRight* 70];
}

//通过m_nPWM来改变速度,并返回改变的值
static UINT ChangeSpeed(UINT m_nPWM)
{
UINT m_nSpeed;
switch(m_nPWM) //根据m_nPWM 调节速度
{
case LEFT60:
Speed(SPEED60);
m_nSpeed= SPEED60;
break;
case LEFT45:
Speed(SPEED45);
m_nSpeed= SPEED45;
break;
case LEFT30:
Speed(SPEED30);
m_nSpeed= SPEED30;
break;
case LEFT15:
Speed(SPEED15);
m_nSpeed= SPEED15;
break;
case LEFT5:
Speed(SPEED5);
m_nSpeed= SPEED5;
break;
case MIDDLE:
Speed(SPEED0);
m_nSpeed= SPEED0;
break;
case RIGHT60:
Speed(SPEED60);
m_nSpeed= SPEED60;
break;
case RIGHT45:
Speed(SPEED45);
m_nSpeed= SPEED45;
break;
case RIGHT30:
Speed(SPEED30);
m_nSpeed= SPEED30;
break;
case RIGHT15:
Speed(SPEED15);
m_nSpeed= SPEED15;
break;
case RIGHT5:
Speed(SPEED5);
m_nSpeed= SPEED5;
break;
}
return m_nSpeed;
}

//获得查表时的索引值
UINT GetIndex(UINT m_nSpeed)
{
if(m_nSpeed<= SPEED60)
{
m_nSpeed= 0;
}
else if(m_nSpeed<= SPEED45)
{
m_nSpeed= 1;
}
else if(m_nSpeed<= SPEED30)
{
m_nSpeed= 2;
}
else if(m_nSpeed<= SPEED15)
{
m_nSpeed= 3;
}
else if(m_nSpeed<= SPEED5)
{
m_nSpeed= 4;
}
else
{
m_nSpeed= 5;
}
return m_nSpeed;
}

//m_nSpeed2为欲设值
//m_nSpeed为当前速度
UINT GetDelay(UINT m_nSpeed, UINT m_nSpeed2)
{
m_nSpeed= GetIndex(m_nSpeed);
m_nSpeed2= GetIndex(m_nSpeed2);
return DelayTable[m_nSpeed* 6+ m_nSpeed2];
}

void Turn(UCHAR number, UINT sub, UCHAR LeftRight, UCHAR ret)//ret not be used now
{
UINT m_nPWM;
UINT m_nSpeed;
UINT m_nSpeed2;
UINT m_nDelay; //延时参数
m_nPWM= GetPWM(number, sub, LeftRight);
m_nSpeed= GetSpeed() //测速模块
m_nSpeed2= ChangeSpeed(m_nPWM);
if(m_nSpeed2> m_nSpeed)
m_nSpeed= m_nSpeed2- m_nSpeed;
else
m_nSpeed= m_nSpeed- m_nSpeed2;
SetPWM(m_nPWM); //转角
m_nDelay= GetDelay(m_nSpeed, m_nSpeed2);
delay(m_nDelay); //根据速度和角度延时
SetPWM(MIDDLE); //舵机摆正
}
最后说哈,程序只差调试就可以,筐架就是这。我是湖北赛区的,7月就要比赛了,他们车还没做好啊。

9. 飞思卡尔 mc9s12xs128 单片机 怎样才可以 在EPROM 或者在 FASH 中 保存运行的参数

有相关资料可以参考的,你搜一下flash to epprom相关资料:
用Flash模拟EEPROM
本程序利用S08系列单片机的片内Flash模拟EEPROM。解决部分8位机没有EEPROM导致在运用上的局限。本程序提供一个初始化函数和三个功能函数。用户必须在调用功能函数前调用调用初始化函数。三个功能函数分别是字节写入、字节读取、EEPROM全擦除。用户必须保证调用功能函数前有至少30Bate的栈空间。
本程序参考飞思卡尔公司提供的《在 HCS08 微控制器上使用 FLASH 存储器模拟 EEPROM》。并在源程序的基础上精简了部分功能,减少了RAM使用量。并尝试使用分页机制确定EEPROM地址。
接口函数的EEPROM地址寻址由页地址和页内偏移量组成。即把用户定义的EEPROM分为若干个大小为256字节的页。其地址与FLASH地址的换算关系为:
FLASH真实地址=EEPROM空间起始地址+页地址×256+页内偏移地址
用户在使用EEPROM是只用确定数据保存在EEPROM的相对地址即可。接口函数原型为:
EEPROM_WRITE_DATA(数据,页地址, 页内偏移地址);
Char EEPROM_READ_DATA(页地址, 页内偏移地址);

1. 程序流程分析与设计。
由于S08系列单片机在Flash写入时序中不能进行任何的Flash读操作,Flash写入指令必须放到RAM中执行并关闭所有可屏蔽中断。程序流程如图13-1-?。

字节写入/.全擦除程序流程 字节读取程序流程
图13-1-?
2.程序源代码。此程序在CodeWarrior 6.0继承编译环境中编译通过

/*****************************************************/
//河南工业大学Freescale MCU&DSP联合实验室
// 文件名:flash_program.h
// CPU :MC9S08AW60
// 版 本:v1.0
// 日 期:2008年8月12日
// 调试环境:CodeWarrior 6.0
// 作 者:曾 滔
// 描 述: 头文件,用于保存初始化EEPROM设定、用户定制参数、编译器参数等信息。
/*****************************************************/
#include <hidef.h>
#include "derivative.h"
#include <stdio.h>

/*************flash编程指令(请勿改动)*****************/
#define BLACK_CHECK 0x05 //查空指令
#define BITE_PROGRAM 0x20 //字节编程指令
#define BURST_PROGRAM 0x25 //快速编程指令
#define PAGE_ERASE 0x40 //页擦除指令(1页=512字节)
#define MASS_ERASE 0x41 //全擦除指令

/******用户定制参数(根据单片机型号和用户flash使用情况定制)**********/
#define EEPROM_START_ADDRESS 0xE000 //EEPROM区起始地址。512B的倍数
#define EEPROM_PAGE_NUM 8 //EEPROM页数。1page=256B
#define BUS_FREQUENCY 2000 //总线频率。单位(KHz)

/********************编译器相关参数**************************/
#define INT8U unsigned char //无符号字节变量。根据编译器更改。默认CodeWarrior 6.0
#define INT16U unsigned short int //无符号字变量。根据编译器更改。默认CodeWarrior 6.0
/***********EEPROM API函数原型***********/
//初始化程序。此函数必须在使用EEPROM前调用。建议用户在系统初始化是调用。
void INIT_EEPROM(void);
//EEPROM擦除函数。擦除所有EEPROM数据。
void EEPROM_ERASE(void);
//EEPROM字节写入函数。写入一个字节到EEPROM指定区域。
void EEPROM_WRITE_DATA(INT8U data,INT8U EEPROM_page,INT8U offset_address)
//EEPROM读出函数。读出一个指定的区域所保存的字节的到函数返回值。
char EEPROM_READ_DATA(INT8U EEPROM_page,INT8U offset_address);
/****************************END************************************/

/*****************************************************/
//河南工业大学Freescale MCU&DSP联合实验室
// 文件名:flash_program.c
// C P U :MC9S08AW60
// 版 本:v1.0
// 日 期:2008年8月12日
// 调试环境:CodeWarrior 6.0
// 作 者:曾 滔
// 描 述:提供了一个初始化函数和三个功能函数供用户调用,没有可更改参数。
/*****************************************************/
#include "flash_program.h"

const INT8U FLASH_CODE[]={ // ; flash操作代码
0x45, 0x18, 0x26, // LDHX #$1826 ; FCMD地址写入H:X
0xA6, 0x00, // LDA #$00 ; 0x00为命令占位符
0xF7, // STA ,X ; 将命令写入FCMD命令缓存器
0x5A, // DECX ; 指针指向 FSTAT
0xF6, // LDA ,X ;
0xAA, 0x80, // ORA #$80 ;
0xF7, // STA ,X ; 置位FSTAT_FCBEF。启动flash写入命令
0xF6, // LDA ,X ; 等待3个时钟周期(请勿删除此代码)
0xF6, // LDA ,X ; 读取FSTAT
0xA5, 0x30, // BIT #$30
0x26, 0x05, // BNE *+6 ; 错误则返回
//LOOP
0xF6, // LDA ,X ; 等待写操作结束
0xA5, 0x40, // BIT #$40
0x27, 0xFB, // BEQ *-3 ; 跳转到LOOP
//EXIT:
0X81 //RTS ; 返回
};
/*********************初始化函数**********************************/
#if BUS_FREQUENCY >= 12000
void INIT_EEPROM(void){FCDIV=(((BUS_FREQUENCY/(8*175)))|0x40)-1;}
#endif
#if BUS_FREQUENCY < 12000
void INIT_EEPROM(void){FCDIV=(BUS_FREQUENCY/175)-1;}
#endif

/***********************EEPROM字节写入函数****************************/
void EEPROM_WRITE_DATA(INT8U data,INT8U EEPROM_page,INT8U offset_address)
{

INT16U address; //存放写入地址
INT8U code_space[23]; //初始化代码空间

if(EEPROM_page>=EEPROM_PAGE_NUM)return; //地址错误返回,保护用户代码
address=offset_address+EEPROM_page*256+EEPROM_START_ADDRESS; //地址转化
(void)memcpy(code_space,FLASH_CODE,23); //复制flash操作代码到RAM

code_space[4] = BITE_PROGRAM; //修改命令占位符为写入命令

DisableInterrupts; //关中断
if (FSTAT&0x10){ //清错误标志
FSTAT = FSTAT|0x10;
}
_asm
{ //写入初始化
LDHX address;
LDA data;
STA ,X; //写入缓存
TSX;
JSR 2,x; //跳入RAM执行
}
EnableInterrupts; //开中断
__RESET_WATCHDOG();
}

/********************EEPROM字读取入函数********************************/
char EEPROM_READ_DATA(INT8U EEPROM_page,INT8U offset_address){

unsigned short int address; //地址变量
char rusult; //数据变量
address=offset_address+EEPROM_page*0x100+EEPROM_START_ADDRESS; //地址转换
asm{
LDHX address;
LDA ,X; //读取地址到数据变量
STA rusult;
}
__RESET_WATCHDOG();
return(rusult); //返回
}

/**********************EEPROM擦除函数********************************/
void EEPROM_ERASE(void)
{
INT16U address;
INT8U i; //循环变量
INT8U code_space[23];

for(i=0;i<(EEPROM_PAGE_NUM/2);i++){ //分页擦除

address=i*0x200+EEPROM_START_ADDRESS;

(void)memcpy(code_space,FLASH_CODE,23); //复制flash操作代码到RAM

code_space[4] = PAGE_ERASE; //修改命令占位符为擦除命令

DisableInterrupts; //关中断

if (FSTAT&0x10){ //清错误标志
FSTAT = FSTAT | 0x10;
}
_asm
{
LDHX address; //擦除地址写入缓存
STA ,X;
TSX;
JSR 3,x; //跳入RAM执行
}
EnableInterrupts; //开中断
__RESET_WATCHDOG();
}
}
/****************************END************************************/

/*****************************************************/
// 版权所有(c)河南工业大学
// 文件名:mian.c
// C P U :MC9S08AW60
// 版 本:v1.0
// 日 期:2008年8月12日
// 调试环境:CodeWarrior 6.0
// 作 者:曾 滔
// 描 述: 测试Flash模拟EEPROM程序。
/*****************************************************/
#include <hidef.h>
#include "derivative.h"
#include "flash_program.h"

void main(void){
char temp;
PTADD=0XFF;

INIT_EEPROM(); //初始化Flash控制寄存器。
do{
EEPROM_WRITE_DATA(88,0,0); //写入一个字节。
temp=EEPROM_READ_DATA(0,0); //读取一个字节
}while(temp!=88); //若写入失败则再次写入
PTAD_PTAD0=1;

do{
EEPROM_ERASE();
}while(EEPROM_READ_DATA(0,0)!=0xff); //擦除Flash

PTAD_PTAD1=1;
for(;;)__RESET_WATCHDOG(); //死循环
}

10. 飞思卡尔烧写器连接不是上是什么原因

当初我也碰到这样的情况,你先检查看看是不是你的硬件的下载线断了或者没有连接上,或者这四根线接反了。一切正常的话,烧写器上的两个LED灯会亮的。

阅读全文

与飞思卡尔读取未加密程序相关的资料

热点内容
程序员放弃后会怎样 浏览:182
河北模具编程 浏览:187
adb查找命令 浏览:321
安卓手机视频文件夹怎么打开 浏览:309
平板加密手机后怎么关闭 浏览:566
流媒体服务器应该注意什么 浏览:536
d8命令编译 浏览:964
压缩包解压需要多少空间 浏览:145
如何查找app属性 浏览:388
android人脸识别技术 浏览:320
pc104编程 浏览:335
二维码反编译破解推广 浏览:682
修改服务器的mac地址 浏览:528
好玩的编程软件 浏览:899
编程语言创始人有钱吗 浏览:804
短视频app怎么获客 浏览:15
查看云服务器的应用 浏览:435
javadump工具 浏览:564
程序员16g 浏览:444
程序员没有办法成为top怎么办 浏览:218