qq_53446848 2022-01-06 15:14 采纳率: 50%
浏览 64
已结题

STM32F103vet6中断程序实现

想要实现 当发生外部中断时 就是一个高低电平跳动时 芯片记录两个中断之间的时间差
另一个还要实现 1秒钟内有几次发生中断

  • 写回答

1条回答 默认 最新

  • suqingxiao 2022-01-06 15:36
    关注
    #define  TainIn    PBin(8)   // PB8
    u16 Rise_value=0;
    u16 Fall_value=0;
    u16 Duty_value=0;
     u16 OldRise_value=0;
     u16 num=0;//中断次数
    
    TIM5_TIM_Init((65535),(27-1));
    
    
    
    /*定时器5初始化*/
    void Timer5_Init(u16 arr,u16 psc)
    {    
    
        RCC->APB1ENR|=1<<3;    //TIM5 时钟使能  
        TIM5->ARR=arr;//设定计数器自动重装值   
        TIM5->PSC=psc;//预分频器不分频 
    
        TIM5->CR1|=0x01;    //使能定时器5
                                                                                                  
    } 
    
    
    
    /*外部中断用于PWM输入口*/
    void EXTIX_Init(void)
    {
        RCC->APB2ENR|=1<<3;     //使能PORTB时钟     
        //PB8
        GPIOB->CRH&=0XFFFFFFF0;//PB8设置成输入      
        GPIOB->CRH|=0X00000008;                    
        GPIOB->ODR|=1<<8;       //PB8上拉
    
        Ex_NVIC_Config(GPIO_B,8,3);//8是指PB8是指上升下降沿触发
        MY_NVIC_Init(1,0,EXTI9_5_IRQChannel,4);//抢占0,子优先级3,组3
                
    }
    
    
    
    //外部中断6服务程序用于PB8捕获
    void EXTI9_5_IRQHandler(void)
    {                     
           if(TainIn ==1)//先是上升沿触发中断
           {  
           num++; //中断次数
           if(Train_flag ==0)
           {
               Train_flag =1;
               Rise_value = TIM5->CNT;//读取上升时间
               
               if(OldRise_value > Rise_value) Duty_value = OldRise_value-Rise_value;
             else if(OldRise_value < Rise_value) Duty_value = (OldRise_value+65535)-Rise_value;
    
                OldRise_value = Rise_value;
           }       
        }
        else if(TainIn ==0)//第二次中断是下降沿
        {    
            if(Train_flag ==1)
            {         
                   Fall_value = TIM5->CNT;//读取总时间    
    
            }    
        }        
        EXTI->PR=1<<8;     //清除LINE8上的中断标志位  
    }
    

    另一个还要实现 1秒钟内有几次发生中断

    这个问题可以用一个定时器到1秒后读取num的值中断次数

    u16  get_num =0;
    /*定时器1*/
    void Timer1_Init(u16 arr,u16 psc)
    {
        RCC->APB2ENR|=1<<11;//TIM1时钟使能    
         TIM1->ARR=arr;  //设定计数器自动重装值//刚好1ms    
        TIM1->PSC=psc;  //预分频器,
        TIM1->DIER|=1<<0;   //允许更新中断                
        TIM1->DIER|=1<<6;   //允许触发中断
        //TIM1->CR1=0x0080;   //ARPE使能 TIMx_ARR寄存器被装入缓冲器           
        TIM1->CR1|=0x01;    //使能定时器1
    
        MY_NVIC_Init(5,0,TIM1_UP_IRQChannel,4);//抢占1,子优先级1,组1                                     
    }
    /*定时器1中断服务程序*/     
    void TIM1_UP_IRQHandler(void)
    {         
        if(TIM1->SR&0X0001)//溢出中断
        {      
             get_num = num;//读取num的值中断次数
        }                   
        TIM1->SR&=~(1<<0);//清除中断标志位  
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 1月15日
  • 已采纳回答 1月7日
  • 创建了问题 1月6日

悬赏问题

  • ¥15 求解 yolo算法问题
  • ¥15 虚拟机打包apk出现错误
  • ¥30 最小化遗憾贪心算法上界
  • ¥15 用visual studi code完成html页面
  • ¥15 聚类分析或者python进行数据分析
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝