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 ...
随机推荐
- C++中四种类型转换方式(ynamic_cast,const_cast,static_cast,reinterpret_cast)
Q:什么是C风格转换?什么是static_cast, dynamic_cast 以及 reinterpret_cast?区别是什么?为什么要注意? A:转换的含义是通过改变一个变量的类型为别的类型从而 ...
- python学习笔记——git的安装及使用
1 git的基本介绍 git 是目前世界上最先进的分布式版本哦内阁制系统 详细信息可参考廖雪峰的官方网站中的Git教程 比git功能更加强大的有TortoiseGit和Tortoise SVN,具体安 ...
- RHEL7 禁用gnome-inital-setup
每次登陆系统后,都会跳出页面gnome-inital-setup 如果觉得讨厌,可以禁止该页面的出现: mkdir ~/.config echo "yes" >> ~/ ...
- ural 1091. Tmutarakan Exams(容斥)
http://acm.timus.ru/problem.aspx? space=1&num=1091 从1~s中选出k个数,使得k个数的最大公约数大于1,问这种取法有多少种. (2<=k ...
- Cassandra 2.x 提示“错误: 代理抛出异常错误: java.lang.NullPointerException”
这个问题多半是由于运行了多个Cassandra实例造成的错误,看cassandra的启动脚本中可发现这样的语句: # see CASSANDRA-7254 "$JAVA" -cp ...
- asp.net url址址中中文汉字参数传递乱码解决方法
中文乱码是网站开发中会常碰到的问题,今天我们来讲一下关于url址址中中文汉字参数传递乱码解决方法,有需要的朋友可以参考下.在cs文件里传参的时候用UrlEncode: Response.Redirec ...
- Knockout: 使用CSS绑定和event的blur失去焦点事件, 给未通过校验的输入框添加红色边框突出显示.
目的:使用knockout提供的机制实现输入框失去焦点后的校验工作,并使用CSS绑定给未通过校验的输入框添加红色边框突出显示. 步骤: 先在htm中添加.error的css样式, 并在输入框中的dat ...
- mapreduce 只使用Mapper往多个hbase表中写数据
只使用Mapper不使用reduce会大大减少mapreduce程序的运行时间. 有时候程序会往多张hbase表写数据. 所以有如题的需求. 下面给出的代码,不是可以运行的代码,只是展示driver中 ...
- C# delegate 委托
http://www.runoob.com/csharp/csharp-delegate.html
- talend hive数据导入到mysql中
thiveInput->tmap->tMysqloutput thiveInput: tmap: tmysqlOutput:注意编码问题:noDatetimeStringSync=true ...