zoukankan      html  css  js  c++  java
  • 关于STM32 NVIC配置的解释

    大部分学习用的开发板在配置各个外设的中断优先级时,习惯在每个外设的初始化文件里都进行NVIC group配置,例如在ADC和Usart都有NVIC的配置如下:

    ADC中:

    void ADC_NVIC_Configuration(void)
    {
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
    NVIC_InitStructure.NVIC_IRQChannel =ADC1_2_IRQn;     //开启ADC_Channel8中断
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);   
    }

    Usart中:

    void NVIC_Configuration(void)
    {
      /*  结构声明*/
      NVIC_InitTypeDef NVIC_InitStructure;
      /* Configure the NVIC Preemption Priority Bits */  
      /* Configure one bit for preemption priority */
      /* 优先级组 说明了抢占优先级所用的位数,和响应优先级所用的位数   在这里是0, 4 
      0组:  抢占优先级占0位, 响应优先级占4位
      1组:  抢占优先级占1位, 响应优先级占3位
      2组:  抢占优先级占2位, 响应优先级占2位
      3组:  抢占优先级占3位, 响应优先级占1位
      4组:  抢占优先级占4位, 响应优先级占0位  
      */       
      NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);    


      NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;     //设置串口1中断
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;     //抢占优先级 0
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //子优先级为0
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能
      NVIC_Init(&NVIC_InitStructure);
    }

    但实际上这种配置是不合理的,即如果假设两个NVIC配置的中断组不同,如果其中一个外设引用了最后配置中断组允许的优先级之外的值,可能会出现冲突。和老师讨论过后,他认为如果之前初始化的优先级较后面优先级组设置的值不合理,前面的中断可能就不能响应,BUT。。。。。

    我实验时发现,无论如何更改这两个优先级配置顺序,貌似对我的程序结果没有影响。

    当然老师的建议是在工程中建立systemconfig的文件进行中断优先级组及时钟等的配置,即中断优先级组配置只出现一次,

  • 相关阅读:
    Java.io.outputstream.PrintStream:打印流
    Codeforces 732F. Tourist Reform (Tarjan缩点)
    退役了
    POJ 3281 Dining (最大流)
    Light oj 1233
    Light oj 1125
    HDU 5521 Meeting (最短路)
    Light oj 1095
    Light oj 1044
    HDU 3549 Flow Problem (dinic模版 && isap模版)
  • 原文地址:https://www.cnblogs.com/siahekai/p/5840325.html
Copyright © 2011-2022 走看看