完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
一、STM32F103知识总结-外部中断
1.中断的相关概念 (1)。定义: 专业说法:中断指的是计算机运行中,正在运行事情被打断,需要紧急处理 中断是指一个突发事件,中止了CPU当前的工作,转而处理突发事件,处理完成后 再回到当前的工作继续执行。 STM32允许多种多样的中断,如外部IO、ADC、USART、I2C、RTC、USB、PVD等 (1)。中断基础知识: cortex-m3支持256个中断,其中包含了16个内核中断,240个外部中断。(本博文只介绍60个外部可屏蔽中断) stm32只有84个中断,包括16个内核中断和68个可屏蔽中断 stm32f103上只有60个可屏蔽中断,f107上才有68个中断 先占优先级也就是抢占优先级,概念等同于51单片机中的中断。假设有两中断先后触发,已经在执行的中断先占优先级如果没有后触发的中断 先占优先级更高,就会先处理先占优先级高的中断。也就是说又有较高的先占优先级的中断可以打断先占优先级较低的中断。这是实现中断嵌套的基础。 次占优先级,也就是响应优先级,只在同一先占优先级的中断同时触发时起作用,先占优先级相同,则优先执行次占优先级较高的中断。次占优先级不会造成中断嵌套。 如果中断的两个优先级都一致,则优先执行位于中断向量表中位置较高的中断。 2.NVIC嵌套向量中断器 嵌套向量中断控制器;用于为中断分组,从而分配抢占优先级和响应优先级;只要有中断就必须配置NVIC相关函数。从core_cm3.c及core_cm3.h和misc.c及misc.h中配置NVIC。 对于NVIC,其重要知识点就是优先级分组(抢占优先级)和子优先级(响应优先级),STM32F1XX和STM32F4XX都只使用了8位寄存器的高四位[7:4] (1)。抢占优先级和响应优先级的联系和区别(重要原则): 1.高优先级的抢占优先级可以打断正在进行的低抢占优先级中断的 2.抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断 3.抢占优先级相同的中断,当两个中断同时发生的情况下,哪一个的响应优先级高,哪个先执行 4.如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行哪个中断 下面两张图分别为分组: (2)。寄存器,工作器分析:(了解) typedef struct { __IO uint32_t ISER[8]; //中断使能寄存器(重要) uint32_t RESERVED0[24]; /保留位寄存器 __IO uint32_t ICER[8]; //中断清除寄存器(重要) uint32_t RSERVED1[24]; __IO uint32_t ISPR[8]; //中断使能悬起寄存器 uint32_t RESERVED2[24]; __IO uint32_t ICPR[8]; //中断清除悬起寄存器 uint32_t RESERVED3[24]; __IO uint32_t IABR[8]; //中断有效位寄存器 uint32_t RESERVED4[56]; __IO uint8_t IP[240]; //中断优先级寄存器(8Bit wide)最为重要 uint32_t RESERVED5[644]; __O uint32_t STIR; //软件触发中断寄存器 } NVIC_Type; (3).NVIC代码配置: 一、配置分组: NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);//上面有分组状态 二、NVIC初始化: NVIC_InitTypeDef NVIC_InitStruct; //定义结构体变量 NVIC_InitStruct.NVIC_IRQChannel=EXTI9_5_IRQn; //中断线*选择中断源* NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE; //使能中断 NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2; //抢占优先级 2 NVIC_InitStruct.NVIC_IRQChannelSubPriority=2; //子优先级(响应优先级) 2 NVIC_Init(& NVIC_InitStruct); (4)。中断线-中断源: 4.外部中断、事件控制器(EXTI): STM32F1支持将所有GPIO设置为中断输入。 外部IO可由上沿、下沿、高低电平的三种方式触发。 可选择中断或事件触发。 (1)。中断触发模式: (2)中断与事件: (3)外部中断/事件线路映射: 额外说明图: (4)。中断开启过程: 主要过程:中断——分组——具体中断设置到组里面 1.在RCC里将要使用的IO口时钟和复位时钟打开 2.在GPIO里将该IO口映射到相对应的外部中断 3.在NVIC里将该中断通道打开 (5)。中断固件库函数: (6)。中断代码实现: 一、中断初始化: NVIC_InitTypeDef NVIC_InitStruct; //定义结构体变量 EXTI_InitTypeDef EXTI_InitStruct; //定义结构体变量 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //启动GPIO时钟 (需要与复用时钟一同启动) RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO , ENABLE);//配置端口中断需要启用复用时钟(此配置是必须的!!!!) GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource4); //定义 GPIO 中断(PA4) EXTI_InitStruct.EXTI_Line=EXTI_Line4; //定义中断线(上图的额外:EXTI4) EXTI_InitStruct.EXTI_LineCmd=ENABLE; //中断使能 EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt; //中断模式为 中断 EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling; //下降沿触发 EXTI_Init(& EXTI_InitStruct);//初始化 二、中断函数: void EXTI0_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line0)!=RESET) { GPIO_WriteBit(GPIOB,GPIO_Pin_0,(BitAction)(0)); //PB1接口输出低电平0 } EXTI_ClearITPendingBit(EXTI_Line0);//清除LINE0上的中断标志 }//此项目为打开LED灯 (7)。中断的注意事项: 中断函数的取名必须根据startup_stm32f10x_md.s上来: |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1683 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1582 浏览 1 评论
1013 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
703 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1627 浏览 2 评论
1892浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
675浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
538浏览 3评论
557浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
526浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-4 01:02 , Processed in 0.908990 second(s), Total 76, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号