OpenEdv-开源电子网

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

求助,为什么while循环不依照自己设置的判断语句跳出循环?

[复制链接]

3

主题

17

帖子

0

精华

高级会员

Rank: 4

积分
706
金钱
706
注册时间
2017-5-20
在线时间
170 小时
发表于 2017-5-20 16:43:54 | 显示全部楼层 |阅读模式
2金钱
设备是原子哥的F103RC。用HAL库写的程序。由外部触发信号触发ADC采样,调用ADCFunction()。ADCFunction()启动后会启动定时器TIM2,定时一定时间后中断,设置StateBit 为0,想要中断下面粗体显示while循环。
但debug时候发现StateBit 已经为0了,但程序任然死在加粗的那个while循环中,while循环的判据不起作用,Times和ADCA的值不停增加至溢出,然后重新开始。求助这是怎么回事?








//中断服务函数
void EXTI0_IRQHandler(void)
{
    HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);                                        //调用中断处理公用函数,由此函数调用中断回调函数
}


//中断服务程序中需要做的事情
//在HAL库中所有的外部中断服务函数都会调用此函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)                                //GPIO_Pin:中断引脚号
{
    switch(GPIO_Pin)
    {
        case GPIO_PIN_0:
                        ADCFunction(279);
                break;

    }
}

//定时器2中断服务函数
void TIM2_IRQHandler(void)
{
    HAL_TIM_IRQHandler(&TIM2InitStructure);
}

//定时器2中断服务回调函数,由HAL_TIM_IRQHandler每次发生更新中断时调用
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if(htim==(&TIM2InitStructure))
    {
                StateBit = false;
    }
}

void ADCFunction(u16 TimerValue)
{
        LoopValue ++;
        StateBit = true;
        __HAL_TIM_ENABLE_IT(&TIM2InitStructure,TIM_IT_UPDATE);
        __HAL_TIM_ENABLE(&TIM2InitStructure);
        do
        {
                ADCA += (&PB1_ADCStructure)->Instance->DR;
                Times ++;
        }
        while(StateBit);
        __HAL_TIM_DISABLE(&TIM2InitStructure);                                                //关闭定时器2,到需要时开启
        __HAL_TIM_DISABLE_IT(&TIM2InitStructure,TIM_IT_UPDATE);                        //关闭更新中断,到需要时再开启
        TIM2->CNT = TimerValue;                                                                        //重装载计数寄存器
       
        SumA += (double) ADCA/Times;
        ADCA = 0;
        Times = 0;
       
        StateBit = true;
        __HAL_TIM_ENABLE_IT(&TIM2InitStructure,TIM_IT_UPDATE);
        __HAL_TIM_ENABLE(&TIM2InitStructure);
        do
        {
                ADCB += (&PB1_ADCStructure)->Instance->DR;
                Times ++;
        }
        while(StateBit);
        __HAL_TIM_DISABLE(&TIM2InitStructure);                                                //关闭定时器2,到需要时开启
        __HAL_TIM_DISABLE_IT(&TIM2InitStructure,TIM_IT_UPDATE);                        //关闭更新中断,到需要时再开启
        TIM2->CNT = TimerValue;                                                                        //重装载计数寄存器
       
        SumB += (double) ADCB/Times;
        ADCB = 0;
        Times = 0;
       
        StateBit = true;
        __HAL_TIM_ENABLE_IT(&TIM2InitStructure,TIM_IT_UPDATE);
        __HAL_TIM_ENABLE(&TIM2InitStructure);
        do
        {
                ADCC += (&PB1_ADCStructure)->Instance->DR;
                Times ++;
        }
        while(StateBit);
        __HAL_TIM_DISABLE(&TIM2InitStructure);                                                //关闭定时器2,到需要时开启
        __HAL_TIM_DISABLE_IT(&TIM2InitStructure,TIM_IT_UPDATE);                        //关闭更新中断,到需要时再开启
        TIM2->CNT = TimerValue;                                                                        //重装载计数寄存器
       
        SumC += (double) ADCC/Times;
        ADCC = 0;
        Times = 0;
       
        if(LoopValue == 64)
        {
                u32 tempvalue = 0;
                LoopValue = 0;
                SumA = SumA/64*(3.3/4096);
                SumB = SumB/64*(3.3/4096);
                SumC = SumC/64*(3.3/4096);
               
                tempvalue = SumA;
                OLED_ShowString(5,30,"A:",12);
                OLED_ShowNum(17,30,tempvalue,1,12);
                OLED_ShowString(23,30,".",12);
                SumA -= tempvalue;
                SumA *= 100000;
                tempvalue = SumA;
                OLED_ShowNum(29,30,tempvalue,3,12);
               
                tempvalue = SumB;
                OLED_ShowString(69,30,"B:",12);
                OLED_ShowNum(81,30,tempvalue,1,12);
                OLED_ShowString(87,30,".",12);
                SumB -= tempvalue;
                SumB *= 100000;
                tempvalue = SumB;
                OLED_ShowNum(93,30,tempvalue,3,12);
               
                tempvalue = SumC;
                OLED_ShowString(5,42,"C:",12);
                OLED_ShowNum(17,42,tempvalue,1,12);
                OLED_ShowString(23,42,".",12);
                SumC -= tempvalue;
                SumC *= 100000;
                tempvalue = SumC;
                OLED_ShowNum(29,42,tempvalue,3,12);
                OLEDScreen_Refreash();
                SumA = 0;
                SumB = 0;
                SumC = 0;
        }
}


F103RCT6HalTemplate.zip

4.15 MB, 下载次数: 17

源代码

最佳答案

查看完整内容[请看2#楼]

volatile ,你值得拥有。 另外给个建议,在任何判断条件中不要直接一某个数值来作为比较量,最稳妥的做法是 (变量xx == 值)
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

162

帖子

0

精华

高级会员

Rank: 4

积分
541
金钱
541
注册时间
2017-4-6
在线时间
67 小时
发表于 2017-5-20 16:43:55 | 显示全部楼层
volatile ,你值得拥有。

另外给个建议,在任何判断条件中不要直接一某个数值来作为比较量,最稳妥的做法是 (变量xx == 值)
回复

使用道具 举报

3

主题

17

帖子

0

精华

高级会员

Rank: 4

积分
706
金钱
706
注册时间
2017-5-20
在线时间
170 小时
 楼主| 发表于 2017-5-21 09:29:11 | 显示全部楼层
JUSTNIUB 发表于 2017-5-20 16:43
volatile ,你值得拥有。

另外给个建议,在任何判断条件中不要直接一某个数值来作为比较量,最稳妥的做法 ...

恩,按照你的说法,解决了问题,谢谢啦。
按道理我优化设置为level-0应该不优惠才对。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-21 11:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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