您的位置:首页 > 其它

STM32:STM32学习记录5: 外部中断

2016-03-12 15:32 281 查看
配置流程:

1:系统时钟初始化,包括系统时钟和要开放的IO口或者功能的时钟配置。

2:IO口初始化,包括引脚,速率,输入输出模式等。

3:NVIC 中断向量配置 ,中断向量基地址和优先级的配置。

4:EXTI 中断/事件控制器,使能或失能外部线路,使能的模式(事件请求和中断请求),边沿触发模式,状态等。

说明:

1:主函数写在main.c中,中断函数写在stm32f10x_it.c
,找到相应的中断函数(一般都是空白),加入自己的中断代码即可。

2:中断函数名在startup_stm32f10x_xx.s中查阅

3:清除 EXT13 线路的挂起位 注意此处一定要清除!!!!!!!!在EXTI_PR寄存器中

3:NVIC一般配置流程:(需要中断就要配置)

void NVIC_Configuare(void)

{

NVIC_InitTypeDef NVIC_InitStructure;

NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);//设定中断向量表基址0x08000000

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);// 先占优先级0位 从优先级4位

//使能KEY0,KEY1中断

NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;//外部中断线15-10中断 由于两个按键是PA13 PA15由外部中断IO映射得知

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x0F; //先占优先级0位,从优先级4位

NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x0F; //

NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;

NVIC_Init(&NVIC_InitStructure);

}

4:EXIT中断、事件控制器配置流程

// EXTI_InitTypeDef EXTI_InitStructure;

// EXTI_InitStructure.EXTI_Line=EXTI_Line0;//外部中断线 0

// EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; //设置 EXTI 线路为中断请求

// EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;//设置输入线路上升沿为中断请求

// EXTI_InitStructure.EXTI_LineCmd=ENABLE;

// EXTI_Init(&EXTI_InitStructure);

main.c文件为:
#include"stm32f10x.h"

#define LED0_ON  GPIO_SetBits(GPIOA,GPIO_Pin_8)    // LED0开
#define LED0_OFF GPIO_ResetBits(GPIOA,GPIO_Pin_8)//LED0关
#define LED1_ON  GPIO_SetBits(GPIOD,GPIO_Pin_2)     //LED1开
#define LED1_OFF GPIO_ResetBits(GPIOD,GPIO_Pin_2)//LED1关

//初始化IO端口
void IO_Configuart(void)
{
GPIO_InitTypeDef GPIO_InitStructure;//定义 GPIO_InitStructure为    GPIO_InitTypeDef结构体类型

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;//引脚选择
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//50MHz速率
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出
GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化

//配置GPIOD_2
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;//引脚选择
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//50MHz速率
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出
GPIO_Init(GPIOD,&GPIO_InitStructure);//初始化

//配置GPIOA_13     KEY0
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;//引脚选择
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//50MHz速率
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU ;//上拉输入     由于按键按下为低电平
GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化
//    //配置GPIOA_15     KEY1
//    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_15;//引脚选择
//    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//50MHz速率
//    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//上拉输入  由于按键按下为低电平
//    GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化
//    //配置GPIOA_0     WK_UP
//    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_15;//引脚选择
//    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//50MHz速率
//    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;//下拉输入  由于按键按下为高电平
//    GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化

//    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
//    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);//允许总线CLOCK,在使用GPIO之前必须允许相应的端口时钟
}

//复位和系统时钟控制
void RCC_Configuare(void)
{
SystemInit();//频率设定有system_stm32f10x.c文件中的宏定义 开放某个宏 当调用SystemInit()时即可设置好频率
RCC_ClockSecuritySystemCmd(ENABLE);//使能或者失能时钟安全系统

//使能GPIOA,GPIOD端口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);//允许总线CLOCK,在使用GPIO之前必须允许相应的端口时钟
/*    也可以写为RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD,ENABLE);   更加简洁*/
}
//NVIC设置
void NVIC_Configuare(void)
{
NVIC_InitTypeDef   NVIC_InitStructure;
NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);//设定中断向量表基址0x08000000
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);// 先占优先级0位  从优先级4位

//使能KEY0,KEY1中断
NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;//外部中断线15-10中断  由于两个按键是PA13 PA15由外部中断IO映射得知
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x0F;    //先占优先级0位,从优先级4位
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x0F;         //
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
//    //使能WK_UP中断
//    NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn;//外部中断线0中断  WK_UP按键 接PA0
//    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;    //先占优先级0位,从优先级4位
//    NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;         //
//    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
//    NVIC_Init(&NVIC_InitStructure);
}

void Delay(u16 speed)
{
u16 i=0;
while(speed!=0)
{
speed--;
for(i=0;i<400;i++);
}
}
int main(void)
{
EXTI_InitTypeDef  EXTI_InitStructure;

//    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);    //JTAG-DP 失能 + SW-DP使能
//    GPIO_AFIODeInit(); //将复用功能(重映射事件控制和 EXTI 设置)重设为缺省值
//    GPIO_DeInit(GPIOA);
//    GPIO_DeInit(GPIOD);

RCC_Configuare();
IO_Configuart();
NVIC_Configuare();
LED1_OFF;

//    EXTI_InitStructure.EXTI_Line=EXTI_Line0;//外部中断线 0
//    EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; //设置 EXTI 线路为中断请求
//    EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;//设置输入线路上升沿为中断请求
//    EXTI_InitStructure.EXTI_LineCmd=ENABLE;
//    EXTI_Init(&EXTI_InitStructure);

EXTI_InitStructure.EXTI_Line=EXTI_Line13;//外部中断线 13
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; //设置 EXTI 线路为中断请求
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling ;//设置输入线路下降沿为中断请求
EXTI_InitStructure.EXTI_LineCmd=ENABLE;
EXTI_Init(&EXTI_InitStructure);

//    EXTI_InitStructure.EXTI_Line=EXTI_Line15;//外部中断线 15
//    EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; //设置 EXTI 线路为中断请求
//    EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling ;//设置输入线路下降沿为中断请求
//    EXTI_InitStructure.EXTI_LineCmd=ENABLE;
//    EXTI_Init(&EXTI_InitStructure);
while(1)
{
LED0_ON;
//        LED1_OFF;
Delay(2000);
LED0_OFF;
//        LED1_ON;
Delay(2000);
}
}

// void EXTI15_10_IRQHandler(void)
//{
//    if(EXTI_GetITStatus(EXTI_Line13)!=RESET)  //按键1按下
//    {
//        LED0_ON;
//    }
//    else
//    {
//        LED0_OFF;
//    }
//    if(EXTI_GetITStatus(EXTI_Line15)!=RESET)  //按键2按下
//    {
//        LED1_ON;
//    }
//    else
//    {
//        LED1_OFF;
//    }
//
//
//
//    EXTI_ClearITPendingBit(EXTI_Line13);//待清除 EXT13 线路的挂起位
//    EXTI_ClearITPendingBit(EXTI_Line15);
//}
//
//void EXTI0_IRQHandler(void)
//{
//    if(EXTI_GetITStatus(EXTI_Line15)!=RESET)  //按键WK_UP按下
//    {
//        LED1_ON;
//        LED0_ON;
//    }
//    else
//    {
//        LED1_OFF;
//        LED0_OFF;
//    }
//    EXTI_ClearITPendingBit(EXTI_Line0);    //待清除 EXTI 线路的挂起位
//}

stm32f10x_it.c 文件为:
/**
******************************************************************************
* @file    GPIO/IOToggle/stm32f10x_it.c
* @author  MCD Application Team
* @version V3.4.0
* @date    10/15/2010
* @brief   Main Interrupt Service Routines.
*          This file provides template for all exceptions handler and peripherals
*          interrupt service routine.
******************************************************************************
* @copy
*
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*
* <h2><center>© COPYRIGHT 2010 STMicroelectronics</center></h2>
*/

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x_it.h"
#define LED0_ON  GPIO_SetBits(GPIOA,GPIO_Pin_8)    // LED0开
#define LED0_OFF GPIO_ResetBits(GPIOA,GPIO_Pin_8)//LED0关
#define LED1_ON  GPIO_SetBits(GPIOD,GPIO_Pin_2)     //LED1开
#define LED1_OFF GPIO_ResetBits(GPIOD,GPIO_Pin_2)//LED1关

/** @addtogroup STM32F10x_StdPeriph_Examples
* @{
*/

/** @addtogroup GPIO_IOToggle
* @{
*/

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/

/******************************************************************************/
/*            Cortex-M3 Processor Exceptions Handlers                         */
/******************************************************************************/

/**
* @brief  This function handles NMI exception.
* @param  None
* @retval None
*/
void NMI_Handler(void)
{
}

/**
* @brief  This function handles Hard Fault exception.
* @param  None
* @retval None
*/
void HardFault_Handler(void)
{
/* Go to infinite loop when Hard Fault exception occurs */
while (1)
{
}
}

/**
* @brief  This function handles Memory Manage exception.
* @param  None
* @retval None
*/
void MemManage_Handler(void)
{
/* Go to infinite loop when Memory Manage exception occurs */
while (1)
{
}
}

/**
* @brief  This function handles Bus Fault exception.
* @param  None
* @retval None
*/
void BusFault_Handler(void)
{
/* Go to infinite loop when Bus Fault exception occurs */
while (1)
{
}
}

/**
* @brief  This function handles Usage Fault exception.
* @param  None
* @retval None
*/
void UsageFault_Handler(void)
{
/* Go to infinite loop when Usage Fault exception occurs */
while (1)
{
}
}

/**
* @brief  This function handles SVCall exception.
* @param  None
* @retval None
*/
void SVC_Handler(void)
{
}

/**
* @brief  This function handles Debug Monitor exception.
* @param  None
* @retval None
*/
void DebugMon_Handler(void)
{
}

/**
* @brief  This function handles PendSV_Handler exception.
* @param  None
* @retval None
*/
void PendSV_Handler(void)
{
}

/**
* @brief  This function handles SysTick Handler.
* @param  None
* @retval None
*/
void SysTick_Handler(void)
{
}

/******************************************************************************/
/*                 STM32F10x Peripherals Interrupt Handlers                   */
/*  Add here the Interrupt Handler for the used peripheral(s) (PPP), for the  */
/*  available peripheral interrupt handler's name please refer to the startup */
/*  file (startup_stm32f10x_xx.s).                                            */
/******************************************************************************/

//中断处理函数
void EXTI15_10_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line13)!=RESET)  //按键0按下
{
LED1_ON;
}
else
{
LED1_OFF;
}
//    if(EXTI_GetITStatus(EXTI_Line15)!=RESET)  //按键1按下
//    {
//        LED1_ON;
//    }
//    else
//    {
//        LED1_OFF;
//    }

EXTI_ClearITPendingBit(EXTI_Line13);//待清除 EXT13 线路的挂起位  注意此处一定要清除
//    EXTI_ClearITPendingBit(EXTI_Line15);
}

//void EXTI0_IRQHandler(void)
//{
//    if(EXTI_GetITStatus(EXTI_Line15)!=RESET)  //按键WK_UP按下
//    {
//        LED1_ON;
//        LED0_ON;
//    }
//    else
//    {
//        LED1_OFF;
//        LED0_OFF;
//    }
//    EXTI_ClearITPendingBit(EXTI_Line0);    //待清除 EXTI 线路的挂起位
//}
/**
* @brief  This function handles PPP interrupt request.
* @param  None
* @retval None
*/

/*void PPP_IRQHandler(void)
{
}*/

/**
* @}
*/

/**
* @}
*/

/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: