本帖最后由 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);
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
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;
}
}
}
一周热门 更多>