今天在进行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. 重写Checkbox 改写选择框的大小

    /* 作者:Starts_2000 * 日期:2009-07-30 * 网站:http://www.csharpwin.com CS 程序员之窗. * 你可以免费使用或修改以下代码,但请保留版权信息. ...

  2. 网络编程学习笔记一:Socket编程

    “一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. ——有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览 ...

  3. 【Hibernate】hibernate框架的搭建

    1, Hibernate 是什么 Hibernate是java应用程序与数据库交互的开发的框架. Hibernate是一个开源,轻量级的ORM(对象关系映射)工具. 2,Hibernate框架的优点 ...

  4. FreeSWITCH快速录音

    一.背景 测试人员反映FreeSWITCH录音不及时,需要大约5秒的时间才能捕获到RTP流. 二.原因及解决 查了下资料,FreeSWITCH默认的录音参数配置是开启缓冲的, 即RTP流大小到达655 ...

  5. Python 爬虫 数据清洗 去掉 超链接

    有时候我们需要清洗数据,里面有超链接,怎么去掉他们,比如下面的问题 , - January , </p></li><li </p><div " ...

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

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

  7. PHP的生成器、yield和协程

    虽然之前就接触了PHP的yield关键字和与之对应的生成器,但是一直没有场景去使用它,就一直没有对它上心的研究.不过公司的框架是基于php的协程实现,觉得有必要深入的瞅瞅了. 由于之前对于生成器接触不 ...

  8. Flume 相关

    在CentOS 7上安装配置Flume https://mos.meituan.com/library/41/how-to-install-flume-on-centos7/ Flume NG 学习笔 ...

  9. JDK1.7新特性,语言篇

    1. 可以用二进制表达数字 可以用二进制表达数字(加前缀0b/0B),包括:byte, short, int, long // 可以用二进制表达数字(加前缀0b/0B),包括:byte, short, ...

  10. React Native超棒的LayoutAnimation(布局动画)

          该文翻译自:https://medium.com/@Jpoliachik/react-native-s-layoutanimation-is-awesome-4a4d317afd3e#.6 ...