完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
第一个问题,关于中断线的理解。stm32的每个IO口都可以作为外部中断的输入口,但外部中断中与IO相关的中断线只有16条(IO口有几十个甚至上百个)。为什么要这样呢?当然是为了节约资源啦。打个比方:我们住的楼房每一层都有好几个住户,大家公用一个楼道,节约了道路资源。到用的时候我们控制寄存器打开某个IO口的中断触发装置就好了。下为中断线映射图
中断映射是个啥嘞?顾名思义就是个映射呗,就像寄存器映射一样,有点类似对号入座,一一对应。 第二个问题,如何应用外部中断。一般步骤为 1)初始化 IO 口为输入。(外部中断作用为外部输入信号触发中断,故设为输入) 2)开启 IO 口复用时钟,设置 IO 口与中断线的映射关系。(用IO口是必须要使能时钟的,当涉及到IO口复用时要用复用时钟,在用中断的情况下我们用复用时钟Alternate function IO 即 AFIO) 3)初始化线上中断,设置触发条件等。(这里需要一个线上中断初始化结构体变量,类似于初始化IO口的结构体变量) 4)配置中断分组(NVIC),并使能中断。(要使用中断依然需要中断分组,确定每个中断寄存器的位是响应优先级or抢占优先级) 5)编写中断服务函数 下面我们以一个具体实验来讲解:(讲解以每句“//”后内容为主) //以下是在EXIO.c中的代码 #include "exti.h" #include "led.h" #include "key.h" #include "delay.h" #include "usart.h" //外部中断初始化函数 void EXTIX_Init(void) { EXTI_InitTypeDef EXTI_InitStructure;//定义结构体变量 NVIC_InitTypeDef NVIC_InitStructure;//定义中断分组变量 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //外部中断,需要使能 AFIO 时钟,复用时钟AFIO KEY_Init();//初始化按键对应 io 模式,在KEY.c中有具体代码,此处仅为调用 //GPIOC.5 中断线以及中断初始化配置 GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource5);//中断线映射函数,将中断线映射到GPIOC,Pin5 EXTI_InitStructure.EXTI_Line=EXTI_Line5;//中断线上中断初始化,第一步选择中断线五 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//第二步,开启中断模式 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发 EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能 EXTI_Init(&EXTI_InitStructure);//初始化中断 //根据 EXTI_InitStruct 中指定的参数初始化外设 EXTI 寄存器 //GPIOA.15 中断线以及中断初始化配置 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource15);//与上一个中断线中断同理 EXTI_InitStructure.EXTI_Line=EXTI_Line15; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); //根据 EXTI_InitStruct 中指定的参数初始化外设 EXTI 寄存器 //GPIOA.0 中断线以及中断初始化配置 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);//与上一个中断线中断同理 EXTI_InitStructure.EXTI_Line=EXTI_Line0; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); //根据 EXTI_InitStruct 中指定的参数初始化外设 EXTI 寄存器 NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //使能按键所在的外部中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级 2 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; //子优先级 1 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道 NVIC_Init(&NVIC_InitStructure); //根据 NVIC_InitStruct 中指定的参数初始化外设 NVIC 寄存器 NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; //使能按键所在的外部中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级 2, NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; //子优先级 1 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道 NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; //使能按键所在的外部中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级 2, NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; //子优先级 1 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道 NVIC_Init(&NVIC_InitStructure); } void EXTI0_IRQHandler(void)//中断服务函数 { delay_ms(10); //消抖 if(WK_UP==1) { LED0=!LED0; LED1=!LED1; } EXTI_ClearITPendingBit(EXTI_Line0); //清除 EXTI0 线路挂起位 } void EXTI9_5_IRQHandler(void) { delay_ms(10); //消抖 if(KEY0==0) { LED0=!LED0; } EXTI_ClearITPendingBit(EXTI_Line5); //清除 LINE5 上的中断标志位 } void EXTI15_10_IRQHandler(void) { delay_ms(10); //消抖 if(KEY1==0) { LED1=!LED1; } EXTI_ClearITPendingBit(EXTI_Line15); //清除 LINE15 线路挂起位 } //以下为main函数中的代码 #include "led.h" #include "delay.h" #include "sys.h" #include "key.h" #include "usart.h" #include "exti.h" int main(void) { delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断分组 uart_init(9600); //串口初始化波特率为 9600 LED_Init(); //初始化与 LED 连接的硬件接口 EXTIX_Init(); //外部中断初始化 LED0=0; //点亮 LED while(1) { printf("OKn"); delay_ms(1000); } } 以上为外部中断实验的个人理解,如有错误欢迎指正交流。 |
|
|
|
只有小组成员才能发言,加入小组>>
3309 浏览 9 评论
2988 浏览 16 评论
3490 浏览 1 评论
9050 浏览 16 评论
4085 浏览 18 评论
1171浏览 3评论
602浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
594浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2331浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1894浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-20 08:40 , Processed in 1.181041 second(s), Total 80, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号