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

2019-08-17 10:42发布

本帖最后由 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);        




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
正点原子
1楼-- · 2019-08-17 13:06
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个字节。
电子之旅
2楼-- · 2019-08-17 15:35
1
d1z1y2
3楼-- · 2019-08-17 16:09
 精彩回答 2  元偷偷看……
吃货菌
4楼-- · 2019-08-17 19:26
其实自己试验一下更好,是 1。
d1z1y2
5楼-- · 2019-08-17 21:19
通过试验,已经证实两个问题:

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;                        //设置字体为红 {MOD}
        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;
                }                  
        }
}
笑看风云
6楼-- · 2019-08-17 23:39
FLASH_ProgramHalfWord_len(FLASH_USER_START_ADDR,(void *)&Para,sizeof(Para)/2);        //闪存程序写半字16位数据

sizeof,这个关键字

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

一周热门 更多>