查看: 10611|回复: 2

RT1052——9.中断优先级分组与设置

[复制链接]
  • TA的每日心情
    慵懒
    2025-5-7 08:45
  • 签到天数: 279 天

    连续签到: 1 天

    [LV.8]以坛为家I

    114

    主题

    1316

    帖子

    29

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    11199

    热心会员

    最后登录
    2025-9-9
    发表于 2018-11-4 11:48:40 | 显示全部楼层 |阅读模式
    其实RT1052的中断优先级的配置方式和其他M系列的单片机配置方式基本一样,需要注意的是,RT1052只支持16位优先级,[7:4]

    QQ截图20181104005145.png


    这次我们使用的主要是下面两个函数(看到NVIC_EnableIRQ没有,其实我们用的EnableIRQ就是调用了它(可见fsl_common.h第355—393行))


    QQ截图20181104102824.png

    先看一下NVIC_SetPriorityGrouping函数内部

    __STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup)
    {
      uint32_t reg_value;
      uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL);             /* only values 0..7 are used          */

      reg_value  =  SCB->AIRCR;                                                   /* read old register configuration    */
      reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change               */
      reg_value  =  (reg_value                                   |
                    ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) |
                    (PriorityGroupTmp << 8U)                      );              /* Insert write key and priorty group */
      SCB->AIRCR =  reg_value;
    }


    可以看到函数主要是对AIRCR的8—10位进行配置的

    QQ截图20181104110729.png

    这里是用来配置优先级分组的,让我们去看4—19页

    QQ截图20181104110740.png

    4—19是有关分组的说明,这里RT1052只有[7:4]有效,所以我们可以定义的有3 [16.1],4 [8.2],5 [4.4],6 [2.8],7 [1.16]这几种

    然后是NVIC_SetPriority函数(这次只分析普通中断)

    __STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
    {
      if ((int32_t)(IRQn) >= 0)
      {
        NVIC->IP[((uint32_t)(int32_t)IRQn)]                = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);
      }
      else
      {
        SCB->SHPR[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);
      }
    }


    QQ截图20181104113514.png

    可以看出,每个中断都有一个8位的字节去对应,一共256个中断优先级(实际需分为抢断位和响应位)
    要注意__NVIC_PRIO_BITS,这里
    #define __NVIC_PRIO_BITS               4         /**< Number of priority bits implemented in the NVIC */
    已被定义为4,也就是我们在定义优先级的时候一共有0—15这几个参数可以选择

    上程序
    1. #include "fsl_device_registers.h"
    2. #include "fsl_debug_console.h"
    3. #include "board.h"

    4. #include "pin_mux.h"
    5. #include "clock_config.h"

    6. #include "fsl_lpuart.h"
    7. #include "fsl_gpt.h"


    8. #include "delay.h"

    9. #define DISPLAY_CLK(name) (PRINTF("%s:%d\r\n",#name,CLOCK_GetFreq(name)))    //打印对应时钟


    10. int main(void)
    11. {
    12.     gpt_config_t gptConfig;

    13.     NVIC_SetPriorityGrouping(((uint32_t)0x3));  //设置中断优先级分注,4:0,全为抢断优先级
    14.     NVIC_SetPriority(GPT1_IRQn,0);              //设置中断优先级
    15.     NVIC_SetPriority(GPT2_IRQn,1);
    16.         
    17.     BOARD_ConfigMPU();
    18.     BOARD_InitPins();
    19.     BOARD_BootClockRUN();
    20.     BOARD_InitDebugConsole();

    21.     DISPLAY_CLK(kCLOCK_IpgClk);
    22.     DISPLAY_CLK(kCLOCK_OscClk);        
    23.         
    24.     gptConfig.clockSource = kGPT_ClockSource_Osc;     //选择时钟源为 OSC
    25.     gptConfig.divider = 1U;                           //设置时钟分频
    26.         
    27.     GPT_Init(GPT1, &gptConfig);                       //初始化
    28.     GPT_SetOutputCompareValue(GPT1, kGPT_OutputCompare_Channel1, CLOCK_GetFreq(kCLOCK_OscClk));  //设置输出比较通道的比较值
    29.     GPT_EnableInterrupts(GPT1, kGPT_OutputCompare1InterruptEnable);   //使能对应中断
    30.     EnableIRQ(GPT1_IRQn);       //使能中断
    31.         
    32.     GPT_Init(GPT2, &gptConfig);                       //初始化
    33.     GPT_SetOutputCompareValue(GPT2, kGPT_OutputCompare_Channel1, CLOCK_GetFreq(kCLOCK_OscClk));  //设置输出比较通道的比较值
    34.     GPT_EnableInterrupts(GPT2, kGPT_OutputCompare1InterruptEnable);   //使能对应中断
    35.     EnableIRQ(GPT2_IRQn);       //使能中断
    36.         
    37.     GPT_StartTimer(GPT1);       //开始计时
    38.     GPT_StartTimer(GPT2);       //开始计时
    39.                
    40.     while (1)
    41.     {
    42.     }
    43.         
    44. }

    45. void GPT1_IRQHandler(void)
    46. {
    47.     GPT_ClearStatusFlags(GPT1, kGPT_OutputCompare1Flag);   //清除中断标志位
    48.     LPUART_WriteBlocking(LPUART1, "1\r\n",3);//阻塞方式发送一串字符
    49.     __DSB();
    50. }

    51. void GPT2_IRQHandler(void)
    52. {
    53.     GPT_ClearStatusFlags(GPT2, kGPT_OutputCompare1Flag);   //清除中断标志位
    54.     LPUART_WriteBlocking(LPUART1, "2\r\n",3);//阻塞方式发送一串字符
    55.     GPT_StopTimer(GPT2);   //关闭计数
    56.     while(1){}
    57.     __DSB();
    58. }

    复制代码


    可以看到定义了两个GPT中断(有关GPT的使用方式可见飞凌RT1052——8.GPT定时器定时https://www.nxpic.org.cn/module/foru ... 258&fromuid=3469866(出处: 恩智浦技术社区)),GPT1是普通的(打印1)。GPT2一旦进入就会把程序卡在这里(打印2)(这种写法很危险,只是实验用)。
    然后配置分组模式为3也就是[16.1],全是抢断优先级。配置GPT1中断优先级为0(数越低优先级越高),GPT2优先级为1(此处都是抢断优先级)

    实验效果
    QQ截图20181104114443.png

    可以看到,还在一直输出1,说明GPT1的中断会打断GPT2的中断。接下来我们交换GPT1和GPT2的优先级

    NVIC_SetPriority(GPT1_IRQn,1);              //设置中断优先级
    NVIC_SetPriority(GPT2_IRQn,0);


    实验效果

    QQ截图20181104114637.png

    可见,GPT1的中断无法打断GPT2的中断了

    最后附上工程
      MDK版本:5.22
      pack:NXP.MIMXRT1052_DFP.10.0.1.pack
      下载算法:飞凌嵌入式提供的 MIMXRT_QSPIFLASH.FLM
      启动方式:spi flash启动  
      下载方式:STlink

    9.nvic.zip (1.46 MB, 下载次数: 23)
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    3

    帖子

    0

    新手上路

    Rank: 1

    积分
    40
    最后登录
    2022-6-27
    发表于 2020-8-20 13:50:01 | 显示全部楼层
    你好,请问图 2到 5是在哪个手册上找的?在用户手册跟数据手册上好像都没有,方便的话可以说一下吗,或者发一份给我
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-5-7 08:45
  • 签到天数: 279 天

    连续签到: 1 天

    [LV.8]以坛为家I

    114

    主题

    1316

    帖子

    29

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    11199

    热心会员

    最后登录
    2025-9-9
     楼主| 发表于 2020-8-20 16:58:32 | 显示全部楼层
    wolf1997 发表于 2020-8-20 13:50
    你好,请问图 2到 5是在哪个手册上找的?在用户手册跟数据手册上好像都没有,方便的话可以说一下吗,或者发 ...

    看我这个帖子
    https://www.nxpic.org.cn/module/forum/thread-615227-1-1.html
    下载第二个附件Cortex M7 Generic User Guide.pdf
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-9-10 04:36 , Processed in 0.081712 second(s), 21 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表