我估计也只能把疑问发这里了,请你们帮解惑

[复制链接]
1070|6
手机看帖
扫描二维码
随时随地手机跟帖
joymm|  楼主 | 2017-6-6 19:03 | 显示全部楼层 |阅读模式
最近用cubeMX生成了一些代码,感觉还是很好用的,但是在用的时候发现一个奇怪的现象。我因为要用到一个全局变量,所以定义到了main的文件头,如下图中示tstv1和tstv2:
QQ截图20170606184745.png 此时,程序可以编译并正常运行。

如果这时,在进入while(1)之前,对这个2个变量的任何一个做赋值操作,则,程序会死在箭头所指的子程序里
QQ截图20170606184900.png 跟踪后是落到了hardfalut。

如果注释掉这两代码,程序正常运行,
QQ截图20170606184936.png
问在cubeMX里如何使用全局的变量?我记得在51里随便怎么写也没有关系啊??

相关帖子

joymm|  楼主 | 2017-6-7 15:06 | 显示全部楼层
本帖最后由 joymm 于 2017-6-7 15:13 编辑

注释掉那两个oled的子程序,是可以运行的.我在spi里设置的是只发送,硬件nss输出,3M,无中断,polling方式。这些在没有加入全局变量的时候,都运行得很好。那么为什么这二者不能共存??

使用特权

评论回复
joymm|  楼主 | 2017-6-7 16:12 | 显示全部楼层
另起一个文件,按类似的配置,只要启用了spi发送代码,又有全局变量,程序就挂起了。
如下图中,如果注释掉,赋值语句,程序则能正常运行。
QQ截图20170607160636.png
QQ截图20170607160700.png
这是什么问题?真的不懂了

使用特权

评论回复
joymm|  楼主 | 2017-6-7 17:25 | 显示全部楼层
基本算是了解,但依然需要解释。
我又起了一个工程,这次用I2c,还是做oled硬件方式的驱动,发现使用全局缓冲区和全局变量没有问题,这里说的全局缓冲区就是HAL_SPI_transmit和HAL_I2C_Master_Transmit里面的参数,是一个发送数据区的指针。
在I2C发送程序里面,都是全局的变量,完全没有问题,程序可以运行。
在SPI发送程序里,则不行,如果把缓冲区改到子程序内部去,也就是申明为局部变量,则程序也可以运行。

我完全不知道这是怎么了,请有条件的朋友试试,是不是我说的这样。
我自己使用的硬件是051的discover板,spi工作在3M,I2c是100k标准速率,都是只发送不接收,阻塞方式。

使用特权

评论回复
dragon_hn| | 2017-7-13 11:24 | 显示全部楼层
ST的MCU,最好不要用硬件I2C和硬件SPI。里面到处是死循环。

使用特权

评论回复
kingkits| | 2017-7-13 15:23 | 显示全部楼层
一般全局变量都定义在程序外面,(可以用单独.c程序来定义全局变量),使用时,用(extern)说明是外部变量

使用特权

评论回复
零三翟邢止胃| | 2019-3-21 12:47 | 显示全部楼层
我完全不知道这是怎么了,请有条件的朋友试试,是不是我说的这样。
我自己使用的硬件是051的discover板,spi工作在3M,I2c是100k标准速率,都是只发送不接收,阻塞方式。

使用特权

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

本版积分规则

6

主题

58

帖子

2

粉丝