STM32内部flash存储小数——别样的C语言技巧
今天在进行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语言技巧的更多相关文章
- STM32 内部flash的读写程序
/* Base address of the Flash sectors */ #define ADDR_FLASH_SECTOR_0 ((uint32_t)0x08000000) /* Base ...
- stm32 内部flash
嵌入式闪存 闪存存储器有主存储块和信息块组成 大容量产品主存储块最大为64K×64位,每个存储块划分为256个2K字节的页 编程和擦除闪存 闪存编程一次可以写入16位(半字) 闪存擦除操作可以按页面擦 ...
- STM32学习笔记:读写内部Flash(介绍+附代码)
一.介绍 首先我们需要了解一个内存映射: stm32的flash地址起始于0x0800 0000,结束地址是0x0800 0000加上芯片实际的flash大小,不同的芯片flash大小不同. RAM起 ...
- 第50章 读写内部FLASH—零死角玩转STM32-F429系列
第50章 读写内部FLASH 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fire ...
- stm32 flash 存储
转载自: http://bbs.elecfans.com/jishu_388272_1_1.html 说到STM32的FLSAH,我们的第一反应是用来装程序的,实际上,STM32的片内FLASH不仅用 ...
- STM32 对内部FLASH读写接口函数
因为要用内部FLASH代替外部EEPROM,把参数放在STM32的0x08000000+320K处,其中20K是bootloader,300K是应用程序. 原理:先要把整页FLASH的内容搬到RAM中 ...
- STM32 对内部FLASH读写接口函数(转)
源:STM32 对内部FLASH读写接口函数 因为要用内部FLASH代替外部EEPROM,把参数放在STM32的0x08000000+320K处,其中20K是bootloader,300K是应用程序. ...
- 【转】STM32擦除内部FLASH时间过长导致IWDG复位分析
@20119-01-29 [小记] STM32擦除内部FLASH时间过长导致IWDG复位分析
- STM32 实现内部Flash的读写(HAL库版)
Flash 中文名字叫闪存,是一种长寿命的非易失性(断电数据不丢失)的存储器.可以对称为块的存储器单元块进行擦写和再编程,在进行写入操作之前必须先执行擦除.一个Nand Flash由多个块(Block ...
随机推荐
- 系统监控nagios–安装
安装:环境:CentOS6.0 32bit 1.先相关软件包 yum install httpd php gcc glibc glibc-common gd gd-devel make 2.创建用户信 ...
- Jetty安装配置
1) 从官方网站下载绿色版的jetty 下载地址:http://download.eclipse.org/jetty/ 我下载的是 jetty-distribution-7.5.4.v20111024 ...
- ROS学习(八)—— 理解ROS服务和参数
一.ROS 服务 服务(services)是节点之间通讯的另一种方式.服务允许节点发送请求(request) 并获得一个响应(response) 二.rosservice 1.用途 rosservic ...
- 【MongoDB】MongoDB的一些操作命令
我们首先应该知道MongoDB的数据结构:MongoDB:库-->集合-->JSON对象 查看 show dbs //查看有哪些库 show collections //查看库中有哪 ...
- List元素排序简例
前言:这种处理方式,在程序中偶尔会用的到,栗子很简单,关键是加强一下记忆,以及以备后用 1:实现Comparable接口的方式 1-1:没有使用泛型,重写compareTo()方法时需要判断类型及转换 ...
- 替换SQL字段中的换行符,回车符
替换SQL字段中的换行符,回车符: 在富文本内容中通常会出现回车.换行内容.在sql数据库中这些回车.换行符,输出html后,表现为空格. 这里是在数据导出.导入中发现的,通常把回车.换行符找出来,用 ...
- android View未渲染时获得高度
ViewTreeObserver vto = tv.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new OnGlobalLayoutLis ...
- Android App解决卡顿慢之内存抖动及内存泄漏(发现和定位)
内存抖动是指在短时间内有大量的对象被创建或者被回收的现象,内存抖动出现原因主要是频繁(很重要)在循环里创建对象(导致大量对象在短时间内被创建,由于新对象是要占用内存空间的而且是频繁,如果一次或者两次在 ...
- Fiddler高级用法-抓取手机app数据包
在上一篇中介绍了Fiddler的基本使用方法.通过上一篇的操作我们可以直接抓取浏览器的数据包.但在APP测试中,我们需要抓取手机APP上的数据包,应该怎么操作呢? Andriod配置方法 1)确保手机 ...
- Mysql show processlist 排查问题
一.命令概述: mysql show full processlist 用来查看当前线程处理情况,具体信息请参考官网:https://dev.mysql.com/doc/refman/5.7/en/s ...