查看: 6074|回复: 13

[S12] 请帮忙看看程序,9s12HY PFLASH的全局地址和逻辑地址和物理地址?

[复制链接]

该用户从未签到

2

主题

25

帖子

0

注册会员

Rank: 2

积分
64
最后登录
2020-8-13
发表于 2011-9-19 19:56:05 | 显示全部楼层 |阅读模式
一直不是很清楚逻辑地址、全局地址和物理地址之间的关系,这里向各位大大请教。我用的是9s12hy48,程序大概20多k。需要将存储区一块12k的空间单独拿出来,用以存储点阵信息,这个需要是可变的,不过擦写次数不会很频繁。先用D-FLASH实验,是好的。
    DFlash擦写时使用地址0x4400,调用的时候 用 uint8    *disa;  disa = (uint8*)0x10400;  可以实现功能,不过就是DFLASH只有4k,太小。(擦写时用地址0x4400,而调用时要用地址0x10400,这之间什么关系?)
  
但是我换用PFLASH时,就不行了。我先定义一个数组:
const uint8  Disf[10000] @0xe8000  =  {0x00,0x11,0x22,0x33,0x00,0xff,0x00,0xff,0x00,0xff};  然后按地址 0x38000擦写,不成功?
请问按是不是按页地址的话就是写PPAGE = 0e   再写0x8000?我真是不知道他们之间的关系,请大侠帮忙看看程序,程序如下:
#include "main.h"
#include "config.h"
#include "flash.h"
#define FLASH_GLOBAL_ADDRESS     0x4400
#define FLASH_PHYSICAL_ADDRESS  0x10400
#define PFLASH_GLOBAL_ADDRESS     0x8000
#define PFLASH_PHYSICAL_ADDRESS  0xe8000
#define PFLASH_CMD_ERASE_VERITY  0x0303              // 命令码 + HI地址
#define PFLASH_CMD_WRITE                   0x0603             // 命令码 + HI地址
#define PFLASH_CMD_ERASE                   0x0a03            // 命令码 + HI地址
#define FLASH_CMD_ERASE_VERITY    0x1000
#define FLASH_CMD_WRITE                    0x1100
#define FLASH_CMD_ERASE                   0x1200
//#pragma MESSAGE DISABLE C2705
//#pragma 0x34000    //OTHER_ROM1
 /******************************************************************************
功    能:void FLASH_Init(void)
描    述:FLASH初化
参    数: 无
返    回:无
******************************************************************************/
//static void Cpu_FlashInit(void)
void Cpu_FlashInit(void)
{
  FSTAT   = 0x30;     /* clear ACCERR & FPVIOL flag in flash status register */
  FERSTAT = 0x03;     /* clear DFDIF,SFDIF & EPVIOLIF flag in flash error status register */
  FCNFG   = 0x10;     /* Set the ignore single bit fault value, so that the single bit faults are ignored */
  if(!FCLKDIV_FDIVLD) /* clock not set */
  {
      FCLKDIV = 0x44;
  }
}

/******************************************************************************
功    能:void FLASH_EraseVerify(uint16 frist_add)
描    述:擦除校验P-FLASH
参    数: 无
返    回:无
******************************************************************************/
void PFLASH_EraseVerify(uint16 frist_add)
{   
  while(!FSTAT_CCIF);                             // check CCIF bit
  FSTAT   = 0x30;
                                                  // clear ACCERR and FPVIOL bits
  FCCOBIX = 0;
  FCCOB   = PFLASH_CMD_ERASE_VERITY;              // 命令码 + 地址高
  FCCOBIX = 1;
  FCCOB   = frist_add+PFLASH_GLOBAL_ADDRESS;
 
  PPAGE = 0x0d;
 
  FSTAT_CCIF = 1;                                  // clear CCIF bit               
  while(!FSTAT_CCIF);                              // check CCIF bit    
}
/******************************************************************************
功    能:void PFLASH_Erase(void)
描    述:擦除PFLASH
参    数: 无
返    回:无
******************************************************************************/
void PFLASH_Erase(uint16 frist_add)
{   
  while(!FSTAT_CCIF);                            // check CCIF bit /
  FSTAT   = 0x30;                                // clear ACCERR and FPVIOL bits /
                                                 
  FCCOBIX = 0;
  FCCOB   = PFLASH_CMD_ERASE;                    // 命令码 + 地址高
  FCCOBIX = 1;
  FCCOB   = frist_add + PFLASH_GLOBAL_ADDRESS;   //
 PPAGE = 0x0d;
 
//FSTAT = 0xFF;
  FSTAT_CCIF = 1;                               // clear CCIF bit /              
  while(!FSTAT_CCIF);                           // check CCIF bit /   
}
/******************************************************************************
功    能:void PFLASH_Write(uint16 frist_add,uint16 *pdata)
描    述:写P-FLASH
参    数: 无
返    回:无
******************************************************************************/
void PFLASH_Write(uint16 frist_add,uint16 *pdata)
{
  uint16 command_array[6];
  uint8 i; 
 
//  FSEC = 0x82;
//  FPROT = 0xA8;     // 不保护
 
  command_array[0] = PFLASH_CMD_WRITE;
  command_array[1] = frist_add + PFLASH_GLOBAL_ADDRESS;
  command_array[2] = *pdata++;           
  command_array[3] = *pdata++;
  command_array[4] = *pdata++;
  command_array[5] = *pdata++;             
  while(!FSTAT_CCIF);                // check CCIF bit
  FSTAT   = 0xFF;                    // clear ACCERR and FPVIOL bits    
 
  for(i=0;i
我知道答案 目前已有12人回答
回复

使用道具 举报

该用户从未签到

2

主题

25

帖子

0

注册会员

Rank: 2

积分
64
最后登录
2020-8-13
 楼主| 发表于 2011-9-20 16:21:25 | 显示全部楼层

RE:请帮忙看看程序,9s12HY PFLASH的全局地址和逻辑地址和物理地址?

或者说我想在PFLASH区开一个数组空间,我该如何对其读和写?擦写和引用的地址如何定,PRM文件该如何定义?请知道的能不吝指教,谢谢了。

该用户从未签到

2

主题

25

帖子

0

注册会员

Rank: 2

积分
64
最后登录
2020-8-13
 楼主| 发表于 2011-9-21 08:22:14 | 显示全部楼层

RE:请帮忙看看程序,9s12HY PFLASH的全局地址和逻辑地址和物理地址?

唉,
  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2011-9-21 11:44:18 | 显示全部楼层

    RE:请帮忙看看程序,9s12HY PFLASH的全局地址和逻辑地址和物理地址?

    首先PFLASH的只是在页0x3_8000到0x3_FFFF之间,而又是16位总线的方式,操作不同于DFLASH,你对这段代码之间的地址操作可以了。不用考虑也地址。如果超过这个区域,操作就要安装DFLASH的步骤了。
    该会员没有填写今日想说内容.

    该用户从未签到

    2

    主题

    25

    帖子

    0

    注册会员

    Rank: 2

    积分
    64
    最后登录
    2020-8-13
     楼主| 发表于 2011-9-22 12:30:32 | 显示全部楼层

    RE:请帮忙看看程序,9s12HY PFLASH的全局地址和逻辑地址和物理地址?

    o ,谢谢。我定义的数组在0x8000,然后擦除0x38000确实是把该数组擦出了,可就是写不进去?写入的东西在整个地址空间都搜索不到。
  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2011-9-22 14:58:20 | 显示全部楼层

    RE:请帮忙看看程序,9s12HY PFLASH的全局地址和逻辑地址和物理地址?

    首先确定,你的芯片DFLASH的范围。是否存在0x8000。
    该会员没有填写今日想说内容.

    该用户从未签到

    2

    主题

    25

    帖子

    0

    注册会员

    Rank: 2

    积分
    64
    最后登录
    2020-8-13
     楼主| 发表于 2011-9-22 16:51:58 | 显示全部楼层

    RE:请帮忙看看程序,9s12HY PFLASH的全局地址和逻辑地址和物理地址?

    谢谢斑竹。是standard setting 某个设置什么时候改动过了,改过来就可以写了。不过只能单步工作,连续工作时就跳出去了,堆栈不对了。
  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2011-9-22 17:21:01 | 显示全部楼层

    RE:请帮忙看看程序,9s12HY PFLASH的全局地址和逻辑地址和物理地址?

    哪个程序跳出了?
    该会员没有填写今日想说内容.

    该用户从未签到

    2

    主题

    25

    帖子

    0

    注册会员

    Rank: 2

    积分
    64
    最后登录
    2020-8-13
     楼主| 发表于 2011-9-22 18:17:56 | 显示全部楼层

    RE:请帮忙看看程序,9s12HY PFLASH的全局地址和逻辑地址和物理地址?

    擦除和写都会跳出来,但是肯定是执行了擦除或写入了之后,返回时出的问题。因为跳出后可以看到此步已经执行,单步走的话就没有问题。
    是不是执行 FSTAT_CCIF = 1;后的while(!FSTAT_CCIF);这条语句有什么问题呢?
    void PFLASH_Erase(uint16 frist_add)
    {
    while(!FSTAT_CCIF)  ;                 
    FSTAT   = 0x30;                     
    FCCOBIX = 0;
    FCCOB   = PF_CMD_ERASE;
    FCCOBIX = 1;
    FCCOB   = frist_add + PF_GLOBAL_ADDRESS;   

    FSTAT_CCIF = 1;                                 
    while(!FSTAT_CCIF) MDelay(5);
    }

    该用户从未签到

    2

    主题

    25

    帖子

    0

    注册会员

    Rank: 2

    积分
    64
    最后登录
    2020-8-13
     楼主| 发表于 2011-9-22 20:37:44 | 显示全部楼层

    RE:请帮忙看看程序,9s12HY PFLASH的全局地址和逻辑地址和物理地址?

    显示的错误就是ILLEGAL_BP,是不是一定要把这段程序拷贝到RAm
    里面执行啊?官方的DEMO没有拷贝的ram执行的,还有不同的芯片拷贝
    到ram的那段代码都不一样吧?
    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-22 00:57 , Processed in 0.106560 second(s), 30 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表