OpenEdv-开源电子网

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

Stm32f103c8t6 为什么无法清除中断标志位

[复制链接]

1

主题

4

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2020-9-11
在线时间
1 小时
发表于 2021-8-4 16:21:05 | 显示全部楼层 |阅读模式
1金钱
在用stm32c8t6 做智能车的时候 在做测速模块发现 当只有一个轮子转动时 另一个轮子的还是有速度,且两轮测出来的速度一样
去查寄存器发现竟然清除不掉两个中断标志位,导致中断一直在执行  !!!弄了好久还是不知道怎么回事?   求大佬告知


测试如图



运行完两行代码后依旧还是1????



附上代码部分
speedtest.c

#include "stm32f10x.h"
#include "speedtest.h"
#include "sys.h"
#include "beep.h"

u16 speedcount_L=0;
u16 speedcount_R=0;
u16 speed_Right=0;
u16 speed_Left=0;

void Speed_Test_Init(u16 arr,u16 psc)
{    //外部中断配置
        GPIO_InitTypeDef GPIO_InitStructure;
        EXTI_InitTypeDef EXTI_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
      
        BEEP_Init();
      
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
      
      
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2|GPIO_Pin_1;   
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;   
        GPIO_Init(GPIOA,&GPIO_InitStructure);

        GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource2|GPIO_PinSource1); //ÖD¶Ïó3éä

        EXTI_InitStructure.EXTI_Line=EXTI_Line2|EXTI_Line1;  
        EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;   
        EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
        EXTI_InitStructure.EXTI_LineCmd=ENABLE;  
        EXTI_Init(&EXTI_InitStructure);

        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

        NVIC_InitStructure.NVIC_IRQChannel=EXTI2_IRQn;  
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;  
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;  
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;  
        NVIC_Init(&NVIC_InitStructure);

        NVIC_InitStructure.NVIC_IRQChannel=EXTI1_IRQn;  
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;  
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;  
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;  
        NVIC_Init(&NVIC_InitStructure);
      
      
      
  //TIM2
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//¿aÆôTIM2ê±Öó
      
        TIM_TimeBaseStructure.TIM_Period = arr;
        TIM_TimeBaseStructure.TIM_Prescaler =psc;
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
        TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
      
        TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE );
      

        NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;  
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;  
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;  
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);  
      
        TIM_Cmd(TIM2, ENABLE);  
}      


void TIM2_IRQHandler()
{
        if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
        {

           TIM_Cmd(TIM2, DISABLE);

    EXTI->IMR&=~(6);   


          speed_Left=speedcount_L*60/20;   //  r/min
          speed_Right=speedcount_R*60/20;   //  r/min

          speedcount_L=0;
          speedcount_R=0;


                if(EXTI_GetITStatus(EXTI_Line2)==SET) EXTI_ClearITPendingBit(EXTI_Line2);    //清除不掉
                if(EXTI_GetITStatus(EXTI_Line1)==SET) EXTI_ClearITPendingBit(EXTI_Line1);
                TIM_ClearITPendingBit(TIM2, TIM_IT_Update);  

                TIM_Cmd(TIM2, ENABLE);
         
                EXTI->IMR|=6;
               
                TIM_SetCounter(TIM2,0x00);

        }
}

void EXTI2_IRQHandler(void)
{
        if(EXTI_GetITStatus(EXTI_Line2)==SET)
  {
                speedcount_L++;
          EXTI_ClearITPendingBit(EXTI_Line2);  
        }
}

void EXTI1_IRQHandler(void)
{
        if(EXTI_GetITStatus(EXTI_Line1)==SET)
  {
                speedcount_R++;
          EXTI_ClearITPendingBit(EXTI_Line1);  
        }
}


main.c

#include "stm32f10x.h"
#include "carwheel.h"
#include "redfollow.h"
#include "speedtest.h"
#include "beep.h"
#include "usart_speed.h"
#include "sys.h"

#define speed_L 400   
#define speed_R 400  

int main(void)
{      
        SystemInit();
         WHEEL_Init();
        Red_Follow_Init();   //红外循迹模块   使用if函数没用中断
         uart_init(115200);
         Speed_Test_Init(9999,7199);  //1s 检测一次速度
         
         while(1)
         {               
                 Red_Follow(speed_L,speed_R);
                 Usart1_Speed();
//        if(speed_R >=4) BEEP=!BEEP;

         }
}

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

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2020-9-11
在线时间
1 小时
 楼主| 发表于 2021-8-4 19:47:42 | 显示全部楼层
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2020-9-11
在线时间
1 小时
 楼主| 发表于 2021-8-4 19:48:11 | 显示全部楼层

回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2020-9-11
在线时间
1 小时
 楼主| 发表于 2021-8-4 19:48:41 | 显示全部楼层

回复

使用道具 举报

11

主题

2147

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4894
金钱
4894
注册时间
2015-1-10
在线时间
612 小时
发表于 2021-8-5 09:44:35 | 显示全部楼层
图片看不到,我有个疑问,你在TIM中断里面为啥还要清中断?为啥还要开关TIM?
回复

使用道具 举报

1

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
191
金钱
191
注册时间
2019-5-5
在线时间
49 小时
发表于 2021-8-5 11:50:03 来自手机 | 显示全部楼层
前一段用外部中断也出现不能清除中断标志位后来发现有两个地方要处理,一个是EXIT,另一个是NVIC
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-26 00:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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