打印
[技术问答]

请教各位牛人M058S的data flash读写问题

[复制链接]
1872|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
shujianxiaoyao|  楼主 | 2013-12-23 11:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我现在用KEIL调试M058S的项目遇到一个很奇怪的问题,请各位牛人指导一下。
定义有这样的机构体:
typedef struct {
  uint8_t current;
  int16_t accZero[3];
  int16_t magZero[3];
  uint16_t flashsum;
  uint8_t checksum;     
} global_conf_t;

global_conf_t  global_conf;

子函数:
//************************************************************************
void eeprom_read_block(void *__dst, uint32_t addr, uint16_t __n)
{
         uint32_t *_myDstPtr;
         uint32_t _mySrcPtr;
         uint16_t  count = __n / 4;
         uint32_t  temp;

         if((__n % 4) != 0) count += 1;
               
        _myDstPtr        =  (uint32_t *)__dst;
        _mySrcPtr        =  addr + 0x01f000;

       
        SYS_UnlockReg();
    _FMC_ENABLE_ISP();

        while(count--)
    {
//                 *_myDstPtr        =  FMC_Read((uint32_t)_mySrcPtr);       
        temp =  FMC_Read((uint32_t)_mySrcPtr);                  //test
                *_myDstPtr = temp;                                                         // test
                _myDstPtr++;
                _mySrcPtr += 4;
    }
  
          _FMC_DISABLE_ISP();
    SYS_LockReg();
}

//*************************************************************************
void  eeprom_write_block(const void *__src, uint32_t addr, uint16_t __n)
{

        uint32_t        _myDstPtr;
        uint32_t        *_mySrcPtr;
        uint16_t   count = __n / 4;

        if((__n % 4) != 0) count += 1;

    _myDstPtr  =  addr + 0x01f000;
        _mySrcPtr  = (uint32_t *)__src;
               
        SYS_UnlockReg();
    _FMC_ENABLE_ISP();
        if(addr < 512)
          FMC_Erase(0x01f000);
        else if(addr < 1024)
          FMC_Erase(0x01f000 + 512);
        else if(addr < 1536)
          FMC_Erase(0x01f000 + 1024);
        else if(addr < 2048)
          FMC_Erase(0x01f000 + 1536);
        else if(addr < 2560)
          FMC_Erase(0x01f000 + 2048);
        else if(addr < 3072)
          FMC_Erase(0x01f000 + 2560);

        while(count--)
        {
       FMC_Write((uint32_t)_myDstPtr, *_mySrcPtr++);
           _myDstPtr += 4;

        }
        _FMC_DISABLE_ISP();
    SYS_LockReg();
}

在main函数中只要调用以下其中一个函数,都会有异常出现!
  eeprom_read_block((void *)&global_conf, 0, sizeof(global_conf));
  
  eeprom_write_block((const void*)&global_conf, 0, sizeof(global_conf));

比如调用eeprom_read_block((void *)&global_conf, 0, sizeof(global_conf));
跟踪发现
运行到                 *_myDstPtr = temp;                                                         // test
这里的时候马上会异常跳到这里:startup_M051Series.s中
HardFault_Handler_Ret
    ENDIF

                B       .
                ENDP


请叫各位大侠是怎么回事呢?
沙发
shujianxiaoyao|  楼主 | 2013-12-24 10:02 | 只看该作者
哪位大侠帮忙分析分析,是怎么回事呢?

使用特权

评论回复
板凳
从小木丁丁| | 2013-12-24 10:47 | 只看该作者
2.数组或者结构数据对齐引发的问题.

使用特权

评论回复
地板
shujianxiaoyao|  楼主 | 2013-12-24 18:24 | 只看该作者
dwh000 发表于 2013-12-24 10:30
有可能是以下几个问题:
1.指针使用时,不小心引发了越界.
2.数组或者结构数据对齐引发的问题.

我加#pragma pack(4)来强制字节对齐了,还是不行。郁闷哦。

使用特权

评论回复
5
a_ziliu| | 2014-1-3 15:18 | 只看该作者
_myDstPtr        =  (uint32_t &)__dst;

使用特权

评论回复
6
zxf0168| | 2014-2-6 19:49 | 只看该作者
越界了吧

使用特权

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

本版积分规则

1

主题

3

帖子

0

粉丝