STM32单片机数据在内存中的存储方式
设一个数为 uint16_t a = 0x1234 ,它在单片机内存中的存放地址为 0x20000002,测0x20000002中存放0x34(低位),在
0x20000003中存放0x12(高位数)。基地址存放低位数据的这种方式叫做小端模式,可以理解为一个数据的最小位在前面。与之相反的把高位放在前面(基地址)的格式叫大端模式。一般的windows,linux,高大上的嵌入式CPU大多是大端模式。
那么小端模式的STM32单片机与大端模式的设备进行数据通讯时,就需要进行相应该的数据转换工作,下面以uint16 类型为例进行说明。直接上程序:
/* *************************************************************
* 测试程序
* 数据存取实验--16位小端储存格式数据转换成大端格式数据
*
*
***************************************************************/
static uint16_t Ui16ToUin8_P(uint16_t adata,uint16_t bdata)
{
uint16 m ;
m = adata;
bdata = adata >>8 & 0x0F; // 把高8位数据移到低位,并清除原高位
m = adata <<8 & 0x0F; // 把低8位数据移到高位,并精除原低位
bdata = bdata | m ; // 高低位合并成一个数据,交换完成
return bdata;
}
以上是小端转大端程序。实际应该中STM32 的HAL库的UART、USB CDC串口、I2C 发送函数都是8位指针,用这些函数是不能直接发送不同类型数据的,需要进行类型转换工作。
请看另一篇博文:把uint16_t 十六位类型数据转化成uint8_t 八位数据类型数据的两种方法
以uint16_t十六位数转接成 uint8_t 八位数的思路是,把十六位数的高低位进行拆分,并强制转换后保存在两个连续的指针或数组中。
(本文的目的是方便初学者,欢迎探讨。)