在这边就不仔细介绍FALSH这个东西了,简而言之就是个存储数据的地方,比如每次完成一个任务,或者计数,就存储一下。但是在突然断电的时候可能会存不了(个人感觉只要每隔多久存一下,突然掉电也问题不大)
话不多说,直接上代码

flash.h

#ifndef _FLASH_H_
#define _FLASH_H_#define FLASH_KEY1               0X45670123 //在"stm32f10x_flash.c"中有定义
#define FLASH_KEY2               0XCDEF89AB //在"stm32f10x_flash.c"中有定义#include "sys.h"#define STM32_FLASH_SIZE 512  //  所选STM32的FLASH容量大小(单位为K) STM32的手册最后几页有一个:// Ordering information scheme,中可以看到芯片的FLSAH大小#if STM32_FLASH_SIZE < 256
#define STM_SECTOR_SIZE     1024                                       //字节
#else
#define STM_SECTOR_SIZE     2048
#endif//FLASH起始地址
#define STM32_FLASH_BASE 0x08000000     //STM32 FLASH的起始地址
#define STM32_FLASH_ADDR 0X08070000     //STM32 要开始写的地址必须为2的倍数,并且在flash地址范围内。u16 STMFLASH_ReadHalfWord(u32 faddr);   //读出半字
void STMFLASH_Write(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite); //从指定地址开始写入指定长度的数据
void STMFLASH_Read(u32 ReadAddr,u16 *pBuffer,u16 NumToRead);    //从指定地址开始读取指定长度的数据#endif

flash.c

#include "stm32f10x.h"
#include "delay.h"
#include "flash.h"//读出指定地址的半字(16位数据)
//faddr:读地址(此地址必须为2的倍数!!)
//返回值:对应数据.
u16 STMFLASH_ReadHalfWord(u32 faddr)
{return *(vu16*)faddr;
}//不检查的写入:      //WriteAddr:起始地址//pBuffer:数据指针//NumToWrite:半字(16位)数
void STMFLASH_Write_NoCheck (u32 WriteAddr, u16 *pBuffer, u16 NumToWrite)
{u16 i;for(i=0; i<NumToWrite; i++){FLASH_ProgramHalfWord(WriteAddr, pBuffer[i]);//    写入半个字=2个字节WriteAddr += 2;//  地址增加2.}
}
//从指定地址开始写入指定长度的数据:     //WriteAddr:    起始地址(此地址必须为2的倍数!!)//pBuffer:        数据指针//NumToWrite:   半字(16位)数(就是要写入的16位数据的个数.)
u16 STMFLASH_BUF [STM_SECTOR_SIZE / 2]; //定义一个数组 最多是2K字节,如果是小容量的则最多是1K
void STMFLASH_Write(u32 WriteAddr, u16 *pBuffer, u16 NumToWrite)
{u32 secpos;             //扇区地址u16 secoff;             //扇区内偏移地址(16位字计算)u16 secremain;          //扇区内剩余地址(16位字计算)u16 i;                 //计数 iu32 offaddr;            //去掉0X08000000后的地址if((WriteAddr < STM32_FLASH_BASE) || (WriteAddr >= (STM32_FLASH_BASE + 1024 * STM32_FLASH_SIZE))) //如果写的地址大于或小于这个flash地址,就直接跳出。{return;//非法地址}FLASH_Unlock();                                    //解锁offaddr = WriteAddr - STM32_FLASH_BASE;            //实际偏移地址.secpos = offaddr / STM_SECTOR_SIZE;           //扇区地址secoff= ( offaddr % STM_SECTOR_SIZE ) / 2;   //在扇区内的偏移(2个字节为基本单位.)secremain = STM_SECTOR_SIZE / 2 - secoff;     //扇区剩余空间大小if(NumToWrite <= secremain)                       //如果要输入数据的个数小于剩余的空间容纳的个数    {secremain = NumToWrite;                       //让扇区剩余空间大小等于输入数据的个数}while(1){STMFLASH_Read(secpos * STM_SECTOR_SIZE + STM32_FLASH_BASE, STMFLASH_BUF, STM_SECTOR_SIZE / 2);//读出整个扇区的内容        for(i=0; i < secremain; i++)  //校验数据  {if(STMFLASH_BUF[secoff + i] != 0XFFFF)                   //如果数据不是0xFFFF,则需要擦除{break;}}if(i < secremain)                                           //需要擦除{FLASH_ErasePage(secpos * STM_SECTOR_SIZE + STM32_FLASH_BASE);//擦除这个扇区for(i=0; i < secremain; i++)                             {STMFLASH_BUF[i + secoff] = pBuffer[i];               //将要写入的数组复制到定义的数组中}STMFLASH_Write_NoCheck(secpos * STM_SECTOR_SIZE + STM32_FLASH_BASE, STMFLASH_BUF, STM_SECTOR_SIZE / 2);//写入整个扇区} else STMFLASH_Write_NoCheck(WriteAddr,pBuffer,secremain);  //如果不需要擦除,直接写入扇区剩余区间.if(NumToWrite == secremain)break;                                                //写入结束else                                                          //写入未结束{secpos++;                                                 //扇区地址增1secoff=0;                                              //偏移位置置0pBuffer += secremain;                                 //指针偏移WriteAddr += secremain;                                 //写地址偏移NumToWrite -= secremain;                                //字节(16位)数递减if(NumToWrite > (STM_SECTOR_SIZE / 2))                   //下一个扇区还是写不完{   secremain = STM_SECTOR_SIZE / 2;                   //进入下一个扇区}else secremain=NumToWrite;                               //下一个扇区可以写完了}};FLASH_Lock();                                                    //上锁
}//从指定地址开始读取指定长度的数据
//ReadAddr:起始地址
//pBuffer:数据指针
//NumToWrite:半字(16位)数
void STMFLASH_Read(u32 ReadAddr,u16 *pBuffer,u16 NumToRead)
{u16 i;for(i=0; i<NumToRead; i++){pBuffer[i]=STMFLASH_ReadHalfWord(ReadAddr);               //读取2个字节.ReadAddr+=2;                                              //偏移2个字节}
}

实战也很简单,定义一个16位的数组,将想要的数据存在数组里。举个例子:

#define STM32_FLASH_ADDR 0x08060000  //定义写入地址
u16 temp[2] = {12,1234} //定义一个数组
STMFLASH_Write(STM32_FLASH_ADDR,temp,2); // 将temp的第0个和第1个的数据存到FLASH中
STMFLASH_Read(STM32_FLASH_ADDR,time,2); // 将temp的第0个和第1个的数据从FLASH中读出来

STM32F103的FLASH代码相关推荐

  1. flash代码_Flash如何对制作文件进行优化

    对FLASH进行优化分为两方面,一方面是代码上的优化,主要是通过优化提高FLASH性能,降低CPU占用和内存使用.另一方面是资源的优化,这方面的优化是为了减小编译后的文件大小以及制作文件的大小,因为如 ...

  2. Edge 浏览器有秘密白名单,允许 Facebook 运行 Flash 代码

    开发四年只会写业务代码,分布式高并发都不会还做程序员?   Microsoft Edge 浏览器包含了一个秘密的白名单,允许 Facebook 运行 Adobe Flash 代码.白名单允许 Face ...

  3. 在html里面加入flash,如何在HTML页面插入flash代码

    如何在HTML页面插入flash代码 swliveconnect 属性 值: true | false 说明: (可选)指定第一次加载 Flash Player 时浏览器是否应启动 Java.如果忽略 ...

  4. FLASH代码初级教程

    1 FLASH代码初级教程   前几个都是我贴的整理到一个帖子里大家看着方便 本文转自 http://coolcodes.cn/bencandy.php?fid-5-id-24-page-1.htm ...

  5. 鼠标跟随flash代码_FLASH如何制作密码锁功能(AS3)

    不管是电影还是电视中,都会经常有密码锁功能,就是按几个数字键,打开保险箱或门,在这里我们制作一个按正确密码打开门的效果. 主要知识点:数组使用,鼠标事件. 工具/原料:FLASH CS3及以上版本软件 ...

  6. STM32F103 SPI flash操作注意事项

    之前一直使用的W25Q16 spi flash都没问题,换了一款W25Q80后发现工作不正常,经过测试,初步定位到问题在于初始化SPI后是否将CS拉高.于是又去查看了一下原厂代码: 发现原厂的代码初始 ...

  7. 能在手机播放的Flash代码

    有些使用Flash的广告图片变换代码在手机不支持,在网上搜到了一个解决的方法: Flash嵌入处: <iframestyle="width:474px;height:276px; bo ...

  8. html中插入flash代码详解

    一:代码解释 代码: <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase=" ...

  9. Flash代码加密解决方法

    要想对Flash做到完全加密那是不可能的事,谁叫Adobe发布了swf文件的标准-- 这里不讨论防止网页下载swf文件的各种办法,只将下常用加密和解密软件的使用. 常用的Flash解密软件是硕思闪客精 ...

最新文章

  1. 【C++】枚举类型应用
  2. 清华大学:刘洋——基于深度学习的机器翻译
  3. 算法练习:将字符串中所有的空格替换为'%20'(只用基本数据结构)
  4. js return的值取不到_【JS基础】隐式转换(一)
  5. jupyter kernel_新乡联通案例分享:Jupyter开发环境配置的常用技巧
  6. 简单粗暴地开个十层循环(洛谷P2089题题解,Java语言描述)
  7. 用Python批量修改图片名称(后缀)
  8. 机器学习PAI快速入门
  9. coreldraw水涟漪怎么做_不懂怎么挑选水处理设备?跟贝斯沃了解这3点再做决定,轻松挑出适合自己的...
  10. 论如何快速的培养一个软件测试工程师出来
  11. 中国电网计算机面试题目,国家电网面试经验
  12. 学习笔记—网络规划和设计
  13. TF-IDF算法简介
  14. 刷题day_12:快乐数
  15. 一男老师每日百词转载+连载(3)
  16. LINUX基础CAN指令及常见操作
  17. 基于Qt的上古神器-Qt Cryptographic Architecture (QCA)加密库介绍
  18. lap.lapjv函数cost_limit参数
  19. osg for android 学习之五:场景漫游
  20. C语言之联合体通用变量类型之妙用

热门文章

  1. Java_Hive自定义函数_UDF函数清洗数据_清洗出全国的省份数据
  2. Java中的Type
  3. VC_SkinMagic使用方法总结
  4. 杭州某B2B软件公司面试题
  5. clickhouse连接问题解决:Code: 210. DB::NetException: I/O error: Broken pipe, while writing to socket
  6. win7本地连接状态信息空白的解决方法
  7. 【质量评价】Inferring Point Cloud Quality via Graph Similarity 基于图相似性的点云质量评价
  8. php积极心理学交流学习网站 毕业设计源码100623
  9. 关于保险,我把近期的研究成果都免费和盘托出
  10. 电商4.0来了,你看懂了吗,通证经济又是一个大的风口红利