[应用相关] STM32之怪现象-存储结构篇

[复制链接]
4877|17
 楼主| tsx1983 发表于 2008-11-12 16:09 | 显示全部楼层 |阅读模式
闲来没事,写了个测试STM32存储结构的程序,
如下:
void OSWriteUsart(u8 UsartNum,u8 *Buf,,u16 Len);
具体代码就不写了,就是将Buf里的字节通过串口发送Len个.

    u32 tmp;
    tmp=0x11223344;
    OSWriteUsart(USART0,(u8 *)&tmp,sizeof(tmp));

用串口接收程序接收竟然收到44 11 22 33
香水城 发表于 2008-11-12 16:11 | 显示全部楼层

你的程序搞错了吧?

 楼主| tsx1983 发表于 2008-11-12 16:12 | 显示全部楼层

改一下

    u16 tmp;
    tmp=0x1122;
    OSWriteUsart(USART0,(u8 *)&tmp,sizeof(tmp));

  串口接收程序收到11 22
winloop 发表于 2008-11-12 16:17 | 显示全部楼层

“用串口接收程序”

什么东东?是不是它的问题?
 楼主| tsx1983 发表于 2008-11-12 16:17 | 显示全部楼层

再改改

typedef struct
{
 u8 Hour;
 u8 Minute;
 u8 Second;
}TIME_TYPE_DEF;

TIME_TYPE_DEF Time_t;
Time_t.Hour=1;
Time_t.Minute=2;
Time_t.Second=3;
OSWriteUsart(USART0,(u8 *)&Time_t,sizeof(Time_t));
串口接收程序收到 03 01 02
 楼主| tsx1983 发表于 2008-11-12 16:20 | 显示全部楼层

晕,怎么可能是我的程序问题呢。

都搞了那么长时间了不可能犯这种错误的。
因为这样就对。

u8 tmp[5]={1,2,3,4,5};
OSWriteUsart(USART0,(u8 *)&tmp,sizeof(tmp));

接收到 01 02 03 04 05
 楼主| tsx1983 发表于 2008-11-12 16:22 | 显示全部楼层

再这样也对

typedef struct
{
u16 Hour;
u16 Minute;
u16 Second;
}TIME_TYPE_DEF;

TIME_TYPE_DEF Time_t;
Time_t.Hour=1;
Time_t.Minute=2;
Time_t.Second=3;
OSWriteUsart(USART0,(u8 *)&Time_t,sizeof(Time_t));
串口接收程序收到 00 01 00 02 00 03
香水城 发表于 2008-11-12 16:23 | 显示全部楼层

看看你的函数OSWriteUsart()

估计是这个函数在搞鬼。

另外,试试把你程序中的tmp变量改为全局变量。
barboon 发表于 2008-11-12 16:26 | 显示全部楼层

那是因为STM32是LSB的

你写
u32 tmp = 0x11223344;
在内存里的存储顺序依次是 0x44 0x33 0x22 0x11

如果写u8 tmp[4] = {0x11, 0x22, 0x33, 0x44}
在内存里的存储顺序依次是 0x11 0x22 0x33 0x44

USART顺次8位8位发数据
就会有这种现象,写程序的时候要注意的。
 楼主| tsx1983 发表于 2008-11-12 16:29 | 显示全部楼层

问9楼

9楼的ARM7也有这个现象?如何解决的?
vigia 发表于 2008-11-12 16:29 | 显示全部楼层

LZ测试存储结构不用这么麻烦吧

定义一个变量,用watch窗口赋个值,看看地址,然后去memory窗口看实际每个地址的值就可以了,不可能存在你说的错误的。

比如u32 tmp=0x11223344,存储器中是44,33,22,11
u16 tmp = 0x1122,存储器中是22,11,符合little endian的定义。

不过
typedef struct
{
u8 Hour;
u8 Minute;
u8 Second;
}TIME_TYPE_DEF; 
这个不好说,最好加个#pragma pack(1)

 楼主| tsx1983 发表于 2008-11-12 16:32 | 显示全部楼层

回10楼

问题是他输出的是44 11 22 33
 楼主| tsx1983 发表于 2008-11-12 16:33 | 显示全部楼层

至于香主说的我的函数问题

晚上我回去直接调用ST的库试下就知道了
 楼主| tsx1983 发表于 2008-11-12 16:36 | 显示全部楼层

为什么输出u8 的数组就好使呢

我用的是DMA传输方式
vigia 发表于 2008-11-12 16:40 | 显示全部楼层

对了,LZ用的什么compiler?

 楼主| tsx1983 发表于 2008-11-12 17:12 | 显示全部楼层

回楼上

用的KEIL。
手头有板子的也可以测一测,到底是我个人问题还是都是这样的
 楼主| tsx1983 发表于 2008-11-12 19:12 | 显示全部楼层

还是我的错

不好意思,还是我的错。用的UCOS,通过DMA发送,当发送完毕的时候DMA发生中断通知任务已经发送完成,这时候任务把串口时钟关闭了,但发送是有一个过程的,DMA发生中断的时候最后那个字符并没发送完毕。导致最后一个字节总是没有发出来,总是在第二次发送前发出来了。这样本来应该发出44 33 22 11除了第一次发送少一个字节外,后面每次都发送11 44 33 22。一时粗心,没看出来。因为之前发送的字符串,后面有个结束符,所以初一看是正确的。
walnutcy 发表于 2008-11-13 00:13 | 显示全部楼层

呵呵,路过,,

您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

160

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部