飞思卡尔单片机里面的flash、RAM和数据flash是怎么存储数据和程序的?是不是flash存储运行程序,

飞思卡尔单片机里面的flash、RAM和数据flash是怎么存储数据和程序的?是不是flash存储运行程序,,第1张

现贺罩碰在单片机中其实flash代替了rom,禅谈你写的程序编译成hex或bin文件烧录到flash里。当单片机运行程序时候,程序里的变量等数据会从flash拷贝到ram中,然后闷散开始运行。

有相关资料可以参考的,你搜一下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_ERASE0x40 //页擦除指令(1页=512字节)

#define MASS_ERASE0x41 //全擦除吵销指令

/******用户定制参数(根据单片机型号和用户flash使用情况定制)**********/

#define EEPROM_START_ADDRESS0xE000 //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=0i<(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() //死循环

}

关于飞思卡尔的面试

2008-03-18 18:16可能不是很正式吧,很多题目用的是贝尔的原题

现在突然想起来了,摘两段,不要弄得出见过的题目还不会做~

C++/C试题

本试题仅用于考查C++/C程序员的培念基本编程技能。内容限于C++/C常用语法,不涉及数据结

构、算法以及深奥的语法。考试成绩能反映出考生的编程质量以及对C++/C的理解程度,但

不能反映考生的智力和软件开发能力。

笔试时间90分钟。请考生认真答题,切勿轻视。

一、请填写BOOL , float, 指针变量 与“零值”比较的 if 语句。(10分)

提示:这里“零值”可以是0, 0.0 , FALSE或者“空指针”。例扒中贺如 int 变量 n 与“零值

”比较的 if 语句为:

if ( n == 0 )

if ( n != 0 )

以此类推。

请写出 BOOL flag 与“零值”比较的 if 语句:

请写出 float x 与“零值”比较的 if 语句:

请写出 char *p 与“零值”比较的 if 语句:

二、以下为Windows NT下的32位C++程序,请计算sizeof的值(10分)

char str[] = “Hello” char *p = str int n = 10请计算sizeof (str )

= sizeof ( p ) = sizeof ( n ) = void Func (

char str[100]){请计算 sizeof( str ) = }

void *p = malloc( 100 )请计算sizeof ( p ) =

三、简答题(25分)

1、头文件中的 ifndef/define/endif 干什么用?

2、#include 和 #include “filename.h” 有什么区别?

3、const 有什么用途?(请至少说明两种)

4、在C++ 程序中调用被 C编译器编译后的函数,为什么要加 extern “C”声明?

5、请简述以下两个for循环的优缺点

// 第一个for (i=0i ing()} // 第二个if (condition){for (i=0i for (i=0i 优点:缺点: 优点:缺点:

四、有关内存的思考题(20分)

void GetMemory(char *p){p = (char *)malloc(100)}void Test(void) {char *str =

NULLGetMemory(str)strcpy(str, "hello world")printf(str)}请春派问运行Test函数会

有什么样的结果?答: char *GetMemory(void){ char p[] = "hello world"return p

}void Test(void){char *str = NULLstr = GetMemory()printf(str)}请问运行Test

函数会有什么样的结果?答:

Void GetMemory2(char **p, int num){*p = (char *)malloc(num)}void Test(void){c

har *str = NULLGetMemory(&str, 100)strcpy(str, "hello")printf(str)}请问运

行Test函数会有什么样的结果?答: void Test(void){char *str = (char *) malloc(1

00)strcpy(str, “hello”)free(str)if(str != NULL) { strcpy(str, “

world”)printf(str)}}请问运行Test函数会有什么样的结果?答:

五、编写strcpy函数(10分)

已知strcpy函数的`原型是

char *strcpy(char *strDest, const char *strSrc)

其中strDest是目的字符串,strSrc是源字符串。

(1)不调用C++/C的字符串库函数,请编写函数 strcpy

(2)strcpy能把strSrc的内容复制到strDest,为什么还要char * 类型的返回值?

六、编写类String的构造函数、析构函数和赋值函数(25分)

已知类String的原型为:

class String

{

public:

String(const char *str = NULL)// 普通构造函数

String(const String &other)// 拷贝构造函数

~ String(void)// 析构函数

String &operate =(const String &other)// 赋值函数

private:

char *m_data// 用于保存字符串

}

请编写String的上述4个函数。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12545156.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存