先解释中断优先级,后面讲代码的实现。

  差异:M0的中断优先级相比于M4,没有用到分组,且只用到了2个bit位(即0~3)来设置,数值越小,优先级越高;同等优先级,根据终端号的大小来决定谁先执行。

  根据下面这张编程手册里的图来说明:

  从上往下看,共32个IRQ中断,每个中断优先级占8个位,一个寄存器存4个中断的优先级,所以M0的IRQ中断最多只有32个;表27中高亮部分,说的是只用高两位来表示优先级的值,低六位填0,没有用到。

  还有一个要提到的是word-accessible,就是寄存器只能按字操作。

  M0的中断优先级就讲完了,还是很简单的,那我们讲一下代码的实现:

 

 void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)
{
uint32_t tmppriority = 0x00; /* Check the parameters */
assert_param(IS_FUNCTIONAL_STATE(NVIC_InitStruct->NVIC_IRQChannelCmd));
assert_param(IS_NVIC_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelPriority)); if (NVIC_InitStruct->NVIC_IRQChannelCmd != DISABLE)
{
/* Compute the Corresponding IRQ Priority --------------------------------*/
tmppriority = NVIC->IP[NVIC_InitStruct->NVIC_IRQChannel >> 0x02];
tmppriority &= (uint32_t)(~(((uint32_t)0xFF) << ((NVIC_InitStruct->NVIC_IRQChannel & 0x03) * )));
tmppriority |= (uint32_t)((((uint32_t)NVIC_InitStruct->NVIC_IRQChannelPriority << ) & 0xFF) << ((NVIC_InitStruct->NVIC_IRQChannel & 0x03) * )); NVIC->IP[NVIC_InitStruct->NVIC_IRQChannel >> 0x02] = tmppriority; /* Enable the Selected IRQ Channels --------------------------------------*/
NVIC->ISER[] = (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F);
}
else
{
/* Disable the Selected IRQ Channels -------------------------------------*/
NVIC->ICER[] = (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F);
}
}

  这段代码是官方库的代码,我说下思路:

    1、要设置优先级,要先找到该中断的优先级寄存器在哪个寄存器里,将中断号除以4,得到对应寄存器,读该寄存器的值给变量tmppriority ,代码如下:

      tmppriority = NVIC->IP[NVIC_InitStruct->NVIC_IRQChannel >> 0x02];

    2、再判断该终端号的优先级值在对应寄存器的哪个位置,并清零该8位,共四个位置为:0~7、8~15、16~23、24~31,代码如下,NVIC_InitStruct->NVIC_IRQChannel & 0x03表示对4求余的结果;

      tmppriority &= (uint32_t)(~(((uint32_t)0xFF) << ((NVIC_InitStruct->NVIC_IRQChannel & 0x03) * 8)));

    3、接着给该8位写入要设置的优先级的值,由于优先级只占了8位的高两位,所以NVIC_InitStruct->NVIC_IRQChannelPriority << 6写高两位,再左移到在该寄存器中对应的位置,和读到寄存器的值tmppriority 与运算,就完成了对该寄存器的对应位写优先级值得操作,记住,这是一个32位的数;

      tmppriority |= (uint32_t)((((uint32_t)NVIC_InitStruct->NVIC_IRQChannelPriority << 6) & 0xFF) << ((NVIC_InitStruct->NVIC_IRQChannel & 0x03) * 8));

    4、把这个32位的数写入该寄存器中;  

      NVIC->IP[NVIC_InitStruct->NVIC_IRQChannel >> 0x02] = tmppriority;

    废话:((NVIC_InitStruct->NVIC_IRQChannel & 0x03) * 8))这个语句是用来获得在寄存器中的偏移值得,用这个偏移值就能把8位数进行左移。

完!

STM32-M0中断优先级介绍的更多相关文章

  1. 【转载】STM32 ST-LINK Utility介绍、下载、安装、使用方法

    转载地址:https://blog.csdn.net/ybhuangfugui/article/details/52597133 总结的很好!!! Ⅰ.写在前面本文讲述的内容是STM32 ST-LIN ...

  2. (二)STM32中中断优先级理解

    很多人在配置STM32中断时对固件库中的这个函数NVIC_PriorityGroupConfig()——配置优先级分组方式,会很不理解,尤其是看中文翻译版的,因为中文翻译版里把这里翻译成“先占优先级和 ...

  3. STM32各个文件介绍、uCOSII文件介绍

    (1)core_cm3.c , core_cm.h:获取设置CM3内核,配置一些内核寄存器,用到CM3核的都需要: (2)stm32f10x.h 和 system_stm32f10x.c , syst ...

  4. STM32入门系列-介绍STM32型号与功用

    作为STM32初学者,一般会选择购置一块开发板,因为在开发板上有很多已经集成好的模块,如红外模块.按键模块.LED模块.DAC模块.ADC模块.can模块.485模块.以太网模块.WiFi模块.蜂鸣器 ...

  5. STM32内存结构介绍和FreeRTOS内存分配技巧

    这是我第一次使用FreeRTOS构建STM32的项目,踩了好些坑,又发现了我缺乏对于操作系统的内存及其空间的分配的知识,故写下文档记录学习成果. 文章最后要解决的问题是,如何恰当地分配FreeRTOS ...

  6. STM32 M0之SPI

    从M3到M0,可能SPI的接口函数大致类似,但是细节略有不同 仔细观察寄存器描述,虽然个别存在差异,但是真心不知道竟然有太多的“玄机” 这次的问题主要出在了数据宽度上: 1. M3/M4的数据宽度支持 ...

  7. STM32 NVIC中断优先级分组说明

    STM32F103系列上面,又只有60个可屏蔽中断(在107系列才有68个) 中断管理方法 首先,对STM32中断进行分组,组0~4.同时,对每个中断设置一个抢占优先级和一个响应优先级值. 分组配置是 ...

  8. 【STM32】WS2812介绍、使用SPI+DMA发送数据

    这篇要使用到SPI+DMA,需要了解的话,可以参考我另两篇博客 时钟:https://www.cnblogs.com/PureHeart/p/11330967.html SPI+DMA通信:https ...

  9. 【STM32学习笔记1】基于固件库的STM32_MDK工程模版

    文章包含STM32固件库介绍和工程模板搭建两方面内容. 一.STM32固件库介绍 要建立工程模板,首先要对STM32的固件库有所了解.STM32的固件可以从ST官网下载,网址为:http://www. ...

随机推荐

  1. [Swift] Swift笔记

    开始整理Swift笔记了.打算直接用Playground去写,里面自带的Markup语法和Markdown差不多,显示的效果也不差于博客.而且用Xcode看代码也方便.所以这部分内容不再在博客里记录了 ...

  2. LeetCode题解之Merge k Sorted Lists 解法二

    1.题目描述 2.分析 利用 vector 存储指针,同时合并k个链表. 3.代码 ListNode* mergeKLists(vector<ListNode*>& lists) ...

  3. Oracle 密码失灵

    java.sql.SQLException: ORA-28001: 密碼已經屆滿 at oracle.jdbc.driver.DatabaseError.throwSqlException(Datab ...

  4. crm lookup

    1. 大家都知道CRM 里面的Lookup 保存了相关实体的GUID,让我们深入的了解一下CRM Lookup.当我们在2个实体间建立关系的时候,CRM自动生成了一些attributes来保存相关实体 ...

  5. Remove Rar Password OnLine

    How to Remove Rar passwords without any software : One of the most frustrating thing in our digital ...

  6. 点击一个div ,把div里的某个参数的值,传到一个input里面

    ​​​

  7. 邮件客户端修改密码—OWA

    邮件客户端修改密码—OWA 1.登录OWA 2.输入用户名 3.点击选项 4.更改密码

  8. Audit log report

  9. NOIP2018考前抱佛脚——搜索复习

    目录 搜索 DFS 例1 P1101 单词方阵 题目描述 输入输出格式 输入输出样例 标程 例2 P1605 迷宫 题目背景 输入输出格式 输入输出样例 标程 例3 P1019 单词接龙 题目描述 输 ...

  10. 【Android自动化】编写一个log模块,输出至控制台,供程序运行查看

    # -*- coding:utf-8 -*- import logging def get_log(name): log = logging.getLogger(name) log.setLevel( ...