前言:
今天咱们对“外部中断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中断服务程序 #外部中断请求有两种触发方式 #外部中断有几种