stm32f103中断函数配置

一、配置中断优先级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);   
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值