【S32K 进阶之旅】Interrupt 模块介绍与应用

一、    S32K144 Interrupt介绍

1.  Arm Cortex-M4F 中断结构及中断过程

ARM Cortex-M4F 内核模块框图

 

S32K144 内核ARM Cortex-M4F 把中断分为内核中断与非内核模块中断,并对内核中断和非内核中断进行了统一编号(0~254),非内核中断的中断请求号(IRQ)为 0~238,对应于中断向量号的 15~254。中断结构原理图如下:



ARM Cortex-M4F 中断结构原理图

 

M4F 的中断由 M4F 内核、嵌套向量中断控制器(Nested Vectored Interrupt Controller,NVIC)及模块中断源组成。中断过程分为两步:第一,模块中断源向 NVIC 发出中断请求信号;第二步,NVIC 对发来的中断信号进行处理,判断该模块中断源是否被使能,若使能,则通过专用外设总线(Private Peripheral Bus,PPB)发送给 M4F 内核,由内核进行中断处理。如果同时有多个中断信号到来,NVIC 则根据设定好的中断优先级进行判断,优先级高的中断被响应,优先级低的中断被挂起,压入堆栈保存;如果优先级完全相同的多个中断源同时请求,则先响应 IRQ 号较小的,其他被挂起。

2.  NVIC 寄存器映射


NVIC 寄存器映射地址(Cortex-M4 User Guide)

 

  • 中断使能寄存器(NVIC_ISER)
  • 中断禁止寄存器(NVIC_ICER)
  • 中断挂起寄存器(NVIC_ISPR)
  • 清除挂起寄存器(NVIC_ICPR)
  • 中断活动位寄存器(NVIC_IABR)
  • 优先级寄存器(NVIC_IPR)

上表列出了 NVIC 的寄存器映射,由于 NVIC 属于内核外设,具体的寄存器用法可以参考手册《Cortex™-M4 Devices Generic User Guide》。


 

二、    S32DS Interrupt例程简介与应用

下面我们以 S32DS 开发环境中自带的例程 hello_Interrupts_s32k144为例。

1.  例程导入

  • 打开S32 Design Studio,点击:“File”->“New”->“S32DS Project from Example”。


  • 在弹出的窗口选取 S32K144 目录下的 hello_interrupts 例程,点击“Finish”。

  • 点击左上角“Build”按钮,编译例程。


  • 点击“Debug”按钮。进入例程Debug页面。

 

  • 点击运行程序 按钮,D11 LED blue 灯 1s闪烁。


D11 1s闪烁蓝灯


2.  例程简介

  • Hello Interrupt介绍

此例程通过配置时钟、GPIO、LPIT0和NVIC,将定时器实现的LED灯闪烁的程序放在中断程序中实现LED灯的蓝灯1s闪烁。 

 

  • Hello Interrupt框图

 

3.  例程设计思路

  • 初始化中断需要在 NVIC中 写入 3 句代码来实现:
  • 清除先前未完成的中断(假如有中断未完成)
  • -在清除挂起寄存器(ICPR)中的对应位写1
  • 启用所需中断
  • -在中断使能寄存器(ISER)中的对应位写1
  • 设置中断优先级
  • -在对应的中断优先级寄存器(IP)中写入一个在0~15之间的优先级

 

  • 程序设计思路:
  • 初始化端口 D module
  • 使能端口 D 时钟
  • 配置 PTD0 为输出模式(蓝灯)
  • 初始化系统时钟(SOSC)为8MHz
    • 初始化 SOSC 分频器
    • 配置范围,高增益,参考系数
    • 确保 SOSC 控制状态寄存器是可写的
    • 使能 SOSC 控制状态寄存器中的 SOSC
    • 等待 SOSC 生效
  • 初始化系统锁相环(SPLL)为160MHz
    • 确保 SPLL 禁止配置
    • 初始化 SPLL 分频器
    • 初始化 PLL 分频和倍频系数
  • Fpll = Fosc / PLL Ref Clk Divider x Sys PLL Multiplier / 2 = 8 MHz / 1 x 20 / 2= 160 MHz
    • 确保 SPLL 控制状态寄存器可写
    • 使能 SPLL 控制状态寄存器中的 SPLL
    • 等待 SPLL 生效
  • 初始化 LPIT 0 通道
    • 使能时钟源为 SPLL_DIV2_CLK
    • 使能 LPITO 寄存器时钟
    • 使能 LPIT0 模块
    • 初始化 0 通道:
    • 使能该通道中断
      • 超时时间=1s
      • 设置计数器模式并使能 0 通道
    • 改变 SPLL 工作模式为 Normal RUN Mode
      • 初始化 CORE、BUS、FLASH 的分频系数
      • 切换系统时钟为 SPLL(160MHz)
    • 禁止看门狗
    • 主函数:永远等待
    • LPIT_0 0 通道中断处理程序:
      • 清除通道溢出位
        • 装载计数器
        • 翻转 PTD0 GPIO 输出

 

三、    例程代码解释以及寄存器介绍

1.  void NVIC_init_IRQs (void)

 

  • S32_NVIC->ICPR[1] = 1 << (48 % 32); /* IRQ48-LPIT0 ch0: clr any pending IRQ*/

ICPR: Interrupt Clear-pending Registers 中断清除挂起寄存器


NVIC ICPR 寄存器映射地址

 

NVIC_ICPR0-NVIC_ICPR7 寄存器清除推迟状态的中断,并显示推迟中的中断。操作方法如下:


S32K144 向量表

 

查询 S32K144.h 可得 PORTD 的向量值为 64,对应 IRQ 为 48。查询 S32K144 NVIC 寄存器地址可以看到 256 个中断向量被分为 8 个寄存器,每个寄存器共 32 位。通过移位运算给 PORTD 对应的 ICPR 寄存器赋值 1,清除 PORTD 中断。

 

  • S32_NVIC->ISER[1] = 1 << (48 % 32); /* IRQ48-LPIT0 ch0: enable IRQ */

ISER:Interrupt Set-enable Registers 中断使能寄存器


NVIC ISER 寄存器映射地址

 

NVIC_ISER0-NVIC_ISER7 寄存器使能中断,并显示已经使能的中断。


通过移位运算给 PORTD 对应的的 ISER 寄存器赋值 1,使能 PORTD 中断。

 

  • S32_NVIC->IP[48] = 0x0A; /* IRQ48-LPIT0 ch0: priority 10 of 0-15*/

IP:Interrupt Priority Registers 中断优先级寄存器


NVIC IPR寄存器映射地址

 

NVIC_IPR0-NVIC_IPR59 寄存器为每一个中断提供8 bit的优先级域,每个寄存器(32bit)包含4个优先级域。这些寄存器都是可以设置的。


NVIC IPR 寄存器分配

 

NVIC IPR 寄存器与优先级域对照

 

通过位运算直接给 PORTD 对应的IPR寄存器赋值优先级,优先级为 8 bit 数值。

 

2.  void LPIT0_Ch0_IRQHandler (void) {}

中断函数,在需要中断的模块名后添加IRQHandler。

 

3.  主程序

等待中断状态。

 

四、    参考文献

[1] Cortex™-M4 Devices Generic User Guide.pdf,ARM

[2] S32K1xx Series Cookbook.pdf,NXP

[3] S32K144 Reference Manual.pdf,NXP

 

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论