一、理解中断
关于32的中断
中断就是给cpu一个信号,cpu收到这个对应的信号再进行指挥
最常用的就是按键 key1按下是咩意思key2呢这样
中断信号线CPU要和对应的元器件连接
二、中断代码
代码编写
所有的0脚对应中断寄存器0,以此类推
引脚为n EXTI_Line(n) GPIO_PinSource(n)
GPIO映射如图
中断服务函数的映射关系
GPIO | IRQn | IRQHandler |
GPIO_Pin0 | EXTI0_IRQn | EXTI0_IRQHandler |
GPIO_Pin1 | EXTI1_IRQn | EXTI1_IRQHandler |
GPIO_Pin2 | EXTI2_IRQn | EXTI2_IRQHandler |
GPIO_Pin3 | EXTI3_IRQn | EXTI3_IRQHandler |
GPIO_Pin4 | EXTI4_IRQn | EXTI4_IRQHandler |
GPIO_Pin5 — GPIO_Pin9 | EXTI9_5_IRQn | EXTI9_5_IRQHandler |
GPIO_Pin10 — GPIO_Pin15 | EXTI15_10_IRQn | EXTI15_10_IRQHandler |
EXTI输入线 | 外部中断输入 | 浮空输入或带上拉输入/下拉输入 |
三、示例代码
ps:我用的是外部中断,上拉输入(触发为低,本来是高电平),PB5
.c文件
/*** @brief 配置嵌套向量中断控制器NVIC* @param 无* @retval 无*/
static void NVIC_Configuration(void)
{NVIC_InitTypeDef NVIC_InitStructure;/* 配置NVIC为优先级组1 *//* 提示 NVIC_PriorityGroupConfig() 在整个工程只需要调用一次来配置优先级分组*/NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);/* 配置中断源:按键1 */NVIC_InitStructure.NVIC_IRQChannel = GM10_INT_EXTI_IRQ;/* 配置抢占优先级 */NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;/* 配置子优先级 */NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;/* 使能中断通道 */NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);}/*** @brief 配置 IO为EXTI中断口,并设置中断优先级* @param 无* @retval 无*/
void EXTI_GM10_Config(void)
{GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure;/*开启按键GPIO口的时钟*/RCC_APB2PeriphClockCmd(GM10_INT_GPIO_CLK,ENABLE);/* 配置 NVIC 中断*/NVIC_Configuration();/*--------------------------GM10配置-----------------------------*//* 选择按键用到的GPIO */ GPIO_InitStructure.GPIO_Pin = GM10_INT_GPIO_PIN;/* 配置为上拉输入 */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(GM10_INT_GPIO_PORT, &GPIO_InitStructure);/* 选择EXTI的信号源 */GPIO_EXTILineConfig(GM10_INT_EXTI_PORTSOURCE, GM10_INT_EXTI_PINSOURCE); EXTI_InitStructure.EXTI_Line = GM10_INT_EXTI_LINE;/* EXTI为中断模式 */EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;/* 上升沿中断 */EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;/* 使能中断 */ EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);
}
//中断函数
void GM10_IRQHandler(void)
{int num;//确保是否产生了EXTI Line中断if(EXTI_GetITStatus(GM10_INT_EXTI_LINE) != RESET) {/*功能代码//中断里代码少写点*///清除中断标志位EXTI_ClearITPendingBit(GM10_INT_EXTI_LINE); }
}
.h文件
#ifndef __EXTI_H
#define __EXTI_H#include "stm32f10x.h"
#include "uart1.h"
#include "LED.h"
//引脚定义 PB5
#define GM10_INT_GPIO_PORT GPIOB
#define GM10_INT_GPIO_CLK (RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO)
#define GM10_INT_GPIO_PIN GPIO_Pin_5
#define GM10_INT_EXTI_PORTSOURCE GPIO_PortSourceGPIOB
#define GM10_INT_EXTI_PINSOURCE GPIO_PinSource5
#define GM10_INT_EXTI_LINE EXTI_Line5
#define GM10_INT_EXTI_IRQ EXTI9_5_IRQn#define GM10_IRQHandler EXTI9_5_IRQHandlervoid EXTI_GM10_Config(void);#endif /* __EXTI_H */