stm32按键中断实验

stm32按键中断实验_第1张图片

 stm32按键中断实验_第2张图片

数字越小,优先级越高。抢占大于响应

中断优先级设置中断设置相关寄存器

IO uint8_t IP[240]; //中断优先级控制的寄存器组

IO uint32_t ISER[8]; //中断使能寄存器组

IO uint32_t ICER[8]; //中断失能寄存器组

IO uint32_t ISPR[8];//中断挂起寄存器组

IO uint32_t ICPR[8]; //中断解挂寄存器组

IO uint32_t IABR[8]; //中断激活标志位寄存器组

 

中断编程的顺序

1.使能中断请求

2.配置中断优先级分组

3.配置NVIC寄存器,初始化NIVC_InitTypeDef,再调用初始化函数

4.编写中断服务函数

        中断服务函数怎么写

                函数地址(名称)在启动文件中

                写错了不会报错

                中断服务函数写在stm32f10x_it.c

外部中断固件库编程

初始化结构体

EXTI_InitTypeDef

1-EXTI_Line :用于产生 中断/事件线

2-EXTI_Mode: EXTI模式(中断/事件)

3-EXTI_Trigger :触发(上/下/上下)

4-EXTI_LineCmd :使能或者失能(IMR/EMR)

编程要点:(野火板子)

bsp_exti.c

#include "bsp_exti.h"
void NVIC_config()
{
	//第一步,配置优先级组
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
	//第二步,配置初始化
	NVIC_InitTypeDef NVIC_InitStruct;
	NVIC_InitStruct.NVIC_IRQChannel=EXTI0_IRQn;
	NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;
	NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
	NVIC_Init(&NVIC_InitStruct);
	
	//第三步,配置key2的
	NVIC_InitStruct.NVIC_IRQChannel=EXTI15_10_IRQn;
	NVIC_Init(&NVIC_InitStruct);
}


void key_config()
{
	//第一步,开启时钟按键
	RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);
	//开启中断时钟
	RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO, ENABLE);
	//第二步,配置按键初始化
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;//因为是外部电平
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStruct);
	//配置NVIC中断
	NVIC_config();
	//第三步,为按键选择中断信号,配置中断线(20根那个)
	GPIO_EXTILineConfig( GPIO_PortSourceGPIOA, GPIO_PinSource0);
	
	//第四步,配置外部中断初始化
	EXTI_InitTypeDef EXTI_InitStruct;
	EXTI_InitStruct.EXTI_Line=EXTI_Line0;
	EXTI_InitStruct.EXTI_LineCmd=ENABLE;
	EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;
	EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Rising;
	EXTI_Init(&EXTI_InitStruct);
	
	//第五步配置key2
	RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE);
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_13;
	GPIO_Init(GPIOA,&GPIO_InitStruct);
	GPIO_EXTILineConfig( GPIO_PortSourceGPIOC, GPIO_PinSource13);
	EXTI_InitStruct.EXTI_Line=EXTI_Line13;
	EXTI_Init(&EXTI_InitStruct);
}


void EXTI0_IRQHandler()
{
	if(EXTI_GetITStatus( EXTI_Line0)!=RESET)
	{
		LED1_TOGGLE;
	}
	EXTI_ClearITPendingBit(EXTI_Line0);

}
void EXTI15_10_IRQHandler()
{
	if(EXTI_GetITStatus( EXTI_Line13)!=RESET)
	{
		LED2_TOGGLE;
	}
	EXTI_ClearITPendingBit(EXTI_Line13);

}

你可能感兴趣的:(stm32,单片机,嵌入式硬件)