OpenEdv-开源电子网

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

请教关于Falsh写入函数中数据长度的问题

[复制链接]

24

主题

695

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1666
金钱
1666
注册时间
2016-4-29
在线时间
266 小时
发表于 2017-5-26 00:45:37 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 d1z1y2 于 2017-5-26 00:47 编辑

void STMFLASH_Write(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite)

注释是这样的:
//从指定地址开始写入指定长度的数据
//WriteAddr:起始地址(此地址必须为2的倍数!!)
//pBuffer:数据指针
//NumToWrite:半字(16位)数(就是要写入的16位数据的个数.)


我的问题是:NumToWrite这个参数的大小,比如我写入一个数组 u8 a[2]={0,1};到Falsh,那么这个NumToWrite取多大啊,是2?  还是1?  按我的理解应该是1,因为写的是“半字数”,而不是“字节数”.但是按例程里面写法是2。


比如下面写法有什么区别,           


        #define FLASH_ADD_dat1_Test                0x0801FD20
        #define FLASH_ADD_dat2_Test                0x0801FD22
        
        u8 dat1[]={0x12,0x34};
        u8 dat2[]={0x56,0x78};
               
        STMFLASH_Write(FLASH_ADD_dat1_Test, (u16*)dat1, 1);        
        STMFLASH_Write(FLASH_ADD_dat2_Test, (u16*)dat2, 2);        




最佳答案

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

1,写入单位是u16,如果是u8数组,写入长度是数组大小/2 2,STMFLASH_Write(FLASH_ADD_dat1_Test, (u16*)dat1, 1); STMFLASH_Write(FLASH_ADD_dat2_Test, (u16*)dat2, 2); 前者会写入2个字节。 后者会写入4个字节。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-5-26 00:45:38 | 显示全部楼层
1,写入单位是u16,如果是u8数组,写入长度是数组大小/2
2,STMFLASH_Write(FLASH_ADD_dat1_Test, (u16*)dat1, 1);        
        STMFLASH_Write(FLASH_ADD_dat2_Test, (u16*)dat2, 2);   
前者会写入2个字节。
后者会写入4个字节。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

13

主题

448

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1755
金钱
1755
注册时间
2015-2-7
在线时间
369 小时
发表于 2017-5-26 08:49:32 | 显示全部楼层
1
回复

使用道具 举报

24

主题

695

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1666
金钱
1666
注册时间
2016-4-29
在线时间
266 小时
 楼主| 发表于 2017-5-26 12:13:46 | 显示全部楼层
自顶……。
回复

使用道具 举报

0

主题

34

帖子

0

精华

高级会员

Rank: 4

积分
614
金钱
614
注册时间
2016-1-25
在线时间
135 小时
发表于 2017-5-26 16:01:38 | 显示全部楼层
其实自己试验一下更好,是 1。
回复

使用道具 举报

24

主题

695

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1666
金钱
1666
注册时间
2016-4-29
在线时间
266 小时
 楼主| 发表于 2017-5-26 17:34:13 | 显示全部楼层
通过试验,已经证实两个问题:

1、原子的例程里面的写入函数的备注是正确的,“//NumToWrite:半字(16位)数(就是要写入的16位数据的个数.)”,就是以16位为单位,也就是两个字节,如果以sizeof()获取到长度后,要除以2,得到NumToWrite

2、《实验34 FLASH模拟EEPROM实验》中没有除以2,应该是把数组地址空间后面地址的未知数据也保存到Flash中去了,这在实际使用中可能会出错,会把Flash中的数据给擦除,实验之所以成功,是因为没有用到Flash后面的空间


附原子全程:



//要写入到STM32 FLASH的字符串数组
const u8 TEXT_Buffer[]={"STM32F103 FLASH TEST"};
#define SIZE sizeof(TEXT_Buffer)                //数组长度
#define FLASH_SAVE_ADDR  0X08070000                //设置FLASH 保存地址(必须为偶数,且其值要大于本代码所占用FLASH的大小+0X08000000)

int main(void)
{         
        u8 key;
        u16 i=0;
        u8 datatemp[SIZE];

        delay_init();                     //延时函数初始化          
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
        uart_init(115200);                 //串口初始化为115200
        LED_Init();                                          //初始化与LED连接的硬件接口
        KEY_Init();                                        //初始化按键
        LCD_Init();                                           //初始化LCD  
        POINT_COLOR=RED;                        //设置字体为红色
        LCD_ShowString(30,50,200,16,16,"WarShip STM32");       
        LCD_ShowString(30,70,200,16,16,"FLASH EEPROM TEST");       
        LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
        LCD_ShowString(30,110,200,16,16,"2015/1/18");
        LCD_ShowString(30,130,200,16,16,"KEY1:Write  KEY0:Read");
        while(1)
        {
                key=KEY_Scan(0);
                if(key==KEY1_PRES)        //KEY1按下,写入STM32 FLASH
                {
                        LCD_Fill(0,170,239,319,WHITE);//清除半屏   
                        LCD_ShowString(30,170,200,16,16,"Start Write FLASH....");
                        STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)TEXT_Buffer,SIZE);
                        LCD_ShowString(30,170,200,16,16,"FLASH Write Finished!");//提示传送完成
                }
                if(key==KEY0_PRES)        //KEY0按下,读取字符串并显示
                {
                        LCD_ShowString(30,170,200,16,16,"Start Read FLASH.... ");
                        STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)datatemp,SIZE);
                        LCD_ShowString(30,170,200,16,16,"The Data Readed Is:  ");//提示传送完成
                        LCD_ShowString(30,190,200,16,16,datatemp);//显示读到的字符串
                }
                i++;
                delay_ms(10);  
                if(i==20)
                {
                        LED0=!LED0;//提示系统正在运行       
                        i=0;
                }                  
        }
}
回复

使用道具 举报

4

主题

35

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
250
金钱
250
注册时间
2013-8-3
在线时间
64 小时
发表于 2017-5-26 19:13:44 | 显示全部楼层
FLASH_ProgramHalfWord_len(FLASH_USER_START_ADDR,(void *)&Para,sizeof(Para)/2);        //闪存程序写半字16位数据

sizeof,这个关键字

我都是用这个来计算数据长度的,
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-20 17:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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