打印
[STM32F1]

【已解决】STM32 C语言 32位变量左移的问题

[复制链接]
8108|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 深夜星空 于 2014-3-28 20:41 编辑

写了一个SSI协议,和SPI差不多。采集程序发送时钟信号,发送程序发送数据。采集程序这有点问题。
1、定义一个32位全局变量NUM,保存采集来的数据,发送一个脉冲,采集一位的数据,NUM左移1位,一共28位。单步调试,发现数据只能左移到第9位,在左移高位数据全被清零。见第二张图和第三张图。
2、第一图,for循环里的变量i,在for循环里第一个断点 Set_TX; 处,有值,在for循环里第二个断点,却没有值了?
C语言学的不到家,还请大神点拨点拨。

void SSI_Sent(void)
{
  //u32 byte;
  Reset_TX;
  delay_ms(2);
  for(u8 i=0;i<28;i++)
  {
    Set_TX;
    delay_ms(2);
    NUM=(NUM<<1);
    Reset_TX;
    if(RD_RX==0x01)
      NUM|=0x01;
    else
      NUM&=0xFE;
    delay_ms(1);
  }
  Set_TX;
  //return(byte);
}

QQ截图20140327171029.png (32.69 KB )

QQ截图20140327171029.png

QQ截图20140327171014.png (31.84 KB )

QQ截图20140327171014.png

QQ截图20140327170939.png (32 KB )

QQ截图20140327170939.png
沙发
airwill| | 2014-3-27 18:27 | 只看该作者
没有道理的.
显示个 Disassemble 代码出来看看

使用特权

评论回复
板凳
WYT440| | 2014-3-27 18:38 | 只看该作者
问题一是不是触发了NUM&=0xFE;这个操作?如果是高位可定都是零哦
问题二没看懂啥意思。

使用特权

评论回复
地板
深夜星空|  楼主 | 2014-3-27 19:40 | 只看该作者
airwill 发表于 2014-3-27 18:27
没有道理的.
显示个 Disassemble 代码出来看看

Disassemble 代码是啥?问题一,应该是3楼找到的问题。:'( C语言太渣了

使用特权

评论回复
5
深夜星空|  楼主 | 2014-3-27 19:43 | 只看该作者
WYT440 发表于 2014-3-27 18:38
问题一是不是触发了NUM&=0xFE;这个操作?如果是高位可定都是零哦
问题二没看懂啥意思。 ...

问题一、对,就是这个问题!!厉害厉害 :lol
问题二、就是看第一张图和第二张图,程序在for循环里停的位置不一样,最右边的第三个变量 i 一个是unavailable,一个是正确的数。

使用特权

评论回复
6
WYT440| | 2014-3-28 09:47 | 只看该作者
深夜星空 发表于 2014-3-27 19:43
问题一、对,就是这个问题!!厉害厉害
问题二、就是看第一张图和第二张图,程序在for循环里停的位 ...

OK,知道你说的啥意思了....

很显然,程序进行到第一个断点Reset_T时,还没有进for循环,此时i也没有定义赋初值。甚至程序不知道i是什么东西,当然现实unavailable;

程序进行到第二个断点Set_TX时,for循环执行了13次,of cource i =12;

使用特权

评论回复
7
深夜星空|  楼主 | 2014-3-28 10:07 | 只看该作者
不是,是 for循环 里面 的两个断点,第一个是 Set_TX; 第二个是 delay_ms(1); 到第二个断点 delay_ms(1);反而 i 没有值了

使用特权

评论回复
8
WYT440| | 2014-3-28 13:12 | 只看该作者
深夜星空 发表于 2014-3-28 10:07
不是,是 for循环 里面 的两个断点,第一个是 Set_TX; 第二个是 delay_ms(1); 到第二个断点 delay_ms(1) ...

模仿你的代码写了个程序测试,i值一直很正常!

你的程序每次执行到delay_ms(1)时,i值都显示unavailable吗?从字面上理解貌似局部变量i被销毁了,所以不可用。。。把i定义成全局变量试试...

使用特权

评论回复
9
深夜星空|  楼主 | 2014-3-28 14:16 | 只看该作者
WYT440 发表于 2014-3-28 13:12
模仿你的代码写了个程序测试,i值一直很正常!

你的程序每次执行到delay_ms(1)时,i值都显示unavailable ...

我试了几次,觉得应该是这样。i分别在函数外定义为全局变量,在函数中定义局部变量 和在for循环中定义局部变量,在for循环中定义的局部变量i,只在for循环中可见,而循环中调用其它函数时是不可见的,所以在断点delay_ms(1); 时,IAR提示unavailable。

使用特权

评论回复
10
song19881218| | 2014-3-28 16:39 | 只看该作者
你一句NUM&=0xFE不把高位清完才怪,改为NUM&=0xFFFFFFFE

使用特权

评论回复
11
深夜星空|  楼主 | 2014-3-28 20:41 | 只看该作者
song19881218 发表于 2014-3-28 16:39
你一句NUM&=0xFE不把高位清完才怪,改为NUM&=0xFFFFFFFE

呵呵,是这样的,已经解决了,多谢多谢

使用特权

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

本版积分规则

31

主题

345

帖子

3

粉丝