首先是中断优先级分组

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//########################下面是内容########################
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;
}

assert_param查看参数是否有效;

NVIC_PriorityGroup可选范围如下:

#define NVIC_PriorityGroup_0         ((uint32_t)0x700) /*!< 0 bits for pre-emption priority4 bits for subpriority */
#define NVIC_PriorityGroup_1         ((uint32_t)0x600) /*!< 1 bits for pre-emption priority3 bits for subpriority */
#define NVIC_PriorityGroup_2         ((uint32_t)0x500) /*!< 2 bits for pre-emption priority2 bits for subpriority */
#define NVIC_PriorityGroup_3         ((uint32_t)0x400) /*!< 3 bits for pre-emption priority1 bits for subpriority */
#define NVIC_PriorityGroup_4         ((uint32_t)0x300) /*!< 4 bits for pre-emption priority0 bits for subpriority */
/*############################展开#################################*/
NVIC_PriorityGroup_0   0111 0000 0000
NVIC_PriorityGroup_1   0110 0000 0000
NVIC_PriorityGroup_2   0101 0000 0000
NVIC_PriorityGroup_3   0100 0000 0000
NVIC_PriorityGroup_4   0011 0000 0000

AIRCR_VECTKEY_MASK定义如下:

#define AIRCR_VECTKEY_MASK    ((uint32_t)0x05FA0000)

相与后送到SCB->AIRCR中,SCB定义如下:

#define SCB                 ((SCB_Type *)           SCB_BASE)
#############################################################
#define SCB_BASE            (SCS_BASE +  0x0D00)
#############################################################
#define SCS_BASE            (0xE000E000)

所以SCB首地址是0xE000 ED00;SCB是个结构体指针,结构体定义如下:

typedef struct
{__I  uint32_t CPUID;                        /*!< Offset: 0x00  CPU ID Base Register                                  */__IO uint32_t ICSR;                         /*!< Offset: 0x04  Interrupt Control State Register                      */__IO uint32_t VTOR;                         /*!< Offset: 0x08  Vector Table Offset Register                          */__IO uint32_t AIRCR;                        /*!< Offset: 0x0C  Application Interrupt / Reset Control Register        */__IO uint32_t SCR;                          /*!< Offset: 0x10  System Control Register                               */__IO uint32_t CCR;                          /*!< Offset: 0x14  Configuration Control Register                        */__IO uint8_t  SHP[12];                      /*!< Offset: 0x18  System Handlers Priority Registers (4-7, 8-11, 12-15) */__IO uint32_t SHCSR;                        /*!< Offset: 0x24  System Handler Control and State Register             */__IO uint32_t CFSR;                         /*!< Offset: 0x28  Configurable Fault Status Register                    */__IO uint32_t HFSR;                         /*!< Offset: 0x2C  Hard Fault Status Register                            */__IO uint32_t DFSR;                         /*!< Offset: 0x30  Debug Fault Status Register                           */__IO uint32_t MMFAR;                        /*!< Offset: 0x34  Mem Manage Address Register                           */__IO uint32_t BFAR;                         /*!< Offset: 0x38  Bus Fault Address Register                            */__IO uint32_t AFSR;                         /*!< Offset: 0x3C  Auxiliary Fault Status Register                       */__I  uint32_t PFR[2];                       /*!< Offset: 0x40  Processor Feature Register                            */__I  uint32_t DFR;                          /*!< Offset: 0x48  Debug Feature Register                                */__I  uint32_t ADR;                          /*!< Offset: 0x4C  Auxiliary Feature Register                            */__I  uint32_t MMFR[4];                      /*!< Offset: 0x50  Memory Model Feature Register                         */__I  uint32_t ISAR[5];                      /*!< Offset: 0x60  ISA Feature Register                                  */
} SCB_Type; 

其中AIRCR为32位,10:8位设置优先级分组,如下图(Cortex-M3权威指南P285),31:16位必须为0xFA05,所以AIRCR_VECTKEY_MASK值为((uint32_t)0x05FA0000)。

所以选第二组的话此时SCB->AIRCR值为:0x05FA 0500

设置完中断优先级分组后,需要去设置抢占优先级、响应优先级、外部中断通道和使能,如下:

    NVIC_InitTypeDef NVIC_InitStructure;     NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            NVIC_Init(&NVIC_InitStructure); 

NVIC_InitStructure结构体类型如下,第一个成员用来设置中断向量表通道,这里设置的是外部中断0,第四个成员是用来使能的。

typedef struct
{uint8_t NVIC_IRQChannel;                  uint8_t NVIC_IRQChannelPreemptionPriority;  uint8_t NVIC_IRQChannelSubPriority;         FunctionalState NVIC_IRQChannelCmd;
} NVIC_InitTypeDef;

第二三个成员用来设置抢占优先级和响应优先级,对应关系如下。

NVIC_Init(&NVIC_InitStructure); 函数内容如下:

void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)
{uint32_t tmppriority = 0x00, tmppre = 0x00, tmpsub = 0x0F;if (NVIC_InitStruct->NVIC_IRQChannelCmd != DISABLE){ tmppriority = (0x700 - ((SCB->AIRCR) & (uint32_t)0x700))>> 0x08;tmppre = (0x4 - tmppriority);tmpsub = tmpsub >> tmppriority;

函数目的是将设置好的通道、优先级、使能等信息放到相应的地方

首先判断是否使能,使能了就用0x700给SCB->AIRCR的其他位清零,只保留AIRCR[10:8]位,然后用0111-0101=0010后右移8位,变成0010,然后赋值给 tmppriority(它的值在0~4之间变化,因为AIRCR[10:8]这三位取值范围是3~7),假设取第1组AIRCR[10:8]=110=6,tmppriority=1。如下表:

优先级分组

AIRCR[10:8]

IP[7:4]

抢占:响应

 tmppriority tmppre tmpsub
0 111=7 0:4 0 4 0000 1111
1 110=6 1:3 1 3 0000 0111
2 101=5 2:2 2 2 0000 0011
3 100=4 3:1 3 1 0000 0001
4 011=3 4:0 4 0 0000 0000

接下来将抢占优先级和响应优先级的信息赋值给tmppriority,即:

先把抢占优先级NVIC_IRQChannelPreemptionPriority的取值(假设为1)左移tmppre(3位)位,然后赋值给tmppriority=1000,再把响应优先级NVIC_IRQChannelSubPriority的取值(假设为010)与tmpsub相与(目的是对其余的无效位清零保留有效位)后放进tmppriority=1010,这时候tmppriority就携带了抢占优先级和响应优先级的信息。

    tmppriority = (uint32_t)NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority << tmppre;tmppriority |=  NVIC_InitStruct->NVIC_IRQChannelSubPriority & tmpsub;tmppriority = tmppriority << 0x04;        NVIC->IP[NVIC_InitStruct->NVIC_IRQChannel] = tmppriority;NVIC->ISER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] =(uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F);}else{NVIC->ICER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] =(uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F);}
}

将tmppriority左移4位给相应的IP[]:1010 0000,因为IP[]是高4位有效的,同时将使能信息给ISER。

就不详细解释了。下面是60个中断向量。

  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        */

NVIC_Init(NVIC_InitStructure)学习相关推荐

  1. STM32串口学习总结(经典)

    主函数代码如下: #include "led.h" #include "delay.h" #include "sys.h" #include ...

  2. stm32串口学习(二)

    今天继续学习stm32的串口编程(利用库函数).上次我们说了串口的发送,这次我们说接收. 接收可以用查询的方法,也可以用中断.显然,工程中多用中断的方式,那么就来看看中断接收. 代码其实很简单,基本的 ...

  3. stm32学习笔记----双串口同时打开时的printf()问题

    stm32学习笔记----双串口同时打开时的printf()问题 最近因为要使用串口2外接PN532芯片实现通信,另一方面,要使用串口1来将一些提示信息输出到上位机,于是重定义了printf(),使其 ...

  4. FreeRTOS学习笔记——互斥型信号量

    来自:http://blog.csdn.net/xukai871105/article/details/43456985 0.前言 在嵌入式操作系统中互斥型信号量是任务间资源保护的重要手段.下面结合一 ...

  5. buck电路 dac stm32_STM32定时器学习---基本定时器

    STM32F1系列的产品,除了互联网产品外,工作8个,3种定时器,其中一种就是基本定时器.那么STM32单片机的基本定时器如何操作以及编程呢? 下面我们就来详细的了解一下 STM32F1系列的产品,除 ...

  6. STM32学习笔记(十) CAN通讯测试(环回模式)

    1.CAN通讯的理解 想学习CAN通讯,那么要对通讯协议有一定的认知.通讯协议是指通信双方对数据传送控制的一种约定.约定中包括对数据格式,同步方式,传输速度,传送步骤,检纠错方式以及控制字符定义等问题 ...

  7. 学习 stm32(TTL)串口通信控制16路舵机控制板(维特智能)

    学习STM32Core平台串口2连接维特智能串口Normal协议,然后通过串口1直接连接舵机控制板(TTL),接收进行通信:需要看产品文档的可以直接官网搜索文档. 16路舵机控制板官方产品网址 在查看 ...

  8. 学习 STM32之九轴姿态传感器(BWT901CL)串口通信读取数据

    由于个人应用到3轴传感器,所以买了直接买了一个9轴的,用于学习STM32Core平台串口2连接维特智能串口Normal协议,然后通过串口1直接打印数据,接收传感器数据和与传感器进行通信:需要看产品文档 ...

  9. STM32学习心得二十一:实时时钟RTC和备份寄存器BKP特征、原理及相关实验代码解读

    记录一下,方便以后翻阅~ 主要内容 1) RTC特征与原理: 2) BKP备份寄存器特征与原理: 3) RTC常用寄存器+库函数介绍: 4) 相关实验代码解读. 实验内容: 因为没有买LCD屏,所以计 ...

最新文章

  1. HOG特征向量的代码
  2. java web开发小记(6)将int类型的list插入到mysql数据库
  3. Keymob浅析2016网络营销十大趋势
  4. js判断最后一个字符是不是指定字符_结合简单的 JS 就可以让 CSS 也能做搜索
  5. 2017年读书计划(一)
  6. 【转】状态机思路在程序设计中的应用
  7. 目标检测第5步:如何在Windows 10系统下,搭建YOLOv5(5.0)环境?保姆级,没有人比这个更详细了(更新时间2022.3.22)
  8. jq根据文本显示内容设置样式
  9. ubuntu服务器+apache2绑定域名(以腾讯云域名为例)
  10. 你可能不知道的shell、bash二三事(Centos 7)
  11. 技术人 | 如何做一个明白状况的研发主管?
  12. pytorch中的tensor以numpy形式进行输出保存
  13. 周立功arm linux教程,极速搭建周立功IMX287A ARM Linux开发环境
  14. 信息系统项目管理之进度管理过程
  15. Android 接入阿里云推送com.aliyun.ams:alicloud-android-push:3.7.4步骤(二)
  16. 【C】C语言判断是否质数
  17. 康师傅矿物质水黑幕:水源竟是自来水
  18. 电子密码锁的设计(Verilog HDL实现)
  19. 宋九九:怎么做好网站搜索引擎优化,企业网站如何seo优化?
  20. HTML中淡入的动画效果,利用CSS3制作淡入淡出动画效果

热门文章

  1. 【ABAP】MFBF过账到质量检验库存类型Demo
  2. Ajax 加载显示图标集合
  3. C语言实现15折线U律,诚成设计,基带信号处理中DSP技术的应用-论文.doc
  4. Python小程序之猜单词游戏
  5. C语言DFS(7)___单词拼接(NYoj 99)
  6. Web2.1技术演示
  7. SQLsever附加数据库出错5123添加权限后还是出现错误解决办法
  8. 苹果6s解除耳机模式_三星,苹果最好的损友!从3GS损到iPhone 12从不留情
  9. 【Python数据分析与处理 实训03】 --- 酒类消费信息分析(数据分组聚合 group().agg()应用)
  10. 悠悠农夫外挂log分析