首页 > 其他分享 >GD32如何配置中断优先级分组以及中断优先级

GD32如何配置中断优先级分组以及中断优先级

时间:2024-06-07 13:57:49浏览次数:19  
标签:pre nvic 优先级 temp 中断 NVIC priority GD32

使用GD32 MCU的过程中,大家可能会有以下疑问:中断优先级如何配置和使用?

本文将会为大家解析中断优先级分组以及中断优先级的配置使用:

  • 中断优先级分组配置

一个GD32 MCU系统需要大家明确系统中使用的中断优先级分组,避免中断优先级配置越界导致一些不符合预期的中断现象。

中断优先级分组可采用以下函数接口,其中有4个bit可用于中断优先级分组,如果全用于抢占优先级,则可以配置0-15的优先级,如果2位用于抢占,2位用于次优先级,则抢占优先级可以配置0-3,此优先级可以配置0-3。

C
/*!
    \brief      set the priority group
    \param[in]  nvic_prigroup: the NVIC priority group
      \arg        NVIC_PRIGROUP_PRE0_SUB4:0 bits for pre-emption priority 4 bits for subpriority
      \arg        NVIC_PRIGROUP_PRE1_SUB3:1 bits for pre-emption priority 3 bits for subpriority
      \arg        NVIC_PRIGROUP_PRE2_SUB2:2 bits for pre-emption priority 2 bits for subpriority
      \arg        NVIC_PRIGROUP_PRE3_SUB1:3 bits for pre-emption priority 1 bits for subpriority
      \arg        NVIC_PRIGROUP_PRE4_SUB0:4 bits for pre-emption priority 0 bits for subpriority
    \param[out] none
    \retval     none
*/
void nvic_priority_group_set(uint32_t nvic_prigroup)
{
    /* set the priority group value */
    SCB->AIRCR = NVIC_AIRCR_VECTKEY_MASK | nvic_prigroup;
}

注意:如果中断优先级配置为2位抢占和2位此优先级的话,抢占优先级配置为4(二进制为100b),优先级配置越界,实际配置进去的优先级为0,最高优先级,因而明确中断优先级分组非常重要。

  • 中断优先级配置

中断优先级配置采用以下函数。

C
/*!
    \brief      enable NVIC request
    \param[in]  nvic_irq: the NVIC interrupt request, detailed in IRQn_Type
    \param[in]  nvic_irq_pre_priority: the pre-emption priority needed to set
    \param[in]  nvic_irq_sub_priority: the subpriority needed to set
    \param[out] none
    \retval     none
*/
void nvic_irq_enable(uint8_t nvic_irq, uint8_t nvic_irq_pre_priority, 
                     uint8_t nvic_irq_sub_priority)
{
    uint32_t temp_priority = 0x00U, temp_pre = 0x00U, temp_sub = 0x00U;
    /* use the priority group value to get the temp_pre and the temp_sub */
    if(((SCB->AIRCR) & (uint32_t)0x700U)==NVIC_PRIGROUP_PRE0_SUB4){
        temp_pre=0U;
        temp_sub=0x4U;
    }else if(((SCB->AIRCR) & (uint32_t)0x700U)==NVIC_PRIGROUP_PRE1_SUB3){
        temp_pre=1U;
        temp_sub=0x3U;
    }else if(((SCB->AIRCR) & (uint32_t)0x700U)==NVIC_PRIGROUP_PRE2_SUB2){
        temp_pre=2U;
        temp_sub=0x2U;
    }else if(((SCB->AIRCR) & (uint32_t)0x700U)==NVIC_PRIGROUP_PRE3_SUB1){
        temp_pre=3U;
        temp_sub=0x1U;
    }else if(((SCB->AIRCR) & (uint32_t)0x700U)==NVIC_PRIGROUP_PRE4_SUB0){
        temp_pre=4U;
        temp_sub=0x0U;
    }else{
        nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);
        temp_pre=2U;
        temp_sub=0x2U;
    }
    /* get the temp_priority to fill the NVIC->IP register */
    temp_priority = (uint32_t)nvic_irq_pre_priority << (0x4U - temp_pre);
    temp_priority |= nvic_irq_sub_priority &(0x0FU >> (0x4U - temp_sub));
    temp_priority = temp_priority << 0x04U;
    NVIC->IP[nvic_irq] = (uint8_t)temp_priority;
    /* enable the selected IRQ */
    NVIC->ISER[nvic_irq >> 0x05U] = (uint32_t)0x01U << (nvic_irq & (uint8_t)0x1FU);
}

 nvic_irq为中断号,中断号可以通过gd32f30x.h获取,如下图所示,nvic_irq_pre_priority为抢占优先级配置,nvic_irq_sub_priority为此优先级配置,注意优先级配置要根据优先级分组进行配置,不要越界哦。

GD32MCU技术交流群:859440462

更多GD32 MCU相关咨询:单片机开发板_国产mcu视频_GD32 - 苏州聚沃电子科技有限公司

 

标签:pre,nvic,优先级,temp,中断,NVIC,priority,GD32
From: https://blog.csdn.net/weixin_45254847/article/details/139525000

相关文章

  • GD32错误调试篇:error: #5: cannot open source input file “RTE_Components.h“: No
    本文章基于兆易创新GD32MCU所提供的2.2.4版本库函数开发    向上代码兼容GD32F450ZGT6中使用    后续项目主要在下面该专栏中发布:https://blog.csdn.net/qq_62316532/category_12608431.html?spm=1001.2014.3001.5482    感兴趣的点个关注收藏一下......
  • GD32F4xx+RT-Thread,SPI驱动、文件系统挂载应该怎么写
    在GD32F470芯片上使用RT-Thread操作系统,配合NORFlash(GD25Q256)编写SPI驱动、文件系统驱动以及挂载关联,可以按照以下步骤进行:1.SPI驱动编写首先需要编写SPI驱动来控制GD32F470与NORFlash之间的通信。这包括初始化SPI接口,配置SPI时钟、极性、相位等参数,并实现SPI传输函数。S......
  • 在Linux中,如何进行网络资源的优先级管理?
    在Linux中进行网络资源的优先级管理主要涉及到流量控制(TrafficControl,简称TC)和服务质量(QualityofService,简称QoS)。以下是一些关键步骤和工具用于实现网络资源的优先级管理:1.使用tc(TrafficControl)工具tc是Linux中用于网络流量控制的主要工具,它可以设置带宽限制、流量整形、......
  • 在Linux中,如何进行系统资源的优先级管理?
    在Linux中进行系统资源的优先级管理主要涉及对进程优先级、CPU调度、内存分配等方面的控制。以下是一些关键步骤和工具用于实现系统资源的优先级管理:1.进程优先级(nice值)Linux允许用户调整进程的nice值,以影响进程的CPU调度优先级。查看进程nice值:nice-n10/path/to/comman......
  • 在Linux中,如何进行系统服务的优先级管理?
    在Linux系统中,系统服务的优先级管理通常涉及调整服务的启动顺序、管理CPU和内存资源分配,以及控制服务的运行优先级。以下是一些关键步骤和方法:1.使用systemd管理服务优先级systemd是大多数现代Linux发行版使用的初始化系统和服务管理器,它提供了一种配置服务依赖和优先级的方法......
  • 按键中断驱动程序-poll机制
    前言:学东西的时候总是喜欢碎碎念,去思考该怎么学。关于嵌入式开发,以前就觉得嵌入式只是一个工具,关键还是结合专业知识赋能,比如控制、信号处理、神经网络、计算机网络、各种协议比如蓝牙、wifi,音视频,当然,如果能够把内核学的很透彻,那也是很了不起的。现在越学越觉得这个东西应该就是......
  • IAR+GD32E507芯片工程环境常见问题
    本工程是原有产品已创建成功的工程,仅需导入、配置相关环境采用芯片:GD32E507ZE常见工程导入步骤1、安装IAR2、导入工程3、编译及报错解决1).h头文件目录未包含报错现象:提示部分头文件找不到解决:如下图所示,注意最好添加相对路径,便于使用。2)未选择CPU报错现象:解决:添加......
  • QNX-19—QNX绑核优先级-1-理论
    一、Threadaffinity翻译翻译:QNXSoftwareDevelopmentPlatform-->Programming-->Programmer'sGuide-->MulticoreProcessing-->Theimpactofmulticorehttps://www.qnx.com/developers/docs/7.1/index.html#com.qnx.doc.neutrino.prog/topic/multico......
  • C语言 恼人的结合性和优先级和副作用
    结合性和优先级和副作用1.优先级2.结合性3.副作用4.简单区分i++,++i,i+=1;i=i+1;i=i++1.优先级优先级指的是,如果⼀个表达式包含多个运算符,哪个运算符应该优先执⾏。各种运算符的优先级是不⼀样的。在C语言中,优先性和结合性规则是非常重要的。然而C语言有几乎50中运算符......
  • 定时器Timer中断
    一、CPU定时器Timer二、CPU定时器寄存器CpuTimer0Regs1.定时器计数器TIM2.定时器周期寄存器PRD3.定时器预定标寄存器-高TPRH(1)预定标计数器-高PSCH     与PSC相同(2)定时器分频器-高TDDRH     与TDDR相同4.定时器预定标寄存器-低TPR(1)预定标计数......