8164|13

775

帖子

0

TA的资源

纯净的硅(高级)

楼主
 

STM32运行不正常[问题已解决] [复制链接]

由于对STM32不是太精通,近来使用时,在测试时候遇到一个问题。

我使用的是STM2F103VET6,还有一个19264的液晶屏,一个矩阵的键盘。

先贴上两段代码
代码一:
//--------------------------系统设置菜单--------------------------------------
void LCD_MENU_1(void)
{
u8 key_temp;
LCD_CLEAR1();                     //清屏
USART_T(0X02);
//------1.系统参数-----------
LCD_SHOWSTRING(0,32,"---");
LCD_SHOWSTRING(0,56,"1.");
LCD_SHOW_ZI(0,72,ziti_xi);
LCD_SHOW_ZI(0,88,ziti_tong);
LCD_SHOW_ZI(0,104,ziti_can);
LCD_SHOW_ZI(0,120,ziti_shu);
LCD_SHOWSTRING(0,136,"---");

while(1)
{
key_temp=KEY_Scan();
   if(key_temp)
       {
     switch(key_temp)
        {
     case 0x01:LCD_MENU_NO1();break;
     case 0x0e:MENU_sudu_set();break;
     case 0x0d:MENU_dianji_set();break;
              
     }
    }

}

}



代码二:
//-------------------------主菜单------------------------------------------
void LCD_MENU_NO1(void)
{
u8 key_temp;
LCD_CLEAR1();
USART_T(0X01);

//------1.系统参数-----------
LCD_SHOWSTRING(0,0,"1.");
LCD_SHOW_ZI(0,16,ziti_xi);
LCD_SHOW_ZI(0,32,ziti_tong);
LCD_SHOW_ZI(0,48,ziti_can);
LCD_SHOW_ZI(0,64,ziti_shu);
//------2.端口检测-----------
LCD_SHOWSTRING(2,0,"2.");
LCD_SHOW_ZI(2,16,ziti_duan);
LCD_SHOW_ZI(2,32,ziti_kou);
LCD_SHOW_ZI(2,48,ziti_jian);
LCD_SHOW_ZI(2,64,ziti_ce);



while(1)
{
LCD_FLASH(6,176);       //光标闪烁定位
key_temp=KEY_Scan();
   if(key_temp)
       {
     switch(key_temp)
        {
     case 0x0e:LCD_MENU_1();break;
     case 0x0d:LCD_MENU_2();break;
        
     }
    }


}

}


上面两段代码中,有两个红色的函数,我在测试的时候,就是用按键不停的从函数LCD_MENU_1();进入函数LCD_MENU_NO1();然后又由函数LCD_MENU_NO1();进入LCD_MENU_NO1();。

具体来说就是从两个界面中不停切换,但问题来了,在两个界面中切换了54次后,系统就崩毁了。而且从新上电后,继续测试,也是54次就崩毁了,尝试了很多次,切换的次数都是一样的,没有调试接口,所以用串口来测试了一下,每次都是在固定的地方就停止了。

问题报告完毕,大家有没有遇到类似的问题。或者提供参考意见。



[ 本帖最后由 fsyicheng 于 2013-8-28 18:08 编辑 ]
此帖出自stm32/stm8论坛

最新回复

卧槽。。我也遇到这问题了。。。增加的完全不相关的代码!!就蹦了!!!程序却还在循环,,, 直接在函数里返回了一个7K的结构体。,。。  详情 回复 发表于 2016-8-8 17:38

点评

跟踪调试一下,看看在哪儿引起的?这么看不出来的.  详情 回复 发表于 2013-8-27 20:45
点赞 关注
 

回复
举报

2886

帖子

0

TA的资源

五彩晶圆(初级)

沙发
 
看得出楼主很有耐心,54次都能测出来
没遇到过,这两段程序是怎么切换的?
此帖出自stm32/stm8论坛

点评

每个界面就是一个死循环,然后在检测按键状态,检测到对应的键值就跳入对应的界面,然后又是另外一个死循环,又检测对应的按键,检测到对应的键值就跳入对应的界面,我的测试的时候就是在两个菜单中不停切换,就是不  详情 回复 发表于 2013-8-27 22:18
 
 

回复

4008

帖子

0

TA的资源

版主

板凳
 

回复 楼主fsyicheng 的帖子

跟踪调试一下,看看在哪儿引起的?这么看不出来的.
此帖出自stm32/stm8论坛
 
 

回复

775

帖子

0

TA的资源

纯净的硅(高级)

4
 

回复 沙发exiao 的帖子

每个界面就是一个死循环,然后在检测按键状态,检测到对应的键值就跳入对应的界面,然后又是另外一个死循环,又检测对应的按键,检测到对应的键值就跳入对应的界面,我的测试的时候就是在两个菜单中不停切换,就是不停的按1,2,1,2。这样程序就挂了。郁闷中
此帖出自stm32/stm8论坛
 
 
 

回复

4996

帖子

19

TA的资源

裸片初长成(初级)

5
 
程序比较乱,尽量让显示和按键相互独立起来,通过全局变量传递按键值,程序中尽量不要使用死循环,除非是main函数中。
此帖出自stm32/stm8论坛
 
个人签名我的博客
 
 

回复

775

帖子

0

TA的资源

纯净的硅(高级)

6
 
今天早上再仿真了一下,确切原因不敢说,但个人认为可能是内部的某些资源例如是寄存器一直被占用而没有被释放,导致资源不足而无法继续运行。我的理由如下图

做了54次界面切换后,界面的函数并没有退出,而是不断累加。

最后在这个地方挂了。

死机的时候,寄存器的数据如上图。有经验的朋友不妨提供以下意见。界面切换的方式不正确,下午修改一下验证一下。
此帖出自stm32/stm8论坛

点评

死机的时候看看跳到哪里去了,是否是硬件错误那个地方。  详情 回复 发表于 2013-8-28 12:19
应该是 C 语言写的有问题.两个函数在切换的时候,可能是一直都是相互嵌套,导致最后 Stack 不足. 这个问题一般很少出现.不过很有意思. 需要两个死循环的问题最好用 RTOS 来解决,或者用一些 C 语言的有关线程的东西来  详情 回复 发表于 2013-8-28 12:02
 
 
 

回复

1803

帖子

0

TA的资源

五彩晶圆(高级)

7
 

回复 6楼fsyicheng 的帖子

应该是 C 语言写的有问题.两个函数在切换的时候,可能是一直都是相互嵌套,导致最后 Stack 不足.
这个问题一般很少出现.不过很有意思.
需要两个死循环的问题最好用 RTOS 来解决,或者用一些 C 语言的有关线程的东西来解决.
或者在一个死循环里不断地检测一个函数指针的值,最后决定跳转到哪里.

[ 本帖最后由 Study_Stellaris 于 2013-8-28 12:06 编辑 ]
此帖出自stm32/stm8论坛

点评

是啊,我都觉得是两个函数相互调用,然后在跳转的时候某些寄存器被入栈,但函数永远都没有返回,也就没有出栈,最后就栈尽机亡了  详情 回复 发表于 2013-8-28 12:29
 
 
 

回复

4996

帖子

19

TA的资源

裸片初长成(初级)

8
 

回复 6楼fsyicheng 的帖子

死机的时候看看跳到哪里去了,是否是硬件错误那个地方。
此帖出自stm32/stm8论坛

点评

硬件问题应该不太可能,因为测试的时候是循环的,每次都是循环操作相同次数就挂机,这个巧合性估计硬件是很难做到的,而且刚才的软件仿真就证实了,仿真跑了54次切换后,在一个延时的子函数就停住了,仿真也跑不下去  详情 回复 发表于 2013-8-28 12:33
 
个人签名我的博客
 
 

回复

775

帖子

0

TA的资源

纯净的硅(高级)

9
 

回复 7楼Study_Stellaris 的帖子

是啊,我都觉得是两个函数相互调用,然后在跳转的时候某些寄存器被入栈,但函数永远都没有返回,也就没有出栈,最后就栈尽机亡了
此帖出自stm32/stm8论坛
 
 
 

回复

775

帖子

0

TA的资源

纯净的硅(高级)

10
 

回复 8楼zhaojun_xf 的帖子

硬件问题应该不太可能,因为测试的时候是循环的,每次都是循环操作相同次数就挂机,这个巧合性估计硬件是很难做到的,而且刚才的软件仿真就证实了,仿真跑了54次切换后,在一个延时的子函数就停住了,仿真也跑不下去了。
此帖出自stm32/stm8论坛
 
 
 

回复

775

帖子

0

TA的资源

纯净的硅(高级)

11
 
应该是堆栈的问题,改变了菜单的更新方式,使用屏幕显示和按键检测各自独立的方式,问题解决了。谢谢各位的意见。
此帖出自stm32/stm8论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

12
 
厉害啊
此帖出自stm32/stm8论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

13
 
程序嵌套层数太多,栈溢出了
此帖出自stm32/stm8论坛
 
 
 

回复

148

帖子

0

TA的资源

一粒金砂(中级)

14
 
卧槽。。我也遇到这问题了。。。增加的完全不相关的代码!!就蹦了!!!程序却还在循环,,,
直接在函数里返回了一个7K的结构体。,。。
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表