今天在进行STM32内部falsh存储的时候,发现固件库历程的函数原型是这样的:

第一个是地址,在我的STM32中是2K一页的,第二个是要写入的数据。

问题就来了,存储一个小数该怎么办呢?固件库给的是整形数据啊!

三种解决办法:

第一:最具大众性的

把小数乘以系数放大,当做整数存储,然后再除以放大系数得到小数本身。例如 float  a=1.23; int b=a*100;把b存进去,取出来的时候再除以100,就可以得到小数a了。这是最简单可能也是最好想到的了,但同时,这也是最麻烦的了。稍有C语言基础的都不会选择这个方式,所以pass 掉了。

第二:基础扎实性的

不管你说小数,还是整数,在内存中的二进制表述形式都是0或1的组合,关键就在于怎么去解析,这里也不去说符合

IEEE 754什么规范了,记住就是,C语言中float 4字节,double 8字节。在笔者的IDE上,指针是4字节的。
所以,我们可以这样调用ST的库函数:
eg:
Address为内部flash的一个地址;
float  a=1.23;
FLASH_ProgramWord(Address,*(volatile uint32_t *)&a);
先对a取地址,然后把这个地址强转成uint32_t *类型,再解引用,此时编译器会按照整形的规则去解读这个地址的内容,
但是最后在取出这个地址的内容时,我们这样:
*(__IO float*) Address
首先是把地址转换成float *类型,然后解引用,编译器就会按照float的规则取解读这个地址里的内容了,这样就可以存储小数了。
第三种:创新深思性的
C语言中,有一个东西叫做联合,union。同样列举上面的例子 float数据a;
建立联合体如下:

union test
{
  float a;
  uint32_t b;
}Test;

Test.a=1.23;
你不是说ST库函数是uint32_t(4字节)类型的吗?那好,我就用联合体来给你存,
FLASH_ProgramWord( Address,Test.b);这样进行存储,联合体的实质还是第二种方式的理论。
读取flash数据的时候,也是直接按照库函数读取:
*(__IO uint32_t*) Address
但是,这样的数据可以直接和Test.b比较,看看是否相等,相等证明写入和读取一致,是成功的。当我们想用float数据的时候,
直接使用Test.a。 Summary:
活学活用C语言,带着创造性去研究,方能看到些许 Linus Torvalds的思维。
												

STM32内部flash存储小数——别样的C语言技巧的更多相关文章

  1. STM32 内部flash的读写程序

    ​ /* Base address of the Flash sectors */ #define ADDR_FLASH_SECTOR_0 ((uint32_t)0x08000000) /* Base ...

  2. stm32 内部flash

    嵌入式闪存 闪存存储器有主存储块和信息块组成 大容量产品主存储块最大为64K×64位,每个存储块划分为256个2K字节的页 编程和擦除闪存 闪存编程一次可以写入16位(半字) 闪存擦除操作可以按页面擦 ...

  3. STM32学习笔记:读写内部Flash(介绍+附代码)

    一.介绍 首先我们需要了解一个内存映射: stm32的flash地址起始于0x0800 0000,结束地址是0x0800 0000加上芯片实际的flash大小,不同的芯片flash大小不同. RAM起 ...

  4. 第50章 读写内部FLASH—零死角玩转STM32-F429系列

    第50章     读写内部FLASH 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fire ...

  5. stm32 flash 存储

    转载自: http://bbs.elecfans.com/jishu_388272_1_1.html 说到STM32的FLSAH,我们的第一反应是用来装程序的,实际上,STM32的片内FLASH不仅用 ...

  6. STM32 对内部FLASH读写接口函数

    因为要用内部FLASH代替外部EEPROM,把参数放在STM32的0x08000000+320K处,其中20K是bootloader,300K是应用程序. 原理:先要把整页FLASH的内容搬到RAM中 ...

  7. STM32 对内部FLASH读写接口函数(转)

    源:STM32 对内部FLASH读写接口函数 因为要用内部FLASH代替外部EEPROM,把参数放在STM32的0x08000000+320K处,其中20K是bootloader,300K是应用程序. ...

  8. 【转】STM32擦除内部FLASH时间过长导致IWDG复位分析

    @20119-01-29 [小记] STM32擦除内部FLASH时间过长导致IWDG复位分析

  9. STM32 实现内部Flash的读写(HAL库版)

    Flash 中文名字叫闪存,是一种长寿命的非易失性(断电数据不丢失)的存储器.可以对称为块的存储器单元块进行擦写和再编程,在进行写入操作之前必须先执行擦除.一个Nand Flash由多个块(Block ...

随机推荐

  1. Rplidar学习(一)—— 开发套件初识

    一.简介 RPLIDAR A1 开发套装包含了方便用户对 RPLIDAR A1 进行性能评估和早期开发所需的配套工具. 用户只需要将 RPLIDAR A1 模组与 PC 机连接,即可在配套的评估软件中 ...

  2. dubbo 学习(5) dubbo多协议和多注册中心

    转载 http://blog.csdn.net/songjinbin/article/details/49498431 一.配置dubbo多协议模式 1.默认协议 Dubbo缺省协议采用单一长连接和N ...

  3. Android--ListView 分割线

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout ...

  4. 【Oracle】详解Oracle中NLS_LANG变量的使用

    目录结构: contents structure [+] 关于NLS_LANG参数 NSL_LANG常用的值 在MS-DOS模式和Batch模式中设置NLS_LANG 注册表中NLS_LANG和系统环 ...

  5. spark运行模式

    一.Spark运行模式 Spark有以下四种运行模式: local:本地单进程模式,用于本地开发测试Spark代码; standalone:分布式集群模式,Master-Worker架构,Master ...

  6. mac mini 制作fusion drive 的方法

    下载yosemite,格式化磁盘,运行如下命令,制作os x 启动盘   sudo /Applications/Install\ OS\ X\ Yosemite.app/Contents/Resour ...

  7. Openssl aes加解密例程

    原文链接: http://blog.csdn.net/itmes/article/details/7714854 假设我们已经下载了 openssl的源码,并成功编译,设置好了编程环境. 我们现在来看 ...

  8. 三角函数 与 JavaScript

    三角函数   canvas 和 JavaScript 中所有与角相关的API如Math.sin().Math.cos().Math.tan(),都需要以弧度为单位值.但大部分人还是习惯以角度单位.所以 ...

  9. MIUI 们的发展蓝图:“罪恶”秘密背后的金钱和机遇

    (原文来自 AllThingsD)   听起来有点唬人,但是移动变革的确是这个时代最大的一次技术平台升级事件.这场趋势实在太浩大,不断地循环往复,对于创业者(还有像我这样的投资人来说),则意味着令人激 ...

  10. 引文分析工具HistCite使用简介

    运行环境: win8.1(lenovo Y450) 1.去www.histcite.com下载histcite最新版,并安装 2.去WOS下载文献.保存方式为: 记录数: 记录1至500(最大支持50 ...