参考手册显示STM32为小端格式,验证一下STM32的小端格式。 使用NUCLEO-F413ZH开发板,HAL生成相关代买。程序关键代码如下: //定义共用体 union{ uint16_t a; uint8_t b; } endian; //共用体赋值并输出结果 endian.a = 1; HAL_UART_Transmit_IT(&huart2,&endian.b, 1); 如果输出为1则为小端格式,输出为0则是大端格式。
继续扩展一下,如果是使用两个类型组成的结构体呢?关键代码如下: //定义共用体 union { struct { uint8_ta; uint16_tb; }sttest; uint8_tbyte[3]; }untest; //数据初始化 untest.byte[0] = 0; untest.byte[1] = 0; untest.byte[2] = 0; //untest.byte[3] = 0; //赋值 untest.sttest.a = 1; untest.sttest.b = 2; //输出验证 HAL_UART_Transmit_IT(&huart2,untest.byte, 3); 编译MDK不报错,下载后查看结果。 输出结果01 0002,按照小端格式,最后的untest.sttest.b应该是02 00才对,问题在哪? 让系统单独输出untest.sttest.a或者untest.sttest.b结果都是对的,后来百度下才知道原来结构体变量开辟空间时,使用占用空间最大的变量作为基准,即untest.sttest.a也开辟了两个字节,只不过一个字节空闲而已。调整程序如下: //定义共用体 union { struct { uint8_ta; uint16_tb; }sttest; uint8_tbyte[4]; }untest; //数据初始化 untest.byte[0] = 0; untest.byte[1] = 0; untest.byte[2] = 0; untest.byte[3] = 0; //赋值 untest.sttest.a = 1; untest.sttest.b = 2; //输出验证 HAL_UART_Transmit_IT(&huart2,untest.byte, 4); 程序下载后串口查看结果正确。 如果数据不初始化,则结果亦不正确,因为多开辟的空间在给untest.sttest.a赋值时没有被使用。
以上是本人在实用中发现的问题,与大家分享,共同提高。
|