打印

Flash 擦除与写入相关问题?

[复制链接]
5614|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
LOVE_ELEC|  楼主 | 2013-2-21 16:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 LOVE_ELEC 于 2013-2-26 18:09 编辑

情况:<1>执行用户函数时,若先点击进入用户函数再进行单步调试时,程序执行完全正常;
      <2>全速执行或者执行不进入用户函数的单步调试,程序会在执行用户函数后跳到 0000 位置;
      <3>同样是按照<2>中方式调试,当用户函数中存在循环时,将会在执行1次循环内的程序段后跳入 0000 位置。
      还请各位不吝赐教!

相关帖子

沙发
LOVE_ELEC|  楼主 | 2013-2-21 19:56 | 只看该作者
比较急的问题请大家赶快来帮忙啊!

使用特权

评论回复
板凳
tj_zhaozq| | 2013-2-21 22:16 | 只看该作者
把详细情况和状态说清楚些。
1. 程序的功能。
2. 有没有使用外部资源。
3. 程序的工作流程。
4. 最好有部分示意性代码。

使用特权

评论回复
地板
LOVE_ELEC|  楼主 | 2013-2-21 22:29 | 只看该作者
本帖最后由 LOVE_ELEC 于 2013-2-22 11:04 编辑
tj_zhaozq 发表于 2013-2-21 22:16
把详细情况和状态说清楚些。
1. 程序的功能。
2. 有没有使用外部资源。


程序功能是对芯片内部的Flash的擦出和写操作!(所用芯片型号为 MC9S12XDT256)
工作流程:操作地址、页、写入数据、写入数据个数设置——Flash擦除—— Flash写(主函数部分)

源码:(该部分代码全部存在 RAM 中)
写Flash函数部分:
ErrorStatus Flash_Program(Transfer_Information Transfer_InformationStruct)
{
  byte Inum;
  Transfer_Information *Tinformation;
  Tinformation = &Transfer_InformationStruct;
  while (!FCLKDIV_FDIVLD)
  {
    FLASH_READ_REG8(&FCLKDIV);
  }
  while (!FSTAT_CBEIF)
  {
    FLASH_READ_REG8(&FSTAT);
  }
  if (FSTAT_PVIOL || FSTAT_ACCERR)
  {
    FLASH_WRITE_REG8(FSTAT,0x30);  
  }
  FLASH_WRITE_REG8(FPROT,NoProtection); /*Set Flash Protect Range*/
  for (Inum = 0; Inum < Tinformation->WByteNum; Inum++)
  {
    PPAGE = Tinformation->Page;

*((volatile word *)(Tinformation->Addr)) = (*(Tinformation->DFaddr));
    FLASH_WRITE_REG8(FCMD,Flash_Command_Program);
FSTAT |= 0x80;
    while (!FSTAT_CBEIF)
    {
      FLASH_READ_REG8(&FSTAT);   
    }
    Tinformation->Addr += 2;
    Tinformation->DFaddr++;
  }
  while (!FSTAT_CCIF)
  {
    FLASH_READ_REG8(&FSTAT);   
  }
  return SUCCESS;
}
擦出Flash函数部分:
ErrorStatus Flash_SectorErase(Transfer_Information Transfer_InformationStruct)
{
  Transfer_Information *Tinformation;
  Tinformation = &Transfer_InformationStruct;
  while (!FCLKDIV_FDIVLD)
  {
    FCLKDIV = FCLKDIV_FDIV5_MASK | FCLKDIV_FDIV3_MASK | FCLKDIV_FDIV1_MASK;
    FLASH_READ_REG8(&FCLKDIV);
  }
  while (!FSTAT_CBEIF)
  {
    FLASH_READ_REG8(&FSTAT);
  }
  if (FSTAT_PVIOL || FSTAT_ACCERR)
  {
    FLASH_WRITE_REG8(FSTAT,0x30);  
  }
  PPAGE = Tinformation->Page;
  *((volatile word *)(Tinformation->Addr)) = 0xFF;  /*OxFF 将被忽略*/  
        
  FLASH_WRITE_REG8(FCMD,Flash_Command_SectorErase);
  FSTAT |= 0x80;
while (!FSTAT_CCIF);
  return SUCCESS;
}
请指教!


使用特权

评论回复
5
LOVE_ELEC|  楼主 | 2013-2-22 11:06 | 只看该作者
请各位行内人士前来指教!先在这里谢谢了!

使用特权

评论回复
6
LOVE_ELEC|  楼主 | 2013-2-23 15:15 | 只看该作者
本帖最后由 LOVE_ELEC 于 2013-2-23 15:17 编辑

问题仍未得到解决请各位大侠前来帮忙!

使用特权

评论回复
7
LOVE_ELEC|  楼主 | 2013-2-23 15:19 | 只看该作者
看过版主的这方面相关的一些帖子,请版主指导!

使用特权

评论回复
8
li374751475| | 2013-2-23 15:38 | 只看该作者
...................................

使用特权

评论回复
9
LOVE_ELEC|  楼主 | 2013-2-23 22:00 | 只看该作者
请求各位大侠给予小弟指导!比较急着解决!

使用特权

评论回复
10
LOVE_ELEC|  楼主 | 2013-2-24 22:39 | 只看该作者
请大家帮帮忙提个意见也行!可能会给与我一些启发!谢谢各位!

使用特权

评论回复
11
LOVE_ELEC|  楼主 | 2013-2-24 22:40 | 只看该作者
tj_zhaozq 发表于 2013-2-21 22:16
把详细情况和状态说清楚些。
1. 程序的功能。
2. 有没有使用外部资源。

源码我已上传请指教

使用特权

评论回复
12
LOVE_ELEC|  楼主 | 2013-2-26 18:11 | 只看该作者
有哪位做过 Freescale HCS12 系列单片机的内部Flash!请提供一些经验!

使用特权

评论回复
13
LOVE_ELEC|  楼主 | 2013-2-28 16:33 | 只看该作者
问题已解决,原因是因为没有恢复PPAGE寄存器的值是的程序在改写PPAGE后不能回到程序所在的位置执行,故会出现上述的情况!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:生命不息,奋斗不止!

21

主题

205

帖子

5

粉丝