OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 17248|回复: 11

STM32 可以设置为大端模式吗?

[复制链接]

10

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2013-9-24
在线时间
4 小时
发表于 2014-5-12 14:50:03 | 显示全部楼层 |阅读模式
5金钱
      STM32 可以设置为大端模式吗?我现在的应用是,一个结构体上传到串口需要用大端模式(系统通信协议定死的),如果数据量小的话单独转换倒不是问题,关键是现在我的数据量非常大,有几千个字节,如果都单独转换那得多麻烦啊,请教各位高手有没有好的解决方案?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2013-1-21
在线时间
0 小时
发表于 2014-5-12 14:55:53 | 显示全部楼层
你想从低位字节开始发送?
试试能不能用指针写个结构体转换的函数来
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-5-12 15:02:48 | 显示全部楼层
不可以设置,只能你软件处理。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

10

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2013-9-24
在线时间
4 小时
 楼主| 发表于 2014-5-12 15:59:23 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
谢谢,有什么其他处理方案吗?
回复

使用道具 举报

10

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2013-9-24
在线时间
4 小时
 楼主| 发表于 2014-5-12 16:21:50 | 显示全部楼层
回复【2楼】史道轩:
---------------------------------
STM32是小端模式,是低字节开始发送的,我是想高字节开始发送。我的结构体中有不同类型的很多元素,有INT ,float等,我不知道您说的方法是怎么弄的?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-5-13 00:13:13 | 显示全部楼层
回复【5楼】elsie_ye:
---------------------------------
我没有什么好办法,只能一个个转了。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

10

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2013-9-24
在线时间
4 小时
 楼主| 发表于 2014-5-14 17:22:28 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
问题已解决,如函数:
int DataConver_short(int a)
{
      union 
      {
             int i;
             char c[2];
      } u, r;
       
      u.i = a;
      r.c[0] = u.c[1];
      r.c[1] = u.c[0];

      return r.i;   
}
long int DataConver_long(long int a)
{
      union 
      {
             int i;
             char c[4];
      } u, r;
       
      u.i = a;
      r.c[0] = u.c[3];
      r.c[1] = u.c[2];
      r.c[2] = u.c[1];
      r.c[3] = u.c[0];

      return r.i;   
}
float DataConver_float(float a)
{
union 
{
float i;
char c[4];
} u, r;
       
u.i = a;
r.c[0] = u.c[3];
r.c[1] = u.c[2];
r.c[2] = u.c[1];
r.c[3] = u.c[0];

return r.i;   
}


typedef struct strt
{
unsigned short    Config;                       
short             AlarmTh[16][6];
float             Contr[16];
} STR;

STR str;
STR str_mcu;

void DataConvert(void) 

      unsigned char i,j; 

      str.Config = DataConver_short(str_mcu.Config); 
      for(i = 0;i < 16; i++) 
      { 
             for(j = 0;j < 6;j++) 
             { 
                str.AlarmTh[j] = DataConver_short(str_mcu.AlarmTh[j]); 
             } 
             str.Contr = DataConver_float(str_mcu.Contr); 
      } 

}

回复

使用道具 举报

36

主题

195

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
313
金钱
313
注册时间
2014-10-27
在线时间
34 小时
发表于 2016-1-18 16:26:32 | 显示全部楼层
elsie_ye 发表于 2014-5-14 17:22
回复【6楼】正点原子:
---------------------------------
问题已解决,如函数:

学习了!mark
回复

使用道具 举报

20

主题

227

帖子

0

精华

高级会员

Rank: 4

积分
605
金钱
605
注册时间
2017-7-14
在线时间
116 小时
发表于 2017-11-2 17:18:02 | 显示全部楼层
也可以这样子写:
#define BigtoLittle32(A)   ((( (uint32)(A) & 0xff000000) >> 24) | \  
                                         (( (uint32)(A) & 0x00ff0000) >> 8)   | \  
                                         (( (uint32)(A) & 0x0000ff00) << 8)   | \  
                                         (( (uint32)(A) & 0x000000ff) << 24))  
其他类型相似。
回复

使用道具 举报

18

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
210
金钱
210
注册时间
2014-10-5
在线时间
42 小时
发表于 2020-8-13 00:26:36 | 显示全部楼层
MDK中有__REV、__REV16、__REVSH几个指令,可以做大小端续的翻转。


在cmsis_armcc.h文件中,我这里是从447行到483行。

具体内容就是下边这些

/**
  \brief   Reverse byte order (32 bit)
  \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412.
  \param [in]    value  Value to reverse
  \return               Reversed value
*/
#define __REV                             __rev


/**
  \brief   Reverse byte order (16 bit)
  \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856.
  \param [in]    value  Value to reverse
  \return               Reversed value
*/
#ifndef __NO_EMBEDDED_ASM
__attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(uint32_t value)
{
  rev16 r0, r0
  bx lr
}
#endif


/**
  \brief   Reverse byte order (16 bit)
  \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000.
  \param [in]    value  Value to reverse
  \return               Reversed value
*/
#ifndef __NO_EMBEDDED_ASM
__attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int16_t __REVSH(int16_t value)
{
  revsh r0, r0
  bx lr
}
#endif
我已经是STM32熟练工了
回复

使用道具 举报

8

主题

169

帖子

0

精华

高级会员

Rank: 4

积分
564
金钱
564
注册时间
2015-7-4
在线时间
105 小时
发表于 2020-12-23 09:40:37 | 显示全部楼层
stm32新人一枚 发表于 2020-8-13 00:26
MDK中有__REV、__REV16、__REVSH几个指令,可以做大小端续的翻转。

接下来会用到,学习了学习了
回复

使用道具 举报

2

主题

459

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4496
金钱
4496
注册时间
2018-5-14
在线时间
962 小时
发表于 2020-12-23 10:07:18 | 显示全部楼层
压根不用自己写,在CMSIS的cm3或者cm4.h里面有转换函数,效率比自己写高
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-6 05:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表