在计算机中,数据类型是取决于解码的方式,而在内存中保存的数据,并不会因为解码方式发生改变。
eg:1111 1111 8位数据。当用 uint8_t 来解析时,值为255,而当用 int8_t 来解析时,值为-128。
浮点数:在目前绝大多数机器中,float 类型占据4字节。
我们在利用EEPROM保存浮点数时,实际上就是直接把数据存进去,然后再以 float 类型解析出来。这几种的一个关键的地方,就是在利用I2C发送数据时,利用void *进行强制类型转换,把原来long double和int类型的数据转换成不确定类型的指针。然后一个一个字节的发送就可以。最后,浮点数以%f读出,整数以%d读出。
本博客参考野火stm32的相关代码
/* 精髓在于void *强制类型转换,转成无类型指针 */
/*写入小数数据到地址10*/
I2C_EE_BufferWrite((void*)double_buffer,DOUBLE_ADDR, sizeof(double_buffer));
/*写入整数数据到地址60*/
I2C_EE_BufferWrite((void*)int_bufffer, LONGINT_ADDR, sizeof(int_bufffer));
/* 读出数据的操作也一样,void *类型转换 */
/*读取小数数据*/
I2C_EE_BufferRead((void*)double_buffer, DOUBLE_ADDR, sizeof(double_buffer));
/*读取整数数据*/
I2C_EE_BufferRead((void*)int_bufffer, LONGINT_ADDR, sizeof(int_bufffer));
void * 为 “不确定类型指针”,void *可以用来声明指针。用void* 定义一个void类型的指针,它不指向任何类型的数据,意思是,void*指针“指向空类型”或“不指向确定的类型”,而不要理解为void*指针能指向“任何的类型”数据。简而言之:void*只提供一个地址,没有指向。
#include "stm32f10x.h"
#include "./usart/bsp_usart.h"
#include "./i2c/bsp_i2c_ee.h"
#include "./led/bsp_led.h"
#include uint8_t cal_flag = 0; uint8_t k; /*存储小数和整数的数组,各7个*/ long double double_buffer[7] = {0}; int int_bufffer[7] = {0}; #define DOUBLE_ADDR 10 #define LONGINT_ADDR 70 /** * @brief 主函数 * @param 无 * @retval 无 */ int main(void) { LED_GPIO_Config(); /* 串口初始化 */ USART_Config(); printf("rn 这是一个EEPROM 读写小数和长整数实验 rn"); /* I2C 外设初(AT24C02)始化 */ I2C_EE_Init(); /*读取数据标志位*/ I2C_EE_BufferRead(&cal_flag, 0, 1); if( cal_flag != 0xCD ) /*若标志等于0xcd,表示之前已有写入数据*/ { printf("rn没有检测到数据标志,FLASH没有存储数据,即将进行小数写入实验rn"); cal_flag =0xCD; /*写入标志到0地址*/ I2C_EE_BufferWrite(&cal_flag, 0, 1); /*生成要写入的数据*/ for( k=0; k<7; k++ ) { double_buffer[k] = k +0.1; int_bufffer[k]=k*500+1 ; } /*写入小数数据到地址10*/ I2C_EE_BufferWrite((void*)double_buffer,DOUBLE_ADDR, sizeof(double_buffer)); /*写入整数数据到地址60*/ I2C_EE_BufferWrite((void*)int_bufffer, LONGINT_ADDR, sizeof(int_bufffer)); printf("向芯片写入数据:"); /*打印到串口*/ for( k=0; k<7; k++ ) { printf("小数tx = %LFrn",double_buffer[k]); printf("整数tx = %drn",int_bufffer[k]); } printf("rn请复位开发板,以读取数据进行检验rn"); } else { printf("rn检测到数据标志rn"); /*读取小数数据*/ I2C_EE_BufferRead((void*)double_buffer, DOUBLE_ADDR, sizeof(double_buffer)); /*读取整数数据*/ I2C_EE_BufferRead((void*)int_bufffer, LONGINT_ADDR, sizeof(int_bufffer)); printf("rn从芯片读到数据:rn"); for( k=0; k<7; k++ ) { printf("小数 rx = %LF rn",double_buffer[k]); printf("整数 rx = %d rn",int_bufffer[k]); } } while (1); }
上一篇: stm32专题十四:存储器介绍
下一篇:stm32专题十八:SPI协议
推荐阅读
史海拾趣
2015年,随着恩智浦和飞思卡尔的合并,恩智浦决定将其射频业务剥离出来。这一决策旨在使两家公司能够更专注于各自的核心业务,同时也为射频业务的发展打开新的篇章。安谱隆作为这一剥离业务的承接者,应运而生。此次剥离不仅为安谱隆带来了丰富的技术资源和市场基础,也为其未来的发展奠定了坚实的基础。
近年来,网络游戏市场呈现出蓬勃发展的态势,C-MEDIA公司也看到了其中的商机。于是,公司通过收购C&C Media,进一步深入日本网络游戏市场。这次收购不仅帮助C-MEDIA公司把握了该市场的成长机遇,也有效地拓展了其海外运营实力。C&C Media旗下的网络游戏门户网站“MK-STYLE”为个人用户提供了丰富的网络游戏服务,进一步巩固了C-MEDIA在网络游戏领域的市场地位。
Avic公司注重提升自主创新能力,不断加大在航空电子技术领域的研发投入。公司建立了一支高素质的研发团队,并积极引进国内外先进的研发设备和技术。这些措施有效提升了公司的创新能力,为公司在航空电子领域的持续发展提供了有力保障。
随着全球市场的开放和融合,Coil-Q意识到国际化是公司发展的必然趋势。于是,公司开始积极布局海外市场,先后在多个国家和地区设立了分公司或办事处。通过深入了解当地市场需求和文化习惯,Coil-Q成功打开了多个新的市场,实现了业务的快速增长。
2020年4月,ABLIC成为MinebeaMitsumi集团的一员。这一合作对于ABLIC来说具有重要意义。MinebeaMitsumi集团作为一家在电子元器件领域具有强大实力的企业,为ABLIC提供了更广阔的发展空间和资源支持。通过融入MinebeaMitsumi集团的“八矛战略”,ABLIC的模拟半导体业务得到了进一步提升,其在集团内部的地位也愈发重要。
随着电子行业的快速发展和市场竞争的加剧,Dearborn Electronics Inc.面临着诸多挑战。为了保持竞争优势,公司不断进行转型升级,推出了一系列具有更高性能、更小尺寸、更低成本的新产品。同时,公司也积极拓展新的应用领域和市场,寻找新的增长点。
定制OS, 选择了 MUI 和 英文和中文字体, 默认语言是中文 可调用 createmui 0409 命令后 输出如下, 输出完成后,提示找不到文件,麻烦大侠们给个提示,谢谢 Multiui.bib文件内容为空, ; ; Copyright (c) Microsoft Corporation.   ...… 查看全部问答∨ |
我搜了一些做ARM开发板的公司,甚少有支持wince6.0的开发板在卖。立宇泰、友善之臂、扬创、周立功、英蓓特等都没找到一块。优龙也是在最近才出了一款LPC3250的板子有wince6.0,但是驱动还没有做全。搜到有两家卖S3C6410X和S3C6400开发板的公司,海 ...… 查看全部问答∨ |
BUILDREL: Copying PLATFORMCOMMON binaries from C:\\WINCE600\\platform\\common Can\'t create hard link. (FAT file system?) Copying files instead of creating hard links. 编译到最后的时候,出现这样几个错误?? 这是什么 ...… 查看全部问答∨ |
我有个动态链接库,头文件里定义了结构体和函数名 struct FvFixed { CString m_str; public: friend FvFixed const operator+(const FvFixed x, const ...… 查看全部问答∨ |
本公司招聘硬件工程师,从事检测仪器开发。关注于弱信号的采集、整理和放大。 1. 本科及以上学历; 2. 电子、自动化、硬件电路设计、检测技术等相关专业; 3. 有CPLD或FPGA开发经验者优先; 4.&nbs ...… 查看全部问答∨ |
1、模拟量值和A/D转换值的转换假设模拟量的标准电信号是A0—Am(如:4—20mA),A/D转换后数值为D0—Dm(如:6400—32000),设模拟量的标准电信号是A,A/D转换后的相应数值为D,由于是线性关系,函数关系A=f(D)可以表示为数学方程: &nb ...… 查看全部问答∨ |
最近在学习使用STM32的ADC,单ADC已经调试成功了,LCD可以显示实际波形。 看到有双ADC快速交替模式,可以提高一倍的速度,就改为该模式,用二个ADC采样同一个输入。 但是无论如何都调试不出来,只有ADC1的值,没有ADC2的值。 看了论坛几乎 ...… 查看全部问答∨ |
各位大虾:我在DM642里面对TLV320AIC23进行Transmit操作时,遇到一个问题。代码如下,各同步时钟信号AFSX、ACLKX、AHCLKX由AIC23提供。 MCASP_ConfigSrctl MysrctlRegs = { 0x00000009, //AXR00=Xmt &nbs ...… 查看全部问答∨ |