一、理解中断
关于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_IRQHandler
void EXTI_GM10_Config(void);
#endif /* __EXTI_H */