打印

STM32 写flash操作 ,达人请进

[复制链接]
11962|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cyclone168|  楼主 | 2010-4-14 16:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近用STM32F103做了个项目
里面有温度定标数据需要写到flash里
于是写了一段向flash写多个字节的函数
请高手们看看有没有什么问题
编译链接都通过了
还没有在线调试过

代码如下:
/******************************************************************
* 名称:FLASH_WriteNByte
* 功能:指定FLASH起始地址,写多字节数据
* 入口参数:addr  指定的起始地址
*    dat_buf 待写入的数据缓冲区指针
*          no  要写入数据个数
* 出口参数:返回0时表示操作错误  返回1表示操作成功
******************************************************************/
u8  FLASH_WriteNByte(u32 addr, u8  *dat_buf, u8 no)
{
       FLASH_Unlock();//Unlock the Flash
       while(1)
      {
          FLASH_ProgramHalfWord(addr, *dat_buf);
         if(FLASH_GetStatus()==FLASH_COMPLETE)  //获取Flash状态
          {
             no--;
             addr++;
             *dat_buf++;
          }
       else
         {
            return 0;
      
           }
          if(no==0) break;
     }
   FLASH_Lock();
   return 1;
}


/*******************************************************************************
* Function Name  : FLASH_ProgramHalfWord
* Description    : Programs a half word at a specified address.
* Input          : - Address: specifies the address to be programmed.
*                  - Data: specifies the data to be programmed.
* Output         : None
* Return         : FLASH Status: The returned value can be: FLASH_BUSY,
*                  FLASH_ERROR_PG, FLASH_ERROR_WRP, FLASH_COMPLETE or
*                  FLASH_TIMEOUT.
*******************************************************************************/
FLASH_Status FLASH_ProgramHalfWord(u32 Address, u16 Data)
{
  FLASH_Status status = FLASH_COMPLETE;
  /* Check the parameters */
  assert_param(IS_FLASH_ADDRESS(Address));
  /* Wait for last operation to be completed */
  status = FLASH_WaitForLastOperation(ProgramTimeout);
  
  if(status == FLASH_COMPLETE)
  {
    /* if the previous operation is completed, proceed to program the new data */
    FLASH->CR |= CR_PG_Set;
  
    *(vu16*)Address = Data;
    /* Wait for last operation to be completed */
    status = FLASH_WaitForLastOperation(ProgramTimeout);
    if(status != FLASH_BUSY)
    {
      /* if the program operation is completed, disable the PG Bit */
      FLASH->CR &= CR_PG_Reset;
    }
  }
  /* Return the Program Status */
  return status;
}
沙发
mohanwei| | 2010-4-14 16:54 | 只看该作者
下载ST提供的usart bootloader例程,照着做即可
源码已经比较友好,从main()开始看一遍即可,初始化部分尤其要仔细看。

使用特权

评论回复
板凳
cyclone168|  楼主 | 2010-4-14 17:01 | 只看该作者
2# mohanwei
能否提供一个下载链接啊,大侠

使用特权

评论回复
地板
香水城| | 2010-4-14 17:13 | 只看该作者
5
cyclone168|  楼主 | 2010-4-14 17:24 | 只看该作者
谢谢香水城

使用特权

评论回复
6
maomao2126| | 2010-4-27 11:42 | 只看该作者
mark
回去测测我的flash

使用特权

评论回复
7
火箭球迷| | 2010-4-27 18:45 | 只看该作者
没看出什么问题

使用特权

评论回复
8
ren637126| | 2013-4-19 10:55 | 只看该作者
应该是写入16位数据,LZ写入一个字节是8位

使用特权

评论回复
9
cjhk| | 2013-4-19 18:55 | 只看该作者
水平有限   没怎么看出问题来   问问香主   他应该有办法   

使用特权

评论回复
10
xiaolei51| | 2014-7-19 14:59 | 只看该作者
楼主应该早就调试成功了,给新来的娃儿点一下把addr++;改成addr+=2就妥妥的了

使用特权

评论回复
11
jar1866| | 2014-7-20 00:31 | 只看该作者
必须先擦除,内容不是ff才能调用那个函数,你可以查看flash sr中的错误

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

15

帖子

0

粉丝