龙空技术网

每日小结3.外部中断

Sunshineboyl 178

前言:

今天咱们对“外部中断1的中断程序入口地址为”大概比较关怀,各位老铁们都需要了解一些“外部中断1的中断程序入口地址为”的相关内容。那么小编在网上搜集了一些关于“外部中断1的中断程序入口地址为””的相关知识,希望我们能喜欢,看官们快快来学习一下吧!

1.stm32的每个I/O口都可以作为外部中断输入。GPIOA-G,7组,每组PX0-15,16个Pin,共112个。

2.外部中断线

线0-15:对应外部IO口的输入中断。PA0-PG0映射到外部中断线0(EXTI0)、PX.15映射到外部中断线15(EXTI15)。每个中断线同一时刻只能有一个Pin,例如:PA0映射到EXIT0时,PB0-PG0就不能映射。

每个外部中断线可以独立的配置触发方式。(上升沿、下降沿、边沿触发)及使能。

3.外部中断配置步骤

1)初始化IO口作为输入:GPIO_Init();设置输入模式(4种输入,4种输出)、引脚(GPIO_Pin_0-15)、速度(2M、10M、50M)。

2)开启IO口复用时钟:RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);对寄存器AFIO_MAPR(配置复用功能重映射)、AFIO_EXTICRX(配置外部中断线映射)、AFIO_EVCR(配置eVentout事件输出)操作前,应先打开AFIO时钟。

3)设置IO口与中断线映射关系:GPIO_EXTILineConfig();

4)初始化线上中断:EXTI_Init();中断线几、触发模式(上升沿、下降沿、电平触发)、中断模式(中断、事件)、使能(ENABLE、DISABLE)

5)配置中断优先级:NVIC_Init();使能哪条线上的第几级抢占级、第几级响应级。

6)编写中断服务函数:EXTI15_10_IRQHandler();中断进来后要干啥。

 清除中断标志位。EXTI_ClearITPendingBit();

Notion: 1.在初始化时,结构体变量设置为结构体指针变量时编译无误,但下载后板子运行出错。

2.向串口发数据时需要\r\n才会使输出换行。

根据视频编写的程序:

//外部中断初始化函数

void EXTIX_Init(void)

{

//①使能外设、初始化端口 ②开启IO口复用时钟 ③设置IO口与中断线映射关系。④ 线上中断初始化 ⑤配置中断

GPIO_InitTypeDef GPIO_InitStruct;//GPIO初始化结构体变量

EXTI_InitTypeDef EXTI_InitStruct;//线上中断初始化结构体变量

NVIC_InitTypeDef NVIC_InitStruct;//中断管理结构体变量

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//开启IO口复用时钟。对寄存器AFIO_MAPR()配置复用功能重映射、AFIO_EXTICRX(配置外部中断线映射)、AFIO_EVCR(配置eVentout事件输出)操作前,应先打开AFIO时钟。

//将按键KEY1作为外部中断输入,PA15。

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//外设时钟使能

GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;//上拉输入

GPIO_InitStruct.GPIO_Pin=GPIO_Pin_15;//Pin15

GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;//速度

GPIO_Init(GPIOA,&GPIO_InitStruct);//GPIOA初始化

GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource15);//设置IO口与中断线的映射:PA15,映射线为EXTI_Line15。PA0则为EXTI_Line0.

EXTI_InitStruct.EXTI_Line=EXTI_Line15;//中断线

EXTI_InitStruct.EXTI_LineCmd=ENABLE;//使能

EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;//中断模式,非事件模式

EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling;//PA15接按键后接地,下降沿有效

EXTI_Init(&EXTI_InitStruct);//线上中断初始化

NVIC_InitStruct.NVIC_IRQChannel= EXTI15_10_IRQn;//中断线

NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;

NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;//设置抢占优先级前应先设置中断优先级分组

NVIC_InitStruct.NVIC_IRQChannelSubPriority=2;//响应优先级

NVIC_Init(&NVIC_InitStruct);//中断管理初始化

}

//中断服务函数

void EXTI15_10_IRQHandler(void)

{

delay_ms(10);//延时10ms,消抖

if(KEY1==0){ //#define KEY1 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15)

//读GPIOA-Pin15叫电平,KEY1==0,说明按键按下

LED1=!LED1;//用LED灯的亮灭显示中断结果,之前有写led.c,直接调用led.h

}

EXTI_ClearITPendingBit(EXTI_Line15); //清除LINE15线路挂起位

}

int main(void)

{

delay_init(); //延时函数初始化

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2

uart_init(115200); //串口初始化为9600,用于打印

LED_Init(); //初始化与LED连接的硬件接口

EXTIX_Init(); //外部中断初始化

LED1=0; //点亮LED

while(1)

{

printf("OK123\r\n");

delay_ms(1500);

printf("HELLO\r\n");

delay_ms(1500);

}

}

标签: #外部中断1的中断程序入口地址为 #外部中断1的中断类型号为 #如何书写外部中断1中断服务程序 #外部中断请求有两种触发方式 #外部中断有几种