mc9s12xs128内存映射和数据flash操作

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

解答
16位地址,寻址范围为0~65536,即64k MC9S12XS128的RAM为8K,P-FLASH为 128K,D-FLASH为8K。

*p=0x8000,访问的是P-FLASH

MC9S12XS128内存结构


MC9S12XS128使用global adress(全局地 址)对内存划分地址空间。全局地址共 23bit,寻址能力达到8M 使用全局地址划分的内存空间如下: 0x10_0000~0x10_1FFF:8K d-flash 0x7E_0000~0x7F_FFFF:128K p-flash 0x0F_E000~0x0F_FFFF:8K 非分页RAM 问题:CPU和BDM都是使用16bit local address(本地地址)我们在程序中定义的 指针变量默认都是near型,即16位地址, 如何解决?
D-flash状态寄存器
注意: 1. 开始新的FLASH命令之前必须等待上 一个命令结束,即需要查询CCIF标志。 2. 在启动flash命令之前,FSTAT寄存器中 的ACCERR和FPVIOL两个标志位必须 被清除,否则无法启动新的FLASH操 作。

完整的擦除操作
while(FSTAT_CCIF==0); if(FSTAT_ACCERR) //判断并清除标志位; FSTAT_ACCERR=1; if(FSTAT_FPVIOL) //判断并清除标志位; FSTAT_FPVIOL=1; FCCOBIX_CCOBIX=0x00; FCCOBHI=0x12; //高字节写入擦除命令 FCCOBLO=0x10; //低字节d-flash全局地址高8位,固定 为0x10 FCCOBIX_CCOBIX=0x01; FCCOB=ADDR16; //写入低16位的地址 FSTAT_CCIF=1; //启动执行命令 while(FSTAT_CCIF==0); //等待执行完成
D-flash擦除扇区操作
由于一个flash单元不能重复写入,写入之前需 要先擦除。 扇区(sector)是擦除操作的最小单位,一个 d-flash扇区大小为256个字节 擦除的命令字为0x12,并给出一个全局地址, flash控制器将擦除该地址所在的扇区中的所有 单元,擦除后所有bit都为1。
分页地址映射
MC9S12XS128使用分页地址映射的方法,在程序 中使用16位地址访问更大的存储空间。 访问RAM

访问D-FLASH 访问P-FLASH
◦ 使用地址0x2000 ~0x3FFF,访问8K RAM
◦ 使用地址0x0800 ~ 0x0BFF,访问1K D-FLASH(一个DFLASH页)
R
W Reset CCIF
0
1
0
0
0
0
0
0
0
D-flash状态寄存器




该寄存器主要用于查询flash操作的状态,也可启动新的flash操作,详细如下。 CCIF、ACCERR、FPVIOL可读也可写入,MGBUSY、MGSTAT只可读,不可写入 CCIF:命令结束中断标志位,用于指示flash命令结束。向该位写1可清0并启动一个flash命令。 在命令执行过程中该位一直保持为0直到命令结束或命令冲突。 1:flash命令执行完毕 0:flash命令正在执行过程中 ACCERR:flash访问错误标志。该位用于指示对flash存储器的非法访问,当该位置1时,CCIF 标志不可被清0并启动新的flash命令。向该位写1可清除该位,写0无效。 1:检测到访问错误 0:没有检测到访问错误 FPVIOL:flash保护冲突标志位。该位用于指示在flash命令序列执行过程中发生了对被保护的 p-flash或d-flash区域的写入或擦除操作。向该位写1可清除该位,写0无效。当该位被置1时, 不可启动新的命令或写入操作。 1:出现保护冲突错误 0:未出现保护冲突错误 MGBUSY:存储器控制器忙标志位。该位用于指示存储器控制器的状态。 1:存储器控制器正忙 0:存储器控制器空闲 RSVD:保留位,一直为0 MGSTAT[1:0]:存储器控制器命令完成状态标志。这两位用于指示在执行命令过程中或复位 时出现的错误。
设置命令字和相关参数
D-flash操作是通过FCCOB寄存器向存 储器控制器提供命令码和相关参数实现 的。用户首先需要初始化所需的 FCCOB寄存器。 FCCOB是一个6个16位的寄存器组,并 通过FCCOBIX寄存器指示当前操作的 FCCOB寄存器地址。

FCCOB寄存器格式
CCOBIX[2:0]索引值 000 字节 高8位 低8位 001 高8位 低8位 010 高8位 低8位 011 高8位 低8位 100 高8位 低8位 101 高8位 低8位 FCCOB 寄存器参数域 FCMD[7:0] 定义flash操作命令 0, Global address [22:16] 全局地址22-16位 Global address [15:8] 全局地址15-8位 Global address [7:0] 全局地址7-0位 Data 0 [15:8] Data 0 [7:0] Data 1 [15:8] Data 1 [7:0] Data 2 [15:8] Data 2 [7:0] Data 3 [15:8] Data 3 [7:0]

FCCOBIX_CCOBIX=0x00; FCCOBHI=0x12; //高字节写入擦除命令 FCCOBLO=0x10; //低字节d-flash全局地址高8位,固定 为0x10 FCCOBIX_CCOBIX=0x01; FCCOB=ADDR16; //写入低16位的地址
D-FALSH写入操作

◦ 使用地址0x8000 ~0xBFFF,访问16K P-FLASH(一个PFLASH页) 我们程序中的指针指向不同的地址范围,访问的内存空 间也不同。 问题?如何访问8k的d-flash空间和128k的p-flash空间

分页地址映射


MC9S12XS128的FLASH存储区是分页组织的 以D-FLASH为例,共分8个页面,每页1K大小, 地址如下: EEPROM_00 0x00_0800 TO 0x00_0BFF; EEPROM_01 0x01_0800 TO 0x01_0BFF; EEPROM_02 0x02_0800 TO 0x02_0BFF; EEPROM_03 0x03_0800 TO 0x03_0BFF; EEPROM_04 0x04_0800 TO 0x04_0BFF; EEPROM_05 0x05_0800 TO 0x05_0BFF; EEPROM_06 0x06_0800 TO 0x06_0BFF; EEPROM_07 0x07_0800 TO 0x07_0BFF;
设置flash模块时钟

初始化flash模块是必须设置fclk,且为1MHz,fclk是有晶振时钟分频 而来, Flash控制模块使用该时钟实现flash写入和擦除时的定时,通 过设置FCLKDIV寄存器完成。
7 6 5 4 3 2 1 0 FDIVLD FDIV[6:0] 0 0 0 0 0 0 0 0
MC9S12XS128内存映射和 数据flash操作
北京联合大学实训基地——潘峰 QQ:66797490
问题
内部地址总线宽度为16位,寻址范围有多 大? MC9S12XS128的RAM,P-FLASH,D-FLASH各 有多大? 在程序中给出如下定义 unsigned int *p; p=0x8000; data=*p; 这上面这段代码中,访问的是哪一块存储 区域?
RFDIV[6:0]可写入。 FDIVLD:时钟分频载入 1:从上一次复位开始,FCLKDIV寄存器已写入。 0:FCLKDIV寄存器还未写入。 当晶振频率为16M时,FDIV设置为0x0F。当晶振频率为其它值时,具体设置 参考数据手册。 *注意:1.在flash命令执行过程中,FDIV不可被写入 2.只有FDIVLD==1时,才可以进行flash操作
访问D-FLASH
当访问d-flash时,地址由页地址和页内偏移量组 成 页地址由EPAGE寄存器指定 页内偏移量范围0x0800~0x0BFF; 例如,读出第0页的第一个存储单元一个字的信 息,代码如下: unsigned int data; EPAGE=0x00; data=((unsigned int)(*(volatile unsigned int *__near)(0x0800)))
D-FALSH写入操作

也可以只写入一个字 FCCOBIX_CCOBIX=0x00; FCCOB=0x1110; //写入命令和高位 地址 FCCOBIX_CCOBIX=0x01; //地址后16位 FCCOB=ADDR16; //写入低16位地址 FCCOBIX_CCOBIX=0x02; //写入第一个 数据 FCCOB=data;
Flash状态寄存器和flash命令的启动
清除d-flash状态寄存器中的CCIF标志即可将 FCCOB寄存器中的flash操作命令和相关参数传递 给flash控制器并启动操作。 D-flash状态寄存器格式如下:

7 6 5 4 3 MGBUSY ACCERR FPVIOL 2 RSVD 1 MGSTAT 0

D-FLASH常见操作

D-FLASH是一种非易失性存储器(NVM) 用于保存掉电后不会丢失的数据 常用操作有读、擦除、写入,其中读操 作可直接通过指针读取,而擦除和写入 则需要通过flash控制器完成,具体步骤 如下: 1. 设置flash模块时钟 2. 设置命令字和相关参数 3. 将命令字和相关参数传递给flash控制 器,启动flash操作
写入的命令字为0x11,并给出一个全局地址和需要写入 的字,一次最多可写入4个字。 FCCOBIX_CCOBIX=0x00; FCCOB=0x1110; //写入命令和高位地址 FCCOBIX_CCOBIX=0x01; //地址后16位 FCCOB=ADDR16; //写入低16位地址 FCCOBIX_CCOBIX=0x02; //写入第一个数据 FCCOB=Buffer[0]; FCCOBIX_CCOBIX=0x03; //写入第二个数据 FCCOB=Buffer[1]; FCCOBIX_CCOBIX=0x04; //写入第三个数据 FCCOB=Buffer[2]; FCCOBIX_CCOBIX=0x05; //写入第四个数据 FCCOB=Buffer[3];
相关文档
最新文档