OpenEdv-开源电子网

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

内部flash跨扇区写读问题

[复制链接]

11

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2015-11-19
在线时间
31 小时
发表于 2017-1-13 10:05:45 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 453044814@qq.com 于 2017-1-13 10:07 编辑

#define ErrorObjSize                        7
#define FLASH_HISTORICAL_EVENT_START_ADDR        0X08050000
        typedef struct{        
                uint8_t                error_type;               
                uint8_t                error_bus;
                uint16_t                error_term_id;
                uint8_t                error_term_type;
                uint8_t                light_type;
               
                uint16_t                error_year;
                uint8_t                error_month;
                uint8_t                error_day;
                uint8_t                error_hour;
                uint8_t                error_min;
                uint8_t                error_sec;
               
        }_EVENT_LOG_LIST_obj;
uint16_t NewEventSavrFlashAddr=0;
/*****************************************************************************************************/
/*记录日志*/
void record_new_event(_EVENT_LOG_LIST_obj* data)
{
        static uint16_t j=0;
                uint16_t buffer[ErrorObjSize];
                uint32_t addr32;
                buffer[0] = (data->error_type)<<8 | (data->error_bus);
                buffer[1] = data->error_term_id;
                buffer[2] = (data->error_term_type)<<8 | (data->light_type);

                buffer[3] = calendar.w_year;
                buffer[4] = (calendar.w_month)<<8 | (calendar.w_date);
                buffer[5] = (calendar.hour)<<8 | (calendar.min);        
                buffer[6] = (calendar.sec)<<8;        

                addr32 = FLASH_HISTORICAL_EVENT_START_ADDR + NewEventSavrFlashAddr*ErrorObjSize*2;
                if(j==146)
                {
                        delay_ms(20);
                        /*
                                addr = FLASH_HISTORICAL_EVENT_START_ADDR+2044 = 0x08507fc 要跨扇区了
                                写入buffer = {0xe801,0x0007,0x080a,0x07e1,0x010b,0x1311,0x2000}
                                读出buffer = {0xe801,0x0007,0xffff,0xffff,0xffff,0xffff,0xffff}
                        */
                }               
                STMFLASH_Write(addr32,buffer,ErrorObjSize);
                j++;

                delay_ms(50);
                STMFLASH_Read(addr32,buffer,ErrorObjSize);
               
                if(NewEventSavrFlashAddr<8000-1)
                {
                        NewEventSavrFlashAddr++;
                }
                else
                {
                        NewEventSavrFlashAddr = 0;
                }
}

        int main(void)
        {
                _EVENT_LOG_LIST_obj data;
                data.error_bus = 1;
                data.error_day = 2;
                data.error_hour = 3;
                data.error_min = 4;
                data.error_month = 5;
                data.error_sec = 6;
                data.error_term_id = 7;
                data.error_term_type = 8;
                data.error_year = 9;
                data.light_type = 10;
                while(1)
                {
                        record_new_event(&data);
                        delay_ms(50);
                }
        }

flash驱动来自精英版


最佳答案

查看完整内容[请看2#楼]

修改 #define ErrorObjSize 8 ok
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

11

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2015-11-19
在线时间
31 小时
 楼主| 发表于 2017-1-13 10:05:46 | 显示全部楼层
修改  
#define ErrorObjSize                        8
ok
回复

使用道具 举报

11

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2015-11-19
在线时间
31 小时
 楼主| 发表于 2017-1-13 10:34:05 | 显示全部楼层
没问题,我自己晕了
回复

使用道具 举报

11

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2015-11-19
在线时间
31 小时
 楼主| 发表于 2017-1-13 11:01:18 | 显示全部楼层
还是有问题
回复

使用道具 举报

11

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2015-11-19
在线时间
31 小时
 楼主| 发表于 2017-1-13 11:06:21 | 显示全部楼层
#define ErrorObjSize                        7
#define FLASH_HISTORICAL_EVENT_START_ADDR        0X08050000
void record_new_event(_EVENT_LOG_LIST_obj* data)
{
                static uint16_t j=0;
                uint8_t i;
                uint16_t buffer[ErrorObjSize];
                uint32_t addr32;       
                buffer[0] = 7;
                buffer[1] = 8;               
                buffer[2] = 9;
                buffer[3] = 10;
                buffer[4] = 11;
                buffer[5] = 12;
                buffer[6] = 13;

                addr32 = FLASH_HISTORICAL_EVENT_START_ADDR + j*ErrorObjSize*2;
                if(j==146)
                {
                        delay_ms(20);
                        /*
                                addr = FLASH_HISTORICAL_EVENT_START_ADDR+2044 = 0x08507fc 要跨扇区了
                                写入buffer = {0x0007,0x0008,0x00009,0x0a,0x0b,0x0c,0x0d}
                                读出buffer = {0x0001,0x0007,0xffff,0xffff,0xffff,0xffff,0xffff}
                        */
                }
                STMFLASH_Write(addr32,buffer,ErrorObjSize);
                j++;

                delay_ms(10);
                STMFLASH_Read(addr32,buffer,ErrorObjSize);

}
       int main(void)
        {
                _EVENT_LOG_LIST_obj data;
                while(1)
                {
                        record_new_event(&data);
                }
        }



回复

使用道具 举报

11

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2015-11-19
在线时间
31 小时
 楼主| 发表于 2017-1-13 11:17:44 | 显示全部楼层
                addr32 = FLASH_HISTORICAL_EVENT_START_ADDR + j*ErrorObjSize*2;
                if(j==146)
                {
                        delay_ms(20);
                        /*
                                addr = FLASH_HISTORICAL_EVENT_START_ADDR+2044 = 0x08507fc 要跨扇区了
                                写入buffer = {0x0001,0x0007,0x080a,0,0,0,0}
                                读出buffer = {0x0001,0x0007,0x080a,0xffff,0,0,0}
                        */
                        j++;
                }
                else
                {
                        STMFLASH_Write(addr32,buffer,ErrorObjSize);
                        j++;

                        delay_ms(10);
                        STMFLASH_Read(addr32,buffer,ErrorObjSize);
                }

跳过跨页的那一段,接下的都没有问题
不跳过,以后读出全是ffff
估计是奇数地址的问题
回复

使用道具 举报

11

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2015-11-19
在线时间
31 小时
 楼主| 发表于 2017-1-13 11:30:12 | 显示全部楼层
照道理地址*2了应该没有奇地址的。原因抽空在看那看那
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2017-1-13 21:25:22 | 显示全部楼层
帮顶
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-30 11:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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