查看: 12742|回复: 30

[已解决] KEA128 无法在线擦除Flash

[复制链接]

该用户从未签到

5

主题

51

帖子

0

注册会员

Rank: 2

积分
168
最后登录
1970-1-1
发表于 2016-6-20 06:36:43 | 显示全部楼层 |阅读模式
本帖最后由 henrei-290209 于 2016-6-20 06:41 编辑

任务描述:
1、我需要在flash中保存大量参数,这些参数在编程时被固化成固定参数。程序运行时这些参数可能需要被改写。类似虚拟EEPROM
软件编写描述:
a、在.ld文件中定义了一个参数段
  1. MEMORY {
  2.   m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x000000C0
  3.   m_text      (RX) : ORIGIN = 0x00000410, LENGTH = 0x00015BF0
  4.   m_data      (RW) : ORIGIN = 0x1FFFF000, LENGTH = 0x00004000
  5.   m_parameter (RX) : ORIGIN = 0x00016000, LENGTH = 0x00004000
  6.   m_cfmprotrom  (RX) : ORIGIN = 0x00000400, LENGTH = 0x00000010
  7. }
  8. /* Define output sections */
  9. SECTIONS
  10. {
  11.   /* The startup code goes first into INTERNAL_FLASH */
  12.     .m_parameter :
  13.   {
  14.   __ROM_SYMBOLS = .;
  15.      . = ALIGN(4);
  16.     KEEP(*(.m_parameter)) /* Startup code */
  17.     . = ALIGN(4);
  18.   } > m_parameter
复制代码


  
b、主程序中定义了一个数据表
__attribute__ ((section(".m_parameter"))) uint8_t myparam[0x10]

c、执行初始化、擦除、写入、读出指令
   
  1. MyFLASH_Ptr = FLASH1_Init(NULL);  
  2.     /* Initialization of FLASH1 component */
  3.     Error = FLASH1_Erase(MyFLASH_Ptr,MY_FLASH_LOCATION, sizeof(Data));
  4.     while (!DataWrittenFlg) {                                                   /* Wait until the data are written */
  5.       FLASH1_Main(MyFLASH_Ptr);                                                 /* Run the main method */
  6.     }
  7.     DataWrittenFlg = FALSE;
  8.       Error = FLASH1_Write(MyFLASH_Ptr, Data, MY_FLASH_LOCATION, sizeof(Data));   /* Start writing to the flash memory */
  9.       /* Here some other application code can be placed */
  10.       while (!DataWrittenFlg) {                                                   /* Wait until the data are written */
  11.         FLASH1_Main(MyFLASH_Ptr);                                                 /* Run the main method */
  12.       }
复制代码


3、问题描述:

在没定义section(".m_parameter")之前,也就是0x16000地址处于.text段时,无论是否该地址有数据,擦除、写入都是正确的。下次启动时,该地址的数据是上次写入的数据,也可以被正常擦除和写入。
如果定义了section(".m_parameter"),在0x16000地址上就有了初始化的数据。擦除程序执行完毕,返回值Error是ErrOK,但是数据没有被擦除。后续自然无法写入。

求各位高人帮忙


最佳答案

number573 发表于 2016-12-19 16:52 我想问楼主,为什么要定义sectio呢,既然数据是上次写入的,也能正常擦除和写入 ... 一般定义专用sector是为了把你相关数据或者代码固定在flash的某个位置,否则编译器会把数据乱 ...

tt.rar

998.66 KB, 下载次数: 35, 下载积分: 威望 1

回复

使用道具 举报

  • TA的每日心情
    奋斗
    2017-2-13 08:29
  • 签到天数: 20 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    531

    主题

    2048

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    210
    最后登录
    2018-8-14
    发表于 2016-6-20 07:04:29 | 显示全部楼层
    顶下
    签到 签到
    回复

    使用道具 举报

    该用户从未签到

    5

    主题

    51

    帖子

    0

    注册会员

    Rank: 2

    积分
    168
    最后登录
    1970-1-1
     楼主| 发表于 2016-6-20 07:04:59 | 显示全部楼层
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    712

    主题

    6371

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    24863
    最后登录
    2025-7-18
    发表于 2016-6-20 10:47:45 | 显示全部楼层
    楼主你好!
    你把ld中这句话改下试试:
    05.  m_parameter (RX) : ORIGIN = 0x00016000, LENGTH = 0x00004000
    改为
    05.  m_parameter (RW) : ORIGIN = 0x00016000, LENGTH = 0x00004000
    你现在这种写法是直接定义常量段,也就是只读段的,你定义为可读可写的试下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    5

    主题

    51

    帖子

    0

    注册会员

    Rank: 2

    积分
    168
    最后登录
    1970-1-1
     楼主| 发表于 2016-6-20 11:16:05 | 显示全部楼层
    小恩GG 发表于 2016-6-20 10:47
    楼主你好!
    你把ld中这句话改下试试:
    05.  m_parameter (RX) : ORIGIN = 0x00016000, LENGTH = 0x00004000 ...

    谢谢版主回复啊。
    RW、RWX我都试过。都不好使
    比较奇怪的是返回值是OK,但是就没擦掉
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    5

    主题

    51

    帖子

    0

    注册会员

    Rank: 2

    积分
    168
    最后登录
    1970-1-1
     楼主| 发表于 2016-6-20 11:20:57 | 显示全部楼层
    小恩GG 发表于 2016-6-20 10:47
    楼主你好!
    你把ld中这句话改下试试:
    05.  m_parameter (RX) : ORIGIN = 0x00016000, LENGTH = 0x00004000 ...

    另外.text段也是RX,只要没存储程序数值,就可以擦除。
    用FlashWrite命令写入的数据是可以反复擦除并写入的。
    只有用常量初始化赋值的擦不掉。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    712

    主题

    6371

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    24863
    最后登录
    2025-7-18
    发表于 2016-6-20 12:35:59 | 显示全部楼层
    henrei-290209 发表于 2016-6-20 11:20
    另外.text段也是RX,只要没存储程序数值,就可以擦除。
    用FlashWrite命令写入的数据是可以反复擦除并写入 ...

    和ld文件中的具体段编写应该也是有关的。
    把你的.m_parameter  段内容也参考txt的改下下,现在里面的__ROM_SYMBOLS = .;应该也和只读有关。
    这样修改下试试
      __ROM_SYMBOLS = .;
      {
        . = ALIGN(4);
          KEEP(*(.m_parameter)) /* Startup code */
        . = ALIGN(4);

      } >m_parameter
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    5

    主题

    51

    帖子

    0

    注册会员

    Rank: 2

    积分
    168
    最后登录
    1970-1-1
     楼主| 发表于 2016-6-20 12:41:56 | 显示全部楼层
    小恩GG 发表于 2016-6-20 12:35
    和ld文件中的具体段编写应该也是有关的。
    把你的.m_parameter  段内容也参考txt的改下下,现在里面的__RO ...


    谢谢啦,我试试
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    712

    主题

    6371

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    24863
    最后登录
    2025-7-18
    发表于 2016-6-20 13:05:14 | 显示全部楼层

    操作flash命令前,关闭总中断,查看地址数据的时候,先刷新下IDE的窗口。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    5

    主题

    51

    帖子

    0

    注册会员

    Rank: 2

    积分
    168
    最后登录
    1970-1-1
     楼主| 发表于 2016-6-20 17:10:49 | 显示全部楼层
    小恩GG 发表于 2016-6-20 13:05
    操作flash命令前,关闭总中断,查看地址数据的时候,先刷新下IDE的窗口。

    大神,试过啦,没有用。
    工程就一个flash写程序,没开中断,flash写也只使用了poll模式没有用中断。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

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

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

    GMT+8, 2025-7-19 01:58 , Processed in 0.112329 second(s), 32 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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