• 关于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的文件进行中断优先级组及时钟等的配置,即中断优先级组配置只出现一次,

  • 相关阅读:
    搜索栏+collectionView实现
    iOS密码框实现(二)取消确定按钮
    MotionManager 陀螺仪实现方式
    ubuntu常用命令
    Ubuntu 启用root账户
    How to solve “sudo: /etc/sudoers.d is world writable”
    ubuntu進入dos界面的方法
    炫耀一下hadoop學習成果
    fpdf使用標楷體
    win8磁盘占用100%的12种解决办法
  • 原文地址:https://www.cnblogs.com/siahekai/p/5840325.html
Copyright © 2020-2023  润新知