OpenEdv-开源电子网

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

F407中全局变量值不稳定

[复制链接]

11

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
123
金钱
123
注册时间
2012-8-26
在线时间
11 小时
发表于 2015-8-3 23:18:26 | 显示全部楼层 |阅读模式
5金钱
我在usart.c中定义了全局变量vu8 flag;在usart.h中声明为 extern vu8 flag;然后在usart.c中的串口中断处理函数中根据串口接收到的值来修改flag变量的值,
代码示意如下:(......表示其他代码省略)
void usart_hander()
{
   ........
   receive_data();
   .........
}
receive_data()
{
  u8 res;
  res=USART_ReceiveData(USART6);
  switch(res)
     case 0: flag=0;break
     case 1: flag=1;break;
     default:  flag=0;break;
  ...............................
}
然后在包含了usart.h的main.c中的主函数main()中扫描此标志
void main()
{
while(1)
 {
 if(flag==1)   {do a;}
 else {do b;}
 }
}
程序全速运行时用串口调试助手向串口发送数据1后发现main函数中只执行一次do a后flag值就变为0了,当在 receive_data();后加上延时函数delay_us(200);
后才flag的值才能一直稳定为1,而且这个延时最小为200us,小了就没用。此工程中就跑了这一个线程,为何全局变量赋值后稳定不下来,需要延时后才能稳定下来,难道是F407保存一个全局变量的值需要200us?这也太慢了吧,还是其他问题,求解。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

57

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2014-8-3
在线时间
0 小时
发表于 2015-8-4 08:40:34 | 显示全部楼层
uint16_t USART_ReceiveData(USART_TypeDef* USARTx)
{
  /* Check the parameters */
  assert_param(IS_USART_ALL_PERIPH(USARTx));
  
  /* Receive Data */
  return (uint16_t)(USARTx->DR & (uint16_t)0x01FF);
}
它返回的是收到的字。
又到我猜的时候(我才懒得帮你去试),我猜,那个串口助手发的不只是1,还有什么/0/n之类的东西~ 再说了,'1'也不是1~
建议你仿真,中断点设在switch(res)那里,用窗口看res的值,全速运行,再串口发送,我猜你会有收获的。
唉~我教的竟然是叫你去仿真,这问题也解决得太轻松的样子~
对了,do a; 这是什么语法,没见过也~(莫非是省略的写法。。。。)
电子技能就是我行走江湖时手中的利剑。
回复

使用道具 举报

11

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
123
金钱
123
注册时间
2012-8-26
在线时间
11 小时
 楼主| 发表于 2015-8-5 00:09:25 | 显示全部楼层
回复【2楼】腾飞:
---------------------------------
上面结果就是仿真下得出的啊,你说的这些手段我都试过了,flag的值就是在接受完数据后的值(接收完后就不再进入串口接收处理中断函数了),重点是为何延时后值就稳定了,do a是个伪c语句,上面说了是示意代码,不是真实代码。
回复

使用道具 举报

8

主题

57

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2014-8-3
在线时间
0 小时
发表于 2015-8-5 11:00:29 | 显示全部楼层
那我就不知道了,
 试试把keil的优化级别设为0.
电子技能就是我行走江湖时手中的利剑。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2015-8-6 22:58:59 | 显示全部楼层
仿真跟踪下代码吧
怀疑你的中断处理函数出问题了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 18:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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