打印
[STM32F4]

STM32F1\STM32F4\串口发送\数据强制转换,遇到个问题,求解

[复制链接]
1995|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
1477|  楼主 | 2017-2-20 14:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
       使用的是Keil uVision5,STM32F1向STM32F4发送数据,数据是一个自定义的结构体RTK_OPS_,图方便,直接在STM32F1中强制转换为字符串发送,STM32F4接收到完成字符串数据后,进行强制转换为结构体RTK_OPS_指针,得到完整数据,但是得到的指针数据赋值时却出错HardFault_Handler,这是为什么,是编译问题还有程序不对呢?

自定义的结构体:
typedef struct RTK_GPS_
{
        u8 Quality;
        double Lat_M;
        double Lon_M;
        double Alt_M;
        double TrackAngle;
        double Speed_M;
}RTK_GPS_;


STM32F1发送数据:
void Send_Gps_MCU1(void)
{
        #define RTK_GPS_SIZE 48
        #define GPS_HEAD_SIZE 3
       
        RTK_GPS_ GPS_Send_Data;
        u8 GPS_Head[GPS_HEAD_SIZE] = {'G','P','S'};
       
        GPS_Send_Data.Alt_M = RTK_GPS.Alt_M;
        GPS_Send_Data.Lat_M = RTK_GPS.Lat_M;
        GPS_Send_Data.Lon_M = RTK_GPS.Lon_M;
        GPS_Send_Data.Quality = RTK_GPS.Quality;
        GPS_Send_Data.Speed_M = RTK_GPS.Speed_M;
        GPS_Send_Data.TrackAngle = RTK_GPS.TrackAngle;
       
        Usart3.Send(GPS_Head,GPS_HEAD_SIZE);
        Usart3.Send((u8*)&GPS_Send_Data.Quality,RTK_GPS_SIZE);//STM32F1发送数据
}

STM32F4接收数据:
BOOL RTK_Read( u8 *StrAdd)
{
        RTK_GPS_ T1;

        RTK_GPS_* RTK_GPS_Temp;
        RTK_GPS_Temp = (RTK_GPS_*)StrAdd;
        T1= (*RTK_GPS_Temp);//运行到这出错,HardFault_Handler
        return True;
}


STM32F1是纯C语言程序,STM32F4是C和C++混合,STM32F4在线调试,通过RTK_GPS_Temp 指针能看到跟STM32F1一样的数据,但是赋值时T1= (*RTK_GPS_Temp),就出错了,跳到HardFault_Handler中断。请问这是什么原因呢。

沙发
airwill| | 2017-2-20 22:38 | 只看该作者
难道说结构体不能直接赋值.
有个问题, 我觉得你定义结构体的时候, 要考虑地址对齐的问题. 你试试, 很可能就出在这个地方

使用特权

评论回复
板凳
john_lee| | 2017-2-21 09:35 | 只看该作者
在复制大量数据时,可能会用到 ldm/stm、ldrd/strd 等指令,虽然 cortex-m3/m4 在访问存储器数据时不需要对齐,但这仅仅是 ldr/str 才行。而 ldm/stm 要求 32 位对齐,ldrd/strd 要求 64 位对齐。
我估计问题就出在传入的 StrAdd 参数没有对齐到 RTK_GPS_ 结构。
如果F4的接收缓冲区只接收 RTK_GPS_ 结构,那么应该定义为 RTK_GPS_ 结构变量,不要定义为字节数组。如果缓冲区还要接收其它类型的数据,那么可以定义为字节数组,但需要在定义时加一个aligned对齐修饰,例如:
uint8_t buffer[100] __attribute__((aligned (8)));   // buffer对齐到8字节


使用特权

评论回复
地板
s_f_tan| | 2017-2-21 09:51 | 只看该作者
同意楼上,应该是数据对齐出错了,stradd 这个地址你看下

使用特权

评论回复
5
1477|  楼主 | 2017-3-15 21:05 | 只看该作者
john_lee 发表于 2017-2-21 09:35
在复制大量数据时,可能会用到 ldm/stm、ldrd/strd 等指令,虽然 cortex-m3/m4 在访问存储器数据时不需要对 ...

问题解决了,是对齐问题,发过去的数据头是'G','P','S',强制转换的数据地址不是4倍对齐,数据头改成'G','P','S',‘A’就正常了,

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

12

帖子

1

粉丝