打印
[应用相关]

STM32之怪现象-存储结构篇

[复制链接]
3985|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 | 只看该作者

“用串口接收程序”

什么东东?是不是它的问题?

使用特权

评论回复
5
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

使用特权

评论回复
6
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

使用特权

评论回复
7
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

使用特权

评论回复
8
香水城| | 2008-11-12 16:23 | 只看该作者

看看你的函数OSWriteUsart()

估计是这个函数在搞鬼。

另外,试试把你程序中的tmp变量改为全局变量。

使用特权

评论回复
9
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位发数据
就会有这种现象,写程序的时候要注意的。

使用特权

评论回复
10
tsx1983|  楼主 | 2008-11-12 16:29 | 只看该作者

问9楼

9楼的ARM7也有这个现象?如何解决的?

使用特权

评论回复
11
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)

使用特权

评论回复
12
tsx1983|  楼主 | 2008-11-12 16:32 | 只看该作者

回10楼

问题是他输出的是44 11 22 33

使用特权

评论回复
13
tsx1983|  楼主 | 2008-11-12 16:33 | 只看该作者

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

晚上我回去直接调用ST的库试下就知道了

使用特权

评论回复
14
tsx1983|  楼主 | 2008-11-12 16:36 | 只看该作者

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

我用的是DMA传输方式

使用特权

评论回复
15
vigia| | 2008-11-12 16:40 | 只看该作者

对了,LZ用的什么compiler?

使用特权

评论回复
16
tsx1983|  楼主 | 2008-11-12 17:12 | 只看该作者

回楼上

用的KEIL。
手头有板子的也可以测一测,到底是我个人问题还是都是这样的

使用特权

评论回复
17
tsx1983|  楼主 | 2008-11-12 19:12 | 只看该作者

还是我的错

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

使用特权

评论回复
18
walnutcy| | 2008-11-13 00:13 | 只看该作者

呵呵,路过,,

使用特权

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

本版积分规则

25

主题

160

帖子

0

粉丝