一、配置中断优先级NVIC
1.初始化中断结构体在misc.h中找到 NVIC_InitTypeDef 这个结构体并定义
2.中断优先级分组,在misc.c文件里找到 void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup) 这个函数并选择组数,优先级分组由四个位决定,组0代表0个位用于决定主优先级,4个位用于决定子优先级,此时没有主优先级,有16个子优先级;组1代表有1个位决定主优先级,3个位决定子优先级,此时有两个主优先级,8个子优先级,以此类推
3.配置NVIC这个结构体的成员参数
① NVIC_InitStruct.NVIC_IRQChannel 的参数要到stm32f10x.h里找 ,0~4中断线在/****** STM32 specific Interrupt Numbers *******/这个模块里,大于4小于16的要到开发板对应的模块里找
②设置抢占优先级:根据中断优先分组配置
③设置子优先级:根据中断优先分组配置
④使能或失能总中断
4.调用misc.h中的 void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct) 这个函数将结构体成员参数写入
5.编写中断服务函数
①中断函数名要在 startup_stm32f10x_md.s 中找
②为方便管理所有中断函数要写到 stm32f10x_it.c 里
③判断中断标志位,在 stm32f10x_exit.h 中有 ITStatus EXTI_GetITStatus(uint32_t EXTI_Line) 这个函数 ,判断完后可执行相应操作
④清除中断标志位,在 stm32f10x_exit.h 中有 EXTI_ClearITPendingBit(uint32_t EXTI_Line) 这个函数
二、配置中断函数
1.定义GPIO和EXIT结构体,在 stm32f10x_exit.h 中找到 EXTI_InitTypeDef 这个结构体并定义
2.调用中断优先级(NVIC)函数,配置中断优先级
3.初始化GPIO,初始化要连接到EXIT的GPIO(根据GPIO数字号数选择对应的EXIT),配置中断时引脚模式应该设置为浮空输入(由外部决定),输入的时候不需要定义引脚速度
4.初始化EXIT
①配置外部中断时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE)
②调用stm32f10x_gpio.h中的 GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource),以PC13为例,改为GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13);
③配置EXTI_InitTypeDef结构体成员参数
(1)EXTI_Line:产生中断或事件线
(2)EXTI_Mode:EXTI模式(中断/事件)
(3)EXTI_Trigger:触发方式
(4)EXTI_LineCmd:使能或失能(IMR/EMR)
④配置完后调用void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct); 将配置好的结构体参数写入
exit.h
#ifndef __EXIT_H__
#define __EXIT_H__
#include "stm32f10x.h"
#define LED_GPIO_PIN GPIO_Pin_13
#define LED_GPIO_PORT GPIOC
#define LED_GPIO_CLK RCC_APB2Periph_GPIOC
void EXIT_Config(void);
#endif
exit.c
#include "stm32f10x.h"
#include "exit.h"
static void EXIT_NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStruct.NVIC_IRQChannel = EXTI15_10_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&NVIC_InitStruct);
}
void EXIT_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
EXTI_InitTypeDef EXIT_InitStruct;
EXIT_NVIC_Config();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStruct.GPIO_Pin = LED_GPIO_PIN;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(LED_GPIO_PORT, &GPIO_InitStruct);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13);
EXIT_InitStruct.EXTI_Line = EXTI_Line13;
EXIT_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
EXIT_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
EXIT_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXIT_InitStruct);
}
stm32f10x_it.c
void EXTI15_10_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line13) != RESET )
{
}
EXTI_ClearITPendingBit(EXTI_Line13);
}