完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
STM32外部中断
STM32有19个外部中断:线0-15对应外部IO口的输入中断;线16连接PVD输出;线17连接RTC闹钟事件;线18连接USB唤醒事件。 GPIO与中断线的映射关系:GPIOx.0映射到EXTI0,GPIOx.1映射到EXTI1;以此类推。 使用外部中断需要使能AFIO时钟:RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); 还要设置IO口与中断线的映射关系:(例)GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource5); 然后设置中断的触发模式等初始参数 然后设置NVIC中断优先级 设置完中断优先级后就是编写中断服务函数,STM32的IO口外部中断函数只有6个,中断线0-4分别对应一个中断服务函数,中断线5-9共用一个,10-15公用一个,如图: 注意:设置中断优先级分组需要在主函数中调用相关函数设置,一定要记住初始化函数(初始化延时、按键、LED) 在编写完中断服务函数之后要清楚中断标志位,如图: 外部中断函数 #include “exti.h”//exti.c文件 #include “led.h” #include “key.h” #include “delay.h” #include “usart.h” //外部中断初始化函数 void EXTIX_Init(void) { EXTI_InitTypeDef EXTI_InitStructure1;//中断初始化结构体 NVIC_InitTypeDef NVIC_InitStructure1;//中断优先级初始化结构体 KEY_Init();//初始化按键 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能AFIO时钟 GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource5);//设置I口与中断线的映射关系 EXTI_InitStructure1.EXTI_Line = EXTI_Line5;//设置5号中断线 EXTI_InitStructure1.EXTI_Mode = EXTI_Mode_Interrupt;//设置中断模式 EXTI_InitStructure1.EXTI_Trigger = EXTI_Trigger_Falling;//设置为下降沿触发 EXTI_InitStructure1.EXTI_LineCmd = ENABLE;//使能 EXTI_Init(&EXTI_InitStructure1);//初始化中断 NVIC_InitStructure1.NVIC_IRQChannel = EXTI9_5_IRQn;//使能按键外部中断通道 NVIC_InitStructure1.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2 NVIC_InitStructure1.NVIC_IRQChannelSubPriority = 0x01;//子优先级1 NVIC_InitStructure1.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure1);//初始化中断优先级 } void EXTI9_5_IRQHandler(void)//中断服务函数 { delay_ms(10);//消按键抖动 if(KEY0 == 0){ LED1 = !LED1; LED0 = !LED0; } EXTI_ClearITPendingBit(EXTI_Line5);//清楚中断标置位 } #ifndef __EXTI_H//exti.h文件 #define __EXTI_H #include “sys.h” void EXTIX_Init(void);//IO³õʼ»¯ #endif LED初始化 #include “led2.h”//led.c文件 #include “stm32f10x.h” void Init_LED(void) { GPIO_InitTypeDef str; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIOA RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);//使能GPIOD str.GPIO_Mode = GPIO_Mode_Out_PP;//设置输出模式 str.GPIO_Pin = GPIO_Pin_2;//设置引脚编号 str.GPIO_Speed = GPIO_Speed_50MHz;//设置翻转速度 GPIO_Init(GPIOD,&str);//初始化PD2引脚 GPIO_SetBits(GPIOD,GPIO_Pin_2);//将PD2引脚设置为高电平 str.GPIO_Mode = GPIO_Mode_Out_PP; str.GPIO_Pin = GPIO_Pin_8; str.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA,&str); GPIO_SetBits(GPIOA,GPIO_Pin_8); } #ifndef __LED_H//led.h文件 #define __LED_H #include “sys.h” #define LED0 PAout(8) // PA8,设置PA8引脚的电平状态0和1 #define LED1 PDout(2) // PD2 void Init_LED(void); #endif 按键初始化 #include “key.h”//key.c文件 #include “delay.h” void KEY_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE);//使能GPIOA和GPIOC GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; GPIO_Init(GPIOA, &GPIO_InitStructure); } u8 KEY_Scan(u8 mode) { static u8 key_up=1; if(mode)key_up=1; if(key_up&&(KEY0==0||KEY1==0||WK_UP==1)) { delay_ms(10); key_up=0; if(KEY0==0)return KEY0_PRES; else if(KEY1==0)return KEY1_PRES; else if(WK_UP==1)return WKUP_PRES; }else if(KEY0==1&&KEY1==1&&WK_UP==0)key_up=1; return 0; } #ifndef __KEY_H//key/h文件 #define __KEY_H #include “sys.h” #define KEY0 PCin(5) #define KEY1 PAin(15) #define WK_UP PAin(0) // #define KEY0 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)// // #define KEY1 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15)// // #define WK_UP GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)// #define KEY0_PRES 1 //KEY0 #define KEY1_PRES 2 //KEY1 #define WKUP_PRES 3 //WK_UP void KEY_Init(void); u8 KEY_Scan(u8 mode); #endif 主函数 #include “led.h”//main.c文件 #include “delay.h” #include “sys.h” #include “key.h” #include “usart.h” #include “exti.h” int main(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组位2组 LED_Init(); KEY_Init(); delay_init(); EXTIX_Init(); LED0=LED1=0; while(1)//死循环让程序一直能检测到中断 { } } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1649 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1566 浏览 1 评论
994 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
693 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1613 浏览 2 评论
1872浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
656浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
526浏览 3评论
543浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
515浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-27 18:17 , Processed in 0.748560 second(s), Total 76, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号