中断的初步学习

中断相当于,在做一件事的时候,如果遇到另外一件事就去先完成这件事再来继续这件事。
首先对于中断配置过程代码

#include"exti.h"
#include <stm32f10x.h>

void Exti_Init(void)
{
   GPIO_InitTypeDef fire_init;
	 EXTI_InitTypeDef exti_init;
	 NVIC_InitTypeDef nvic_init;
	
	 NVIC_PriorityGroupConfig( NVIC_PriorityGroup_2);//
	 //1.配置nvic抢占优先级
	 RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA,ENABLE);
     RCC_APB2PeriphResetCmd(RCC_APB2Periph_AFIO,ENABLE); //配置中断寄存器
	 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource1);//外部中断线的配置
	
	 fire_init.GPIO_Mode   =  GPIO_Mode_IPU ;
	 fire_init.GPIO_Pin    =  GPIO_Pin_1;
	 fire_init.GPIO_Speed  =  GPIO_Speed_10MHz;
	
	 GPIO_Init(GPIOA, &fire_init);
  //2.配置外部中断
	 exti_init.EXTI_Line     = EXTI_Line1;//这是GPIO1所以是1
	 exti_init.EXTI_LineCmd  = ENABLE;//使能
	 exti_init.EXTI_Mode     = EXTI_Mode_Interrupt;//中断模式
	 exti_init.EXTI_Trigger  = EXTI_Trigger_Falling;//正常时高电平,反应后是低电平,所以这里是降压中断
	
	 EXTI_Init(&exti_init);
	
	 //3.配置nvic中断器,在内核中找miss.c
	 nvic_init.NVIC_IRQChannel                    = EXTI1_IRQn;//这里是找因为是GPIO1#include <stm32f10x.h>
	 nvic_init.NVIC_IRQChannelCmd                 = ENABLE;
	 nvic_init.NVIC_IRQChannelPreemptionPriority  = 1;//先根据这个进行第一次优先级排
	 nvic_init.NVIC_IRQChannelSubPriority         =  1;//其次根据这个来进行第二次优先级
	 
	 NVIC_Init(&nvic_init);  //NVIC初始化
}

中断函数去使用,可以避免取进行while死循环的浪费资源


#include "stm32f10x.h"
#include "main.h"
#include"relay.h"
#include"led.h"
#include"fire.h"
#include"exti.h"

void  i_delay(uint16_t x)
{
     uint16_t m;
	   uint16_t L;
	   
	   for(L=x;L>0;L--){
		 
			 for(m=1000;m>0;m--);
		 }

}



int  main()
{   
	  int i=0;
   // Relay_Init();
    LED_Init();
	  Fire_Init(); 
	  Exti_Init();  
	
    GPIO_SetBits(GPIOC, GPIO_Pin_13);
	 
	  for(i=3;i>0;i--)
	  {
     	  
			 GPIO_ResetBits(GPIOC, GPIO_Pin_13);
 		   i_delay(10000);
	     GPIO_SetBits(GPIOC, GPIO_Pin_13);
		   i_delay(10000);
	
	 }
	   
	
   while(1)
	 {
     /*   if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)==1)
        {
				       GPIO_ResetBits(GPIOA, GPIO_Pin_3);
					     i_delay(10000);
					     GPIO_SetBits(GPIOC, GPIO_Pin_3);
					     i_delay(10000);
				}
				else
        {
				         
					       GPIO_SetBits(GPIOA, GPIO_Pin_3);
				}*/
   

	 }
		 
   
}
void EXTI1_IRQHandler(void)//在启动文件中去找中断函数
{
     if(EXTI_GetITStatus(EXTI_Line1)!=0)// RESET代表0判断是否发生中断,这里相当于GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
     {
               GPIO_ResetBits(GPIOA, GPIO_Pin_3);
					     i_delay(10000);
					     GPIO_SetBits(GPIOC, GPIO_Pin_3);
					     i_delay(10000);
		 }
		 else{
		           GPIO_SetBits(GPIOC, GPIO_Pin_3);
		 }
		 EXTI_ClearITPendingBit(EXTI_Line1);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值