stm32f407 中断问题

发布者:bobojrt最新更新时间:2022-08-01 来源: csdn关键字:stm32f407  中断问题  嵌套中断 手机看文章 扫描二维码
随时随地手机看文章

1 中断分组

嵌套中断的含义: 高优先级中断能打断低优先级中断

翻译:

在这里插入图片描述

STM32分组为:组0-4(没组都有16个优先级)

分组配置在寄存器SCB->AIRCR中

使用示例:


NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

//设置NVIC中断分组2:2位抢占优先级,2位响应优先级


 #define NVIC_PriorityGroup_2         ((uint32_t)0x500) /*!< 2 bits for pre-emption priority

 

 #define AIRCR_VECTKEY_MASK    ((uint32_t)0x05FA0000)

 

 void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)

{

  /* Check the parameters */

  assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));

  

  /* Set the PRIGROUP[10:8] bits according to NVIC_PriorityGroup value */

  SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;

}

如下图这个图中用了8位:

在这里插入图片描述

SCB->AIRCR 寄存器和IP寄存器

首先两者联系,SCB->AIRCR 寄存器的10:8位bit,决定了,IP寄存器4:7bit的高四位的抢占与响应位的分配:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

那么SCB->AIRCR 寄存器的10:8位bit怎么决定这个分配呢?

AIRCR 寄存器的10:8位,设置几位抢占,几位响应。举例如下:


AIRCR寄存器8:10与IP寄存器4:7


AIRCR寄存器8:10 IP寄存器4:7


0 111 抢占:0bit,响应:4bit


1 110 抢占:1bit,响应:3bit


2 101 抢占:2bit,响应:2bit


3 100 抢占:3bit,响应:1bit


4 011 抢占:4bit,响应:0bit


怎么理解这个表呢?

AIRCR寄存器8:10是111,表示7,即ip寄存器的第四位到第七位为止是响应级(从0开始),本来就ip寄存器的4:7bit,那4,5,6,7bit,都表示响应


AIRCR寄存器8:10是100,表示4,ip寄存器的第四位到第四位表示响应级。即一位表示响应级


设置响应的例子:

MY_NVIC_Init(3,2,EXTI2_IRQn,2); //抢占3,子优先级2,组2


2 中断编程

中断编程的三步曲:

第一步:使能外设某个中断,具体由对应的中断使能位控制。(例如:我们使用到GPIO之前必须开启GPIO端口的时钟,用到EXTI必须开启AFIO时钟)


第二步:初始化NVIC_InitTypeDef结构体,配置中断优先级分组,设置抢占优先级和响应优先级,使能中断请求


第三步:编写中断服务函数,在stm32f0xx_it.c文件中,都有一个根据中断向量表,实现的一个空的中断服务函数,需要我们自己重新编写


3 中断应用

  NVIC_InitStructure.NVIC_IRQChannel = USART6_IRQn; //中断号

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3; //抢占优先级

NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //次优先级

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);


void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)

{

  uint8_t tmppriority = 0x00, tmppre = 0x00, tmpsub = 0x0F;

  if (NVIC_InitStruct->NVIC_IRQChannelCmd != DISABLE)

  {

    /* Compute the Corresponding IRQ Priority --------------------------------*/    

    tmppriority = (0x700 - ((SCB->AIRCR) & (uint32_t)0x700))>> 0x08;

    tmppre = (0x4 - tmppriority);

    tmpsub = tmpsub >> tmppriority;


    tmppriority = NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority << tmppre;

    tmppriority |=  (uint8_t)(NVIC_InitStruct->NVIC_IRQChannelSubPriority & tmpsub);

        

    tmppriority = tmppriority << 0x04;

        

    NVIC->IP[NVIC_InitStruct->NVIC_IRQChannel] = tmppriority;// IP寄存器设置中断优先级

    

    /* Enable the Selected IRQ Channels --------------------------------------*/

    NVIC->ISER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] =

      (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F);

  }

  else

  {

    /* Disable the Selected IRQ Channels -------------------------------------*/

    NVIC->ICER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] =

      (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F);

  }


nvic中断寄存器的配置分布:


typedef struct

{

  __IO uint32_t ISER[8];                 /*!< Offset: 0x000 (R/W)  Interrupt Set Enable Register           */

       uint32_t RESERVED0[24];

  __IO uint32_t ICER[8];                 /*!< Offset: 0x080 (R/W)  Interrupt Clear Enable Register         */

       uint32_t RSERVED1[24];

  __IO uint32_t ISPR[8];                 /*!< Offset: 0x100 (R/W)  Interrupt Set Pending Register          */

       uint32_t RESERVED2[24];

  __IO uint32_t ICPR[8];                 /*!< Offset: 0x180 (R/W)  Interrupt Clear Pending Register        */

       uint32_t RESERVED3[24];

  __IO uint32_t IABR[8];                 /*!< Offset: 0x200 (R/W)  Interrupt Active bit Register           */

       uint32_t RESERVED4[56];

  __IO uint8_t  IP[240];                 /*!< Offset: 0x300 (R/W)  Interrupt Priority Register (8Bit wide) */

       uint32_t RESERVED5[644];

  __O  uint32_t STIR;                    /*!< Offset: 0xE00 ( /W)  Software Trigger Interrupt Register     */

}  NVIC_Type;

关键字:stm32f407  中断问题  嵌套中断 引用地址:stm32f407 中断问题

上一篇:error: #268: declaration may not appear after executable statement in block问题解决方法
下一篇:stm32f4-led

推荐阅读最新更新时间:2024-11-12 10:16

基于stm32F407 10KHZPWM方波以及PWM周期计算
#include sys.h #include timer.h void TIM4_PWM_Init(u16 arr,u16 psc) { RCC- APB1ENR|=1 2;//使能TIM4 RCC- AHB1ENR|=1 3;//使能GPIOD GPIO_Set(GPIOD,PIN12,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU); GPIO_AF_Set(GPIOD,12,2); TIM4- ARR=arr; TIM4- PSC=psc; TIM4- CCMR1|=6 4;//PWM1 mode
[单片机]
STM32中断嵌套NVIC快速入门
简介:STM32 中断与嵌套NVIC 快速入门 //==================================================== // STM32 中断与嵌套NVIC 快速入门 // netjob 2008-8-1 //==================================================== STM32中断与嵌套NVIC快速入门 我也是靠看这本书才弄懂的: Cortex-M3 权威指南 Joseph Yiu 著 宋岩 译 其实很简单。 //CM3 有 最多240个中断(通常外部中断写作IRQs),就是 软件上说的 IRQ CHA
[单片机]
STM32开发笔记58: STM32F407特殊引脚连接电路
单片机型号:STM32F407VGT6 本文介绍STM32F407特殊引脚连接电路,见下图: 引脚:49、73 VCAP_1和VCAP_2,按照下列电路设计方法进行设计。这里应该着重看最后1句话,其表明使用2个0.1uF电容对地即可。 引脚:11、22、28、50、75、100 VDD和VDDA,22脚是模拟电源,这些引脚直接加0.1uF电容去耦即可。 引脚:6 VBAT,该引脚连接电池,用以在主电源掉电后,维持芯片部分部件(例如RTC)继续工作,当不使用这些功能时,可按照下述方法进行电路连接。 引脚:21 VREF+,此引脚有2种处理方法,第1种是独立供给参考电压,其参考电路图如
[单片机]
STM32开发笔记58: <font color='red'>STM32F407</font>特殊引脚连接电路
stm32中断优先级问题
STM32F10x参考手册里并没有关于中断STM32中断优先级的具体介绍,需要参考《STM32F10xxx Cortex-M3 Programming Manual》 一、STM32中中断优先级的概念: STM32(Cortex-M3)中有两个优先级概念 抢占式优先级和响应优先级,有人把响应优先级乘坐 亚优先级 或 副优先级 ,每个中断源都需要被指定这两个优先级。 具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。 当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断
[单片机]
STM32F407--GPIO的工作原理
一、参考资料 1、STM32F407ZGT6.pdf(探索者资料盘A7,硬件资料2,芯片资料) 2、STM32F4xx中文参考手册.pdf(探索者资料盘A8,STM32参考资料) 3、STM32F4开发指南-库函数版本_V1.1.pdf(探索者资料盘A) 二、GPIO口的基本结构 三、引脚的说明 注:STM32大部分引脚可以当GPIO口外,还可以复用为外设功能引脚(如串口)。 四、GPIO的工作模式 1、4种输入模式 (1)GPIO_Mode_IN_FLOATING 浮空输入 (2)GPIO_Mode_IPU 上拉输入 (3)GPIO_Mode_IPD 下拉输入 (4)GPIO_Mode_AI
[单片机]
STM32F407--GPIO的工作原理
STM32开发笔记59: STM32F407的启动模式
单片机型号:STM32F407VGT6 本文介绍STM32F407的启动模式,也称为BOOT模式。STM32F407可以有3种方式进行启动,见下表,我们一般采用从FLASH进行程序启动的方式,所以,对于一般的电路图只需将BOOT0引脚下拉到地,即可满足设计要求,而不需考虑BOOT1引脚。 不过,STM32内部还隐含着另外一种启动方式,如下列文字所述。其表述的思想是STM32在出厂时已内嵌bootloader程序,可以从USART1、USART3、CAN2和USB OTG FS进行启动。 这种启动模式,需将BOOT0设置为1,BOOT1设置为0。所以如果希望应用STM32的Bootloader功能,则需将BO
[单片机]
STM32开发笔记59: <font color='red'>STM32F407</font>的启动模式
MSP430的中断优先级及中断嵌套
MSP430的中断优先级、打开关闭、中断嵌套 优先级顺序从高到低为: PORT2_VECTOR (1 * 2u) /* 0xFFE2 Port 2 */ PORT1_VECTOR (4 * 2u) /* 0xFFE8 Port 1 */ TIMERA1_VECTOR (5 * 2u) /* 0xFFEA Timer A CC1-2, TA */ TIMERA0_VECTOR (6 * 2u) /* 0xFFEC Timer A CC0 */ ADC_VECTOR (7 * 2u) /* 0xFFEE ADC */ USART0TX_VECTOR (8 * 2u) /* 0xFFF0 USART 0 Transmit */ USA
[单片机]
TIM2定时器中断中断嵌套
/************************************************************ Copyright (C), 2012-2022, yin. FileName: main.c Author: ycw Version : 1.0 Date: 2012.04.22 Description: TIM2 EXIT0 NVIC Version: V1.0 Function List: TIM2 EXIT0 NVIC History: author time version desc YCW 12/04/22 1.0
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved