Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4470734
  • 博文数量: 1148
  • 博客积分: 25453
  • 博客等级: 上将
  • 技术积分: 11949
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-06 21:14
文章分类

全部博文(1148)

文章存档

2012年(15)

2011年(1078)

2010年(58)

分类: 嵌入式

2011-06-25 18:23:19

工程代码: 14_flash读写字.rar  


  1. * 修改Date:2011.6.25 18:20
  2. * 功能描述:打开串口调试软件(网上很多可以自己下一个),系统板下载完程序后,
  3. *
  4.    注意: Flash不具备修改功能,
  5. * 只能先擦除再写,而擦除时,只支持页擦除。
  6. *        addr地址范围:ADDR_BASE ~ADDR_BASE+1022
  7. ** 使用Flash方式存储数据,可以在不常修改数据的场合替代EEPROM,它的优点是抗
  8. * 干扰能力比EEPROM强,不易被冲掉数据。缺点是擦除次数比EEPROM少,且不支持对
  9. * 单个字的修改功能。

  10. * 在通常情况下,由于保存的参数基本修改频率不是很高,有些时候一天也就1次,
  11. * 甚至一个月才一次,所以擦除次数不是问题。
  12. *
  13. */

  14. #include "stm32f10x_lib.h"
  15. #include "delay.h"
  16. #include "rcc.h"
  17. #include "led.h"
  18. #include "usart1.h"
  19. #include "flash.h"

  20. int main()
  21. {    
  22.     u32 dat = 0;
  23.     RCC_Configuration();
  24.     delay_init();
  25.     LED_Init();
  26.     USART1_GPIO_Configuration();
  27.     USART1_Configuration();

  28.     SavePara(ADDR_BASE,6566); //保存数据6566

  29.      while(1)
  30.      {
  31.         dat=GetPara(ADDR_BASE); //读取ADDR_BASE开始的16位半字数据(两个字节)

  32.         if(dat == 6566)//如果读取到得值 =6566 串口显示A字符
  33.         {    
  34.             USART_SendData(USART1,(u8)65); // A符号 的asicc码
  35.             while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);//等待数据发送
  36.         }
  37.         else // 假如读取到得值 !=6566 串口显示#字符
  38.         {
  39.             USART_SendData(USART1,(u8)35); // #符号 的asicc码
  40.             while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
  41.         }
  42.         delay_s(1);    //延时 1s
  43.     }
  44.     
  45.     return 0;
  46. }

  1. #ifndef __FLASH_H
  2. #define __FLASH_H

  3. #include "stm32f10x_flash.h"
  4. #include "stm32f10x_type.h"

  5. #define ADDR_BASE 0x0801F000         //存储数据Flash页首地址
  6. void SavePara(u32 addr,u32 data);
  7. u32 GetPara(u32 addr);

  8. #endif

  1. #include "flash.h"
  2. /*****************************************************************************************************
  3. ** 函数名称: SavePara()
  4. ** 函数描述: 保存参数
  5. ** 接口参数: addr,data
  6. ** 全局变量:
  7. ** 宏 定 义:ADDR_BASE
  8. ** 作 者:
  9. ** 日 期:
  10. ------------------------------------------------------------------------------------------------------
  11. ** 备注:每次写数据前得先擦除所要存储位置所在的整个页,这是和EEPROM的不同之处。Flash不具备修改功能,
  12.         只能先擦除再写,而擦除时,只支持页擦除。
  13.         addr地址范围:ADDR_BASE ~ADDR_BASE+1022
  14. *****************************************************************************************************/
  15. void SavePara(u32 addr,u32 data)
  16. {
  17.   FLASH_Unlock();             //每次擦除Flash中数据时得先解锁
  18.   FLASH_ErasePage(ADDR_BASE); //擦除页
  19.   FLASH_ProgramWord(addr,data);//写32位字
  20.   FLASH_Lock();                 //上锁
  21. }

  22. /*****************************************************************************************************
  23. ** 函数名称: GetPara()
  24. ** 函数描述: 读出参数
  25. ** 接口参数: addr 读取数据所在的Flash地址
  26. ** 全局变量:
  27. ** 宏 定 义:ADDR_BASE
  28. ** 引用函数:
  29. ** 作 者:
  30. ** 日 期:
  31. ------------------------------------------------------------------------------------------------------
  32. ** 备注: addr地址范围:ADDR_BASE ~ADDR_BASE+1022
  33. *****************************************************************************************************/
  34. u32 GetPara(u32 addr)
  35. {
  36.    u32 data;
  37.    data=(u32)(*(u32*)addr); //读取相应地址中的32位数据
  38.    return data;
  39. }


阅读(910) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~