OpenEdv-开源电子网

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

stm32读写内部flash例程中的问题。

[复制链接]

12

主题

52

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2013-8-22
在线时间
0 小时
发表于 2013-9-26 09:56:52 | 显示全部楼层 |阅读模式

#include "STM32Lib\\stm32f10x.h"
#include "hal.h"
#include "myapp.h"
#include <string.h>
#include <stdio.h>
#define FLASH_ADR 0x08008000  //要写入的地址
union union_temp16
{
    unsigned int un_temp16;
    unsigned char  un_temp8[2];  // example 16: 0x0102  8:[0]2 [1]1
}my_unTemp16;

configStruct myConf =
{
 "cmnet",
 "\0",
 "\0",
 "201.2.2.2",
 "9002",
 {
  "test123","\0","\0"
 }
};


/******************************************************
flash字符串写入,每次存入两个字节
*******************************************************/
void FlashWriteStr( u32 flash_add, u16 len, u8* data )
{
 //char cp[12];
 //u8 s = 0;
 u16 byteN = 0;
 FLASH_Unlock();
 FLASH_ErasePage(flash_add);
 //sprintf( cp, "len:%d", len);
 //USART1_Puts(cp);
 while( len )
 {
  
  my_unTemp16.un_temp8[0] = *(data+byteN);
  my_unTemp16.un_temp8[1] = *(data+byteN+1);  
  FLASH_ProgramHalfWord( flash_add+byteN , my_unTemp16.un_temp16 );

  //sprintf( cp, "bye:%d\r\n", s);
  //USART1_Puts(cp);
  if( 1==len )
  {
   //如果数据长度是奇数,是1的时候跳出
   break;               
  }
  else
  {
   byteN += 2;
   len -= 2;
  } 
 }
 FLASH_Lock();
}

/******************************************************
flash字符串读入到指定的data中,地址与写入data地址相同,读出的保存类型也必须一样
*******************************************************/
void FlashReadStr( u32 flash_add, u16 len, u8* data )
{
 u16 byteN = 0;
 while( len )
 {
  my_unTemp16.un_temp16 = *(vu16*)(flash_add+byteN);
  if( 1==len )
  {
   *(data+byteN) = my_unTemp16.un_temp8[0];
   break;     
  }
  else
  {  
   *(data+byteN) = my_unTemp16.un_temp8[0];
   *(data+byteN+1) = my_unTemp16.un_temp8[1];
   byteN += 2;
   len -= 2;
  }
 }
}

void FlashInit(void)
{
 u32 tmp=*(vu32*)(FLASH_ADR);
 if(tmp==0xffffffff)
 {
  FlashWriteStr(FLASH_ADR, sizeof(myConf), (u8*)&myConf);
 }
 else
 {
  FlashReadStr(FLASH_ADR, sizeof(myConf), (u8*)&myConf); 
 }
}
 
int main(void)
{
 //char cp[12];

 ChipHalInit();   //片内硬件的初始化
 FlashInit();   //flash初始化

}
上述是例程的主程序,谁能帮我解释下呢?
configStruct myConf 这个是什么意思?
u32 tmp=*(vu32*)(FLASH_ADR);
 if(tmp==0xffffffff)
这两句又是什么意思呢?
还有程序从flash中读出来的数据放在哪呢?我要怎么查看呢?
希望大虾们帮忙!
在线等啊!谢谢

Just Dance!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-26 10:36:17 | 显示全部楼层
楼主好好学习下c语言先。
比如结构体使用,指针使用,和if的使用等知识点。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

12

主题

52

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2013-8-22
在线时间
0 小时
 楼主| 发表于 2013-9-26 10:42:32 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
我知道什么意思 但是我不知道为什么要这么做。。。
Just Dance!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-26 11:11:48 | 显示全部楼层
你觉得应该怎么做呢?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

12

主题

52

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2013-8-22
在线时间
0 小时
 楼主| 发表于 2013-9-26 11:26:13 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
我也不懂啊 但是我不知道为什么要通过这个if(tmp==0xffffffff) if语句判断是写操作还是读操作,我单步调试的时候是进入了读操作,但是看不到读到的数据在哪啊 所以才来问的啊
Just Dance!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-26 16:21:50 | 显示全部楼层
回复【5楼】南小蹦:
---------------------------------
因为flash只能写0,否则就要先擦除,让其恢复0XFF,才能写。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-13 05:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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