NVIC及按键中断
  pbfHt7yP3Hym 2023年11月12日 22 0

配置过程:

1:初始化GPIO和开启AFIO时钟并且选择好中断引脚

选择中断引脚函数GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);//选择那个引脚为中断引脚

2:初始化NVIC

3:   初始化EXTI 

4:MIAN函数调用

注:一定要开启AFIO的时钟 不然不会中断,并且若有多个中断,不可以只开一次,(测过只在一个函数里使能AFIO,但只能那个用中断,其他的不可以)

NVIC中断函数在MISC里:首先要进行NVIC的组选择,然后配置NVIC的中断源,中断优先级,越小越中断优先级越高,先比较抢占优先级若抢占优先级相同则比较子优先级,若还是相同则由ST的硬件决定,手册有/STM32F10x.也有。抢占优先级 PreemptionPriority    子优先级SubPriority

EXTI:就正常配置 EXTI_Mode模式:中断/事件  EXTI_Trigger触发源:上/下 上下 使能   EXTI_line开启那个LIEN的中断。 LINE16_20是USB以太网的中断具体看看手册 line0——15 是GBIO的.


#include "exti.h"


/*

函数名称:void nvic_init(void)

功能:初始化总NVIV的配置,目前只有中断0和13的中断

参数:无

*/

void nvic_init(void)

{

NVIC_InitTypeDef NVIC_EXTI_LINE0_InitStruct;//中断0的结构体


NVIC_InitTypeDef NVIC_EXTI_LINE13_InitStruct;//中断1的结构体

 

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//NVIC分组 选择的是组2  建议只分一次或用单独的文件去初始化


NVIC_EXTI_LINE0_InitStruct.NVIC_IRQChannel=EXTI0_IRQn;//中断源选择

NVIC_EXTI_LINE0_InitStruct.NVIC_IRQChannelCmd=ENABLE;//使能

//优先级 数值越小 优先级越高

//先判断强占优先级优先级,若该优先级相同,则判断子优先级,若子优先级也相同,就是看STM的硬件优先级的,可在STM32F10X.H查看

NVIC_EXTI_LINE0_InitStruct.NVIC_IRQChannelPreemptionPriority=2;//强占优先级

NVIC_EXTI_LINE0_InitStruct.NVIC_IRQChannelSubPriority=1;//子优先级

NVIC_Init(&NVIC_EXTI_LINE0_InitStruct);//结构体初始化

//同上 line9-5 和line10-15是共用中断源的中断服务函数的,可以用中断标志位去判断,服务函数在startup文件中

NVIC_EXTI_LINE13_InitStruct.NVIC_IRQChannel=EXTI15_10_IRQn;

NVIC_EXTI_LINE13_InitStruct.NVIC_IRQChannelCmd=ENABLE;

NVIC_EXTI_LINE13_InitStruct.NVIC_IRQChannelPreemptionPriority=2;

NVIC_EXTI_LINE13_InitStruct.NVIC_IRQChannelSubPriority=2;

NVIC_Init(&NVIC_EXTI_LINE13_InitStruct);


}

/*

函数名称:void EXRI_GPIOA0_INIT(void)

功能:初始化GBIOA的配置/输出/开启中断/中断配置

参数:无

*/

void EXRI_GPIOA0_INIT(void)

{

GPIO_InitTypeDef GPIO_InitStruct;

EXTI_InitTypeDef EXTI0_InitStruct;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//中断时钟开启(复用也要开这个)只要相关引脚使用就要开不可以说开过下一个就不开了

 

GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPD;

GPIO_InitStruct.GPIO_Pin|=GPIO_Pin_0;

GPIO_Init(GPIOA,& GPIO_InitStruct);

GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);//选择那个引脚为中断引脚

 

EXTI0_InitStruct.EXTI_Line=EXTI_Line0;//中断选择

EXTI0_InitStruct.EXTI_LineCmd=ENABLE;//开启中断

EXTI0_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;//模式选择中断或开启事件(开AD,DMA啥的)

EXTI0_InitStruct.EXTI_Trigger=EXTI_Trigger_Rising;//触发沿选择 上升/下降 2个都可以

EXTI_Init(&EXTI0_InitStruct);

 

}

/*

函数名称:void EXRI_GPIOC13_INIT(void)

功能:初始化GBIOA的配置/输出/开启中断/中断配置

参数:无

*/

void EXRI_GPIOC13_INIT(void)

{

GPIO_InitTypeDef GPIO_InitStruct;

EXTI_InitTypeDef EXTI13_InitStruct;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//中断时钟开启(复用也要开这个)只要相关引脚使用就要开不可以说开过下一个就不开了

GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPD;

GPIO_InitStruct.GPIO_Pin|=GPIO_Pin_13;

GPIO_Init(GPIOC,& GPIO_InitStruct);

GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource13);

 

EXTI13_InitStruct.EXTI_Line=EXTI_Line13;

EXTI13_InitStruct.EXTI_LineCmd=ENABLE;

EXTI13_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;//模式选择中断或开启事件(开AD,DMA啥的)

EXTI13_InitStruct.EXTI_Trigger=EXTI_Trigger_Rising;//触发沿选择 上升/下降 2个都可以

EXTI_Init(&EXTI13_InitStruct);

}


/*

函数名称:void EXTI15_10_IRQHandler(void)

功能:LIEN15-10中断服务函数

参数:无

*/

void EXTI15_10_IRQHandler(void)

{

if(EXTI_GetITStatus(EXTI_Line13))//中断挂起位,发生会为1 如果是其他的中断(15-10改一下就好了 也可以同时一起同)

{

 LED_B_OFF;

}

EXTI_ClearITPendingBit(EXTI_Line13);//清除标志

}

/*

函数名称:void EXTI15_10_IRQHandler(void)

功能:LIEN15-10中断服务函数

参数:无

*/

void EXTI0_IRQHandler()

{

if(EXTI_GetITStatus(EXTI_Line0))

{

 LED_B_ON;

}

EXTI_ClearITPendingBit(EXTI_Line0);


} #include "exti.h"


/*

函数名称:void nvic_init(void)

功能:初始化总NVIV的配置,目前只有中断0和13的中断

参数:无

*/

void nvic_init(void)

{

NVIC_InitTypeDef NVIC_EXTI_LINE0_InitStruct;//中断0的结构体


NVIC_InitTypeDef NVIC_EXTI_LINE13_InitStruct;//中断1的结构体

 

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//NVIC分组 选择的是组2  建议只分一次或用单独的文件去初始化


NVIC_EXTI_LINE0_InitStruct.NVIC_IRQChannel=EXTI0_IRQn;//中断源选择

NVIC_EXTI_LINE0_InitStruct.NVIC_IRQChannelCmd=ENABLE;//使能

//优先级 数值越小 优先级越高

//先判断强占优先级优先级,若该优先级相同,则判断子优先级,若子优先级也相同,就是看STM的硬件优先级的,可在STM32F10X.H查看

NVIC_EXTI_LINE0_InitStruct.NVIC_IRQChannelPreemptionPriority=2;//强占优先级

NVIC_EXTI_LINE0_InitStruct.NVIC_IRQChannelSubPriority=1;//子优先级

NVIC_Init(&NVIC_EXTI_LINE0_InitStruct);//结构体初始化

//同上 line9-5 和line10-15是共用中断源的中断服务函数的,可以用中断标志位去判断,服务函数在startup文件中

NVIC_EXTI_LINE13_InitStruct.NVIC_IRQChannel=EXTI15_10_IRQn;

NVIC_EXTI_LINE13_InitStruct.NVIC_IRQChannelCmd=ENABLE;

NVIC_EXTI_LINE13_InitStruct.NVIC_IRQChannelPreemptionPriority=2;

NVIC_EXTI_LINE13_InitStruct.NVIC_IRQChannelSubPriority=2;

NVIC_Init(&NVIC_EXTI_LINE13_InitStruct);


}

/*

函数名称:void EXRI_GPIOA0_INIT(void)

功能:初始化GBIOA的配置/输出/开启中断/中断配置

参数:无

*/

void EXRI_GPIOA0_INIT(void)

{

GPIO_InitTypeDef GPIO_InitStruct;

EXTI_InitTypeDef EXTI0_InitStruct;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//中断时钟开启(复用也要开这个)只要相关引脚使用就要开不可以说开过下一个就不开了

 

GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPD;

GPIO_InitStruct.GPIO_Pin|=GPIO_Pin_0;

GPIO_Init(GPIOA,& GPIO_InitStruct);

GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);//选择那个引脚为中断引脚

 

EXTI0_InitStruct.EXTI_Line=EXTI_Line0;//中断选择

EXTI0_InitStruct.EXTI_LineCmd=ENABLE;//开启中断

EXTI0_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;//模式选择中断或开启事件(开AD,DMA啥的)

EXTI0_InitStruct.EXTI_Trigger=EXTI_Trigger_Rising;//触发沿选择 上升/下降 2个都可以

EXTI_Init(&EXTI0_InitStruct);

 

}

/*

函数名称:void EXRI_GPIOC13_INIT(void)

功能:初始化GBIOA的配置/输出/开启中断/中断配置

参数:无

*/

void EXRI_GPIOC13_INIT(void)

{

GPIO_InitTypeDef GPIO_InitStruct;

EXTI_InitTypeDef EXTI13_InitStruct;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//中断时钟开启(复用也要开这个)只要相关引脚使用就要开不可以说开过下一个就不开了

GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPD;

GPIO_InitStruct.GPIO_Pin|=GPIO_Pin_13;

GPIO_Init(GPIOC,& GPIO_InitStruct);

GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource13);

 

EXTI13_InitStruct.EXTI_Line=EXTI_Line13;

EXTI13_InitStruct.EXTI_LineCmd=ENABLE;

EXTI13_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;//模式选择中断或开启事件(开AD,DMA啥的)

EXTI13_InitStruct.EXTI_Trigger=EXTI_Trigger_Rising;//触发沿选择 上升/下降 2个都可以

EXTI_Init(&EXTI13_InitStruct);

}


/*

函数名称:void EXTI15_10_IRQHandler(void)

功能:LIEN15-10中断服务函数

参数:无

*/

void EXTI15_10_IRQHandler(void)

{

if(EXTI_GetITStatus(EXTI_Line13))//中断挂起位,发生会为1 如果是其他的中断(15-10改一下就好了 也可以同时一起同)

{

 LED_B_OFF;

}

EXTI_ClearITPendingBit(EXTI_Line13);//清除标志

}

/*

函数名称:void EXTI15_10_IRQHandler(void)

功能:LIEN15-10中断服务函数

参数:无

*/

void EXTI0_IRQHandler()

{

if(EXTI_GetITStatus(EXTI_Line0))

{

 LED_B_ON;

}

EXTI_ClearITPendingBit(EXTI_Line0);

}

MIANd掉用

#include "stm32f10x.h"                  // Device header

#include "exti.h"

#include "rgb_drive.h"

int main(void)

{

 rgb_init();

nvic_init();

EXRI_GPIOC13_INIT();

EXRI_GPIOA0_INIT();

LED_R_OFF;

LED_G_OFF;

LED_B_OFF;

while(1)

{

 

}

}






【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月12日 0

暂无评论

推荐阅读
  QtpjMRSUUfXb   2023年12月08日   48   0   0 引脚#include看门狗
  tprTMCWDkFAR   2023年12月07日   30   0   0 头文件#include初始化
  UYSNSBVoGd8R   2023年12月08日   22   0   0 引脚#include#define
pbfHt7yP3Hym