STM32 写flash操作 ,达人请进

[复制链接]
12896|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 | 显示全部楼层
 楼主| cyclone168 发表于 2010-4-14 17:24 | 显示全部楼层
谢谢香水城
maomao2126 发表于 2010-4-27 11:42 | 显示全部楼层
mark
回去测测我的flash
火箭球迷 发表于 2010-4-27 18:45 | 显示全部楼层
没看出什么问题
ren637126 发表于 2013-4-19 10:55 | 显示全部楼层
应该是写入16位数据,LZ写入一个字节是8位
cjhk 发表于 2013-4-19 18:55 | 显示全部楼层
水平有限   没怎么看出问题来   问问香主   他应该有办法   
xiaolei51 发表于 2014-7-19 14:59 | 显示全部楼层
楼主应该早就调试成功了,给新来的娃儿点一下把addr++;改成addr+=2就妥妥的了
jar1866 发表于 2014-7-20 00:31 来自手机 | 显示全部楼层
必须先擦除,内容不是ff才能调用那个函数,你可以查看flash sr中的错误
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

15

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部