OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2740|回复: 13

请教原子哥和论坛的大神,现在碰到一个关于将结构体中数据直接写到flash的问题。

[复制链接]

20

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2012-8-24
在线时间
3 小时
发表于 2018-5-21 20:55:19 | 显示全部楼层 |阅读模式
10金钱
请教原子哥和论坛的大神,现在碰到一个关于将结构体中数据直接写到flash的问题。
先写一下我的代码
结构体是:
typedef struct
{
        uint8_t         breakpoint;                               
        uint8_t         updata;                                                                       
        uint16_t         rec_data;                                                                        
        uint32_t         rec_version;                                                       
        uint8_t         rec_breakpoin[4];               
}__attribute__((packed)) TEST_TEST_T;                   
TEST_TEST_T sys_test;       
我先把ADDR_FLASH_PAGE_40(0x800c000)这个地址的内容赋值到sys_test结构体中
memcpy(&sys_test,(uint8_t*)ADDR_FLASH_PAGE_40,sizeof(sys_test));

这一步已经成功把ADDR_FLASH_PAGE_40内容依次赋值到结构体中了(数据都是正确的)
下面我调用这个函数想把结构体中的数字再写到flash中的ADDR_FLASH_PAGE_41位置
函数如下:
WriteFlashToBackup(ADDR_FLASH_PAGE_41, (uint64_t* )&sys_test, sizeof(sys_test)/8 +1);

函数如下:
void WriteFlashToBackup(uint32_t addr, uint64_t *data, uint32_t data_len)
{
        int i;
        HAL_FLASH_Unlock();
        FLASH_WaitForLastOperation(50000);
        for(i = 0; i < data_len ; i++)
        {
                HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, addr, *data);   (11111)
                addr += 8;
                data ++ ;
        }
        FLASH_WaitForLastOperation(50000);
        HAL_FLASH_Lock();
       
}
但是每次执行到HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, addr, *data)处就跳到下面的硬件复位了
void HardFault_Handler(void)
{
  /* Go to infinite loop when Hard Fault exception occurs */
  while (1)
  {
  }
}


求大神帮忙看看问题出在哪里!  十分感谢!

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-5-22 01:21:11 | 显示全部楼层
参考我们的flash模拟eeprom例程。
回复

使用道具 举报

20

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2012-8-24
在线时间
3 小时
 楼主| 发表于 2018-5-22 10:25:52 | 显示全部楼层
例程里面是写数组,同样的代码把WriteFlashToBackup(ADDR_FLASH_PAGE_41, (uint64_t* )&sys_test, sizeof(sys_test)/8 +1);中的结构体&sys_test换成数组就没问题
回复

使用道具 举报

20

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2012-8-24
在线时间
3 小时
 楼主| 发表于 2018-5-22 10:26:13 | 显示全部楼层
例程里面是写数组,同样的代码把WriteFlashToBackup(ADDR_FLASH_PAGE_41, (uint64_t* )&sys_test, sizeof(sys_test)/8 +1);中的结构体&sys_test换成数组就没问题,请帮忙看一下吧
回复

使用道具 举报

20

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2012-8-24
在线时间
3 小时
 楼主| 发表于 2018-5-22 10:53:01 | 显示全部楼层
求助 ,在线等
回复

使用道具 举报

20

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2012-8-24
在线时间
3 小时
 楼主| 发表于 2018-5-22 10:53:01 | 显示全部楼层
求助 ,在线等
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2018-5-22 14:57:22 | 显示全部楼层

那你就把结构体用共同体打包一下,不就是数组了嘛,直接用例程的代码就可以了
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2018-5-22 15:13:30 | 显示全部楼层

typedef struct _TEST_TEST_T
{
        uint8_t         breakpoint;   //1                             
        uint8_t         updata;        //1                                                               
        uint16_t         rec_data;     //2                                                                   
        uint32_t         rec_version;   //4                                                   
        uint8_t         rec_breakpoin[4]; //4               
}TEST_TEST_T;


typedef union _data_union
{
   u8                 save_char[12];
   TEST_TEST_T data_temp;
}data_union;
data_union  data;
//赋值的时候
data.data_temp.breakpoint=1;
........


//写flash
直接写data.save_char

回复

使用道具 举报

20

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2012-8-24
在线时间
3 小时
 楼主| 发表于 2018-5-22 18:14:12 | 显示全部楼层
275891381 发表于 2018-5-22 15:13
typedef struct _TEST_TEST_T
{
        uint8_t         breakp ...

我试了试还是不行
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2018-5-22 18:16:55 | 显示全部楼层
firexxl 发表于 2018-5-22 18:14
我试了试还是不行

那就是你的代码问题了,直接参考flash模拟eeprom例程吧
回复

使用道具 举报

20

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2012-8-24
在线时间
3 小时
 楼主| 发表于 2018-5-22 19:09:30 | 显示全部楼层
275891381 发表于 2018-5-22 18:16
那就是你的代码问题了,直接参考flash模拟eeprom例程吧

一样的  就是把数据里面的数据  memcpy到结构体了  然后就写不成功了
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2018-5-22 19:16:35 | 显示全部楼层
firexxl 发表于 2018-5-22 19:09
一样的  就是把数据里面的数据  memcpy到结构体了  然后就写不成功了

都用共同体了直接读写就可以了,不用memcpy了,你还是试试单个数据读写正常不先
回复

使用道具 举报

20

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2012-8-24
在线时间
3 小时
 楼主| 发表于 2018-5-22 20:32:42 | 显示全部楼层
还有知道原因的吗?急求
回复

使用道具 举报

20

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2012-8-24
在线时间
3 小时
 楼主| 发表于 2018-5-22 20:36:59 | 显示全部楼层
为什么会跳转到硬件错误呢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-7 16:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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