金牌会员
 
- 积分
- 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;
}
}
}
|
|