070中断管理
来源:互联网 发布:13.3寸mac高清壁纸 编辑:程序博客网 时间:2024/06/05 01:13
中断嵌套
中断等待中断管理NVIC只管理中断,不对异常进行管理,异常只要开启相应异常功能或一些默认就可以存在打开的
对于中断函数而言:
(1)中断服务函数的函数名必须与中断向量表中的声明一致。
(2)中断服务函数可以编写在工程中的所有位置;
但是意法半导体已经为我们提供了stm32f10x_it.c文件作为存放中断函数。
推荐将中断服务函数编写在此处。
(3)切记!在中断函数当中不能存在延迟较长的事件处理或者认为。禁止在中断函数中使用延时。
(4)在工程中,中断资源是很宝贵的资源,通常用作很必要的事件通知和处理。不能滥用。
抢占优先级:优先级高打断抢占优先级低的中断执行
响应优先级:优先级高的无法打断正在进行的中断,但中断结束后会根据响应优先级的高低去执行相应中断(也
就是处理正在等待的中断其抢占优先级相同的情况下如何处理中断)
在一个中断系统中,允许不同的中断的优先级(包括抢占式和响应式)相同。
以下都有默认优先级,除了其中三个异常外其余都可修改
中断和异常向量:异常的模式分类,关于系统内核带来的
中断和事件:中断类型,外部决定的
()对于中断优先级:它使用了一个整数来表示其优先级的高端。其中数字越小,优先级越高。
对于CPU或者MCU的外设而言,最高的优先级为0。还有三个高于普通优先级的特殊的不可设置的优先级
如果管理MCU的中断?
(1)对于Cortex-M系列的MCU而言,ARM提供了一个名为“嵌套向量中断控制器”的控制器来管理中断。
(2)嵌套向量中断控制器:Nested vectored interrupt controller ,简称为NVIC
中断优先级的分配:
Cortex-M3的优先级:
(1)在Cortex-M3内核中,使用了一个8bit的数据来表示优先级,并且包括抢占式优先级和响应式优先级。
(2)在Cortex-M3内核的中断系统中,可以不存在抢占式优先级,但是必须存在响应式优先级。
(3)STM32F1用4个位来分配优先级,以分组分配,抢占和相应都在这4个位里分组设置
中断向量表
和X86的一样一样,存放中断向量的位置,而向量又存储中断服务程序的地址,通过寻表来找到相应的中断服务程序,汇编定义在启动文件中(.s文件)
中断原理:
1.保存当前指令的地址,还有一些参数配置等,保护现场
2.进入中断向量表
3.找到并执行中断服务程序
4.恢复现场
中断函数的书写标准,所写的位置的约定俗成
中断服务函数一般写在it.c中,且函数名要对应中断向量表的中断名,一般在it.c都有,没有自己编写,函数名对应就可以
注意:中断服务程序的时间越短越好,太长容易CPU挂掉
********************************************************************************************************************************
中断号:中断号的定义顺序是一件中断向量表来定义的。
WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */
PVD_IRQn = 1, /*!< PVD through EXTI Line detection Interrupt */
TAMPER_IRQn = 2, /*!< Tamper Interrupt */
RTC_IRQn = 3, /*!< RTC global Interrupt */
FLASH_IRQn = 4, /*!< FLASH global Interrupt */
RCC_IRQn = 5, /*!< RCC global Interrupt */
EXTI0_IRQn = 6, /*!< EXTI Line0 Interrupt */
EXTI1_IRQn = 7, /*!< EXTI Line1 Interrupt */
EXTI2_IRQn = 8, /*!< EXTI Line2 Interrupt */
EXTI3_IRQn = 9, /*!< EXTI Line3 Interrupt */
EXTI4_IRQn = 10, /*!< EXTI Line4 Interrupt */
DMA1_Channel1_IRQn = 11, /*!< DMA1 Channel 1 global Interrupt */
DMA1_Channel2_IRQn = 12, /*!< DMA1 Channel 2 global Interrupt */
DMA1_Channel3_IRQn = 13, /*!< DMA1 Channel 3 global Interrupt */
DMA1_Channel4_IRQn = 14, /*!< DMA1 Channel 4 global Interrupt */
DMA1_Channel5_IRQn = 15, /*!< DMA1 Channel 5 global Interrupt */
DMA1_Channel6_IRQn = 16, /*!< DMA1 Channel 6 global Interrupt */
DMA1_Channel7_IRQn = 17, /*!< DMA1 Channel 7 global Interrupt */
ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */
USB_HP_CAN1_TX_IRQn = 19, /*!< USB Device High Priority or CAN1 TX Interrupts */
USB_LP_CAN1_RX0_IRQn = 20, /*!< USB Device Low Priority or CAN1 RX0 Interrupts */
CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */
CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */
EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */
TIM1_BRK_IRQn = 24, /*!< TIM1 Break Interrupt */
TIM1_UP_IRQn = 25, /*!< TIM1 Update Interrupt */
TIM1_TRG_COM_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt */
TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */
TIM2_IRQn = 28, /*!< TIM2 global Interrupt */
TIM3_IRQn = 29, /*!< TIM3 global Interrupt */
TIM4_IRQn = 30, /*!< TIM4 global Interrupt */
I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */
I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */
I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */
I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */
SPI1_IRQn = 35, /*!< SPI1 global Interrupt */
SPI2_IRQn = 36, /*!< SPI2 global Interrupt */
USART1_IRQn = 37, /*!< USART1 global Interrupt */
USART2_IRQn = 38, /*!< USART2 global Interrupt */
USART3_IRQn = 39, /*!< USART3 global Interrupt */
EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */
RTCAlarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */
USBWakeUp_IRQn = 42, /*!< USB Device WakeUp from suspend through EXTI Line Interrupt */
TIM8_BRK_IRQn = 43, /*!< TIM8 Break Interrupt */
TIM8_UP_IRQn = 44, /*!< TIM8 Update Interrupt */
TIM8_TRG_COM_IRQn = 45, /*!< TIM8 Trigger and Commutation Interrupt */
TIM8_CC_IRQn = 46, /*!< TIM8 Capture Compare Interrupt */
ADC3_IRQn = 47, /*!< ADC3 global Interrupt */
FSMC_IRQn = 48, /*!< FSMC global Interrupt */
SDIO_IRQn = 49, /*!< SDIO global Interrupt */
TIM5_IRQn = 50, /*!< TIM5 global Interrupt */
SPI3_IRQn = 51, /*!< SPI3 global Interrupt */
UART4_IRQn = 52, /*!< UART4 global Interrupt */
UART5_IRQn = 53, /*!< UART5 global Interrupt */
TIM6_IRQn = 54, /*!< TIM6 global Interrupt */
TIM7_IRQn = 55, /*!< TIM7 global Interrupt */
DMA2_Channel1_IRQn = 56, /*!< DMA2 Channel 1 global Interrupt */
DMA2_Channel2_IRQn = 57, /*!< DMA2 Channel 2 global Interrupt */
DMA2_Channel3_IRQn = 58, /*!< DMA2 Channel 3 global Interrupt */
DMA2_Channel4_5_IRQn = 59 /*!< DMA2 Channel 4 and Channel 5 global Interrupt */
*******************************************************************************************************************************
思路
1.基本配置好后,开启的外设的中断功能,使其相关外设中断所拥有的触发模式一旦触发就进入中断
如USART:
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
USART1->SR &= ~(1<<6);
//清空发送完的标志位,因为如果不清空则第一次就会发送数据会失效,因为默认是置一的,且1时会自动进入发送及其发送中断(如果有中断的话),导致第一次要发送的数据还没写完到寄存器就进入发送了。其能被软件置零,且每次被读取该位(也就是标志位检验函数读取该位时)会自定置零
USART_Cmd(USART1, ENABLE);
2.配置该外设所在的中断
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//中断优先级配置的分组(注意,分组最好只分一次,后面是根据这个分组去对各个中断进行管理配置,如果想多次分组,则各个中断的管理配置需要重新配置)(最好单独拿出来)
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//赋值外设对应的中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//设置该中断抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 7;//设置该中断响应优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//中断使能
NVIC_Init(&NVIC_InitStructure);//配置好后中断初始化
3.中断服务程序,自己编写
4.一些注意的标志位,有些中断是标志位置位进入中断的,如USART读数据寄存器有数据时从0被置1进入中断,而且不会自动清零,这种就有必要手动清零下次才能再进入中断,不然一直是1置不了再也进入不了
0 0
- 070中断管理
- 中断管理之下半部软中断
- 2440之中断管理
- Windows CE 中断管理
- linuxBSPmini2440中断管理
- Rtems--c_user--中断管理
- ARM9 中断管理
- FOS中断管理
- CAN的中断管理
- 5.中断管理
- 3.uCOSIII中断管理
- STM32中断管理
- NVIC中断优先级管理
- 中断和异常管理
- NVIC中断优先级管理
- stm32NVIC中断优先管理
- NuttX 中断管理
- NVIC中断优先级管理
- centos安装supervisor守护进程与简单配置使用
- 华夏互联十年网站开发经验-只为更专业
- django框架创建Python项目CRUDp的步骤
- arcgis for ios 计算距离和面积
- 让java代码更加的简洁
- 070中断管理
- 2016年终总结
- spark core 2.0 ExecutorSource Metrics统计
- 实时流数据分析——2017 年的 27 个预测
- 080定时器啦
- mysql锁表查询和解锁操作
- CTS 问题 第二篇
- ubuntu ln命令的作用
- JavaScript对象中属性的getter和setter方法