STM32f103外部中断

external.h

#ifndef __EXTERNAL_H
#define __EXTERNAL_H

#include "stm32f10x.h"

void External_Init(void);

#endif 

external.c

#include "external.h"
#include "IO.h"

/*******************************************************************
  *	@brief  配置外部中断所需要的管脚
  * @retval None
  */
void External_IO_Config(void)
{
	//定义结构体
	GPIO_InitTypeDef GPIO_InitStructure_Ext;
	//打开GPIOB组时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	//管脚配置
	GPIO_InitStructure_Ext.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure_Ext.GPIO_Pin = GPIO_Pin_1;
	GPIO_InitStructure_Ext.GPIO_Speed = GPIO_Speed_50MHz;
	//管脚初始化
	GPIO_Init(GPIOA, &GPIO_InitStructure_Ext);
}

/*******************************************************************
  *	@brief  配置外部中断功能
  * @retval None
  */
void External_Config(void)
{
	//定义结构体
	EXTI_InitTypeDef EXTI_InitStructure;
	
	//打开中断引脚选择(AFIO)时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
	//选择A组1脚作为外部中断线
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource1);
	
	//指定要启用或禁用的EXTI线路。
	EXTI_InitStructure.EXTI_Line = EXTI_Line1; 			    //EXTI_Line0 ~ EXTI_Line19
	//指定选定EXTI线的新状态。
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;						//启用
								 // = DISABLE;						//禁用
	//指定EXTI线的模式
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;		//中断模式
							  // = EXTI_Mode_Event;			//事件模式
	//指定EXTI线路的触发信号有效沿。
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;					//下降沿触发
	                            //  = EXTI_Trigger_Rising;					//上升沿触发
	                            //  = EXTI_Trigger_Rising_Falling;	 //上升沿下降沿都触发
	//外部中断初始化
	EXTI_Init(&EXTI_InitStructure);
}

/*******************************************************************
  *	@brief  配置中断控制器优先级
  * @retval None
  */
void External_NVIC_Config(void)
{
	//定义结构体
	NVIC_InitTypeDef NVIC_InitStructure;
	
/**
  * @brief  配置优先级分组:抢占优先级和次优先级。
  * @param  NVIC_优先级组:指定优先级分组位长度。
  *   			此参数可以是下列值之一:
  * @arg NVIC_PriorityGroup_0: 0位用于抢占优先级4位用于次优先级
  * @arg NVIC_PriorityGroup_1: 1位用于抢占优先级3位用于次优先级
  * @arg NVIC_PriorityGroup_2: 2位用于抢占优先级2位用于次优先级
  * @arg NVIC_PriorityGroup_3: 3位用于抢占优先级1位用于次优先级
  * @arg NVIC_PriorityGroup_4: 4位用于抢占优先级0位用于次优先级
  * @retval None
  */
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	//指定要启用或禁用的IRQ通道。
	NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;		    //IRQ通道是外部中断1号管脚
	
	//指定NVIC_IRQChannel中定义的IRQ通道是否 将被启用或禁用。
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   					//启用
									   // = DISABLE;					//禁用
	
	//指定IRQ通道的抢占优先级 在NVIC_IRQChannel中指定 参照下表。
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	
	//指定IRQ通道的次优先级 在NVIC_IRQ通道中 参照下表。
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
/**
@code  
 The table below gives the allowed values of the pre-emption priority and subpriority according
 to the Priority Grouping configuration performed by NVIC_PriorityGroupConfig function
  ============================================================================================================================
    NVIC_PriorityGroup   | NVIC_IRQChannelPreemptionPriority | NVIC_IRQChannelSubPriority  | Description
  ============================================================================================================================
   NVIC_PriorityGroup_0  |                0                  |            0-15             |   0 bits for pre-emption priority
                         |                                   |                             |   4 bits for subpriority
  ----------------------------------------------------------------------------------------------------------------------------
   NVIC_PriorityGroup_1  |                0-1                |            0-7              |   1 bits for pre-emption priority
                         |                                   |                             |   3 bits for subpriority
  ----------------------------------------------------------------------------------------------------------------------------    
   NVIC_PriorityGroup_2  |                0-3                |            0-3              |   2 bits for pre-emption priority
                         |                                   |                             |   2 bits for subpriority
  ----------------------------------------------------------------------------------------------------------------------------    
   NVIC_PriorityGroup_3  |                0-7                |            0-1              |   3 bits for pre-emption priority
                         |                                   |                             |   1 bits for subpriority
  ----------------------------------------------------------------------------------------------------------------------------    
   NVIC_PriorityGroup_4  |                0-15               |            0                |   4 bits for pre-emption priority
                         |                                   |                             |   0 bits for subpriority                       
  ============================================================================================================================
@endcode
*/
	
	//中断控制器初始化
	NVIC_Init(&NVIC_InitStructure);
}

/*******************************************************************
  *	@brief  结合以上函数,进行外部中断完整版初始化
  * @retval None
  */
void External_Init(void)
{
	External_IO_Config();
	External_Config();
	External_NVIC_Config();
}


/*******************************************************************
  *	@brief  中断服务函数,函数名是固定的,怎么选,看启动文件。
  *					此函数的内容是:每一次中断,LED取反。
  * @retval None
  */
void EXTI1_IRQHandler(void)
{
	static char a = 0;
	if (EXTI_GetITStatus(EXTI_Line1) == SET)		//判断中断标志位是否等于1
	{
		SetBite_1_0(GPIOB, GPIO_Pin_8, a);
		a = !a;
		EXTI_ClearITPendingBit(EXTI_Line1);				//将标志位清零
	}
}

IO.h

#ifndef __IO_H
#define __IO_H

#include "stm32f10x.h"

void IO_Init(void);
void SetBite_1_0(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, char a);

#endif 

IO.c

#include "IO.h"

/*************************************************************************/
/**
  * @brief  IO初始化配置
  * @retval None
  */
void IO_Init()
{
	//定义结构体,名字自定义
	GPIO_InitTypeDef GPIO_InitStruct_Out_PP;		//配置管脚输出
	GPIO_InitTypeDef GPIO_InitStruct_IPU;			//配置管脚输入
	
	//打开管脚时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);	//打开B组管脚时钟
	
	//管脚配置
		//管脚位
		GPIO_InitStruct_Out_PP.GPIO_Pin = GPIO_Pin_8;		//GPIO_Pin_0 ~ GPIO_Pin_15
		
		//管脚模式														
		GPIO_InitStruct_Out_PP.GPIO_Mode = GPIO_Mode_Out_PP;        //推挽输出管脚(组)配置
									//	 = GPIO_Mode_IN_FLOATING; 	//浮空输入管脚(组)配置
									//	 = GPIO_Mode_IPU;           //上拉输入管脚(组)配置
									//	 = GPIO_Mode_IPD;           //下拉输入管脚(组)配置
									//   = GPIO_Mode_Out_OD; 		//开漏输出管脚(组)配置
									//	 = GPIO_Mode_AIN; 			//模拟输入管脚(组)配置
									//	 = GPIO_Mode_AF_OD; 	//复用开漏输出管脚(组)配置
								    //	 = GPIO_Mode_AF_PP; 	//复用推挽输出管脚(组)配置
		//管脚速度
		GPIO_InitStruct_Out_PP.GPIO_Speed = GPIO_Speed_50MHz;			//高速50MHz
									   // = GPIO_Speed_10MHz;			//中速10MHz	
									   // = GPIO_Speed_2MHz;		    //低速2MHz
																		
	//初始化管脚
	GPIO_Init(GPIOB, &GPIO_InitStruct_Out_PP);
}

/*************************************************************************/
/**
  * @brief  给单个管脚置位0或1
  * @param  管脚组:GPIOx: where x can be (A..G) to select the GPIO peripheral.
  * @param  单个管脚:GPIO_Pin_x:where x can be (0..16) to select the GPIO peripheral.
  * @param	给单个管脚置位0或1
  * @retval None
  */
void SetBite_1_0(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, char a)
{
	if(a)
		GPIO_SetBits(GPIOx, GPIO_Pin);		//管脚置高电平函数
	else
		GPIO_ResetBits(GPIOx, GPIO_Pin);	//管脚置低电平函数
}

main.c

#include "stm32f10x.h"
#include "IO.h"
#include "external.h"


int main()
{
	//调用IO初始化函数
	IO_Init();
	//调用外部中断初始化函数
	External_Init();
	
	while(1)
	{		
			
	}
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值