OpenEdv-开源电子网

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

为什么进不了while循环呢?

[复制链接]

16

主题

35

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2016-2-18
在线时间
26 小时
发表于 2016-3-3 22:22:10 | 显示全部楼层 |阅读模式
u8 i=0;

u8 flag=0;
void TIM3_IRQHandler(void)
{
       
        TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
     i++;
        if(i==6)   //表示产生1分钟的定时
        {
                i=0;
                flag=1;
//        if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)==Bit_RESET)
//        {
//                if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5)==Bit_RESET)
//                {
//                        //LED 熄灭
//                   GPIO_SetBits(GPIOB,GPIO_Pin_5);       
//                }
//                else
//                {
//                   //LED 发光
//                   GPIO_ResetBits(GPIOB,GPIO_Pin_5);
//                }
//        }
    }
}
这个是定时器服务函数
外部调用了flag 但是为什么进不主函数的while了呢?其他配置都是正确的!
#include "pbdata.h"

extern u8 flag;

void RCC_Configuration(void);
void GPIO_Configuration(void);
void NVIC_Configuration(void);
void TIM3_Configuration(void);


int main(void)
{
       
   RCC_Configuration();        //系统时钟初始化
   GPIO_Configuration();//端口初始化
   TIM3_Configuration();
   NVIC_Configuration();
       
        if(flag==1)
        {
                        //flag=0;
                while(1)
                {
                                //LED 熄灭
                           GPIO_SetBits(GPIOB,GPIO_Pin_5);       
                        delay_ms(2000);
                           //LED 发光
                           GPIO_ResetBits(GPIOB,GPIO_Pin_5);
                        delay_ms(2000);
                }
        }       

//   while(1);       
}

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

使用道具 举报

6

主题

39

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
394
金钱
394
注册时间
2016-2-6
在线时间
64 小时
发表于 2016-3-3 22:43:54 | 显示全部楼层
逻辑出问题了。
第一次执行程序时flag为0不进入if(flag==1)这一部分,直接到了最后一行的while(1) (如果注释掉的话程序会执行不可预知的代码产生错误)
然后当TIM3中断产生(不知道初始化的是什么)后,进入中断服务函数才改变的flag的值,此时改变后程序仍然在while(1)中而不会执行if(flag==1)这一行所以不进入while循环。
如果在if(flag==1)外围加入一个while循环试试,成功的话应该就是这个问题。
Junior in BIT.
回复 支持 1 反对 0

使用道具 举报

16

主题

35

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2016-2-18
在线时间
26 小时
 楼主| 发表于 2016-3-3 23:09:56 | 显示全部楼层
larry 发表于 2016-3-3 22:43
逻辑出问题了。
第一次执行程序时flag为0不进入if(flag==1)这一部分,直接到了最后一行的while(1) (如果 ...

问题解决了,谢谢!!!
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2016-1-22
在线时间
16 小时
发表于 2016-3-4 07:13:08 | 显示全部楼层
larry 发表于 2016-3-3 22:43
逻辑出问题了。
第一次执行程序时flag为0不进入if(flag==1)这一部分,直接到了最后一行的while(1) (如果 ...

说的很好
回复 支持 反对

使用道具 举报

6

主题

188

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
432
金钱
432
注册时间
2016-1-19
在线时间
38 小时
发表于 2016-3-4 08:56:59 | 显示全部楼层
这样也可以试试
[mw_shl_code=c,true]                while(1)
                {
                          if(flag==1)
                          {
                           //LED 熄灭
                           GPIO_SetBits(GPIOB,GPIO_Pin_5);        
                        delay_ms(2000);
                           //LED 发光
                           GPIO_ResetBits(GPIOB,GPIO_Pin_5);
                        delay_ms(2000);
                         }
                 } [/mw_shl_code]
原来你也在这里
回复 支持 反对

使用道具 举报

21

主题

299

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1836
金钱
1836
注册时间
2013-7-29
在线时间
278 小时
发表于 2016-3-4 09:38:34 | 显示全部楼层
解决就好,学习下!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 05:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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