<!-- 本文件由脚本自动转换生成，请勿手动编辑 -->

> **《LKS32MC09x User Manual》内核** . 完整目录见 [README.md](README.md)
>
> **声明**：本文档由芯片用户手册自动转换生成，仅供检索与查阅参考。Markdown 格式可被自由编译、修改，本文档不构成正式技术文件，相关内容以凌鸥创芯官方网站正式发布的手册为准。
>
> 南京凌鸥创芯电子有限公司 . (C) 2023, 版权归凌鸥创芯所有 . 机密文件，未经许可不得扩散

# 内核

## ARM(R)CortexTM-M0 核心

Cortex-M0是Cortex-M家族中的M0系列。最大特点是低功耗的设计。Cortex-M0为32位、3级流水线RISC处理器，其核心仍为冯.诺依曼结构，是指令和数据共享同一总线的架构。作为新一代的处理器，Cortex-M0的设计进行了许多的改革与创新，如系统存储器地址映像(System
Address
Map)、改善效率并增强确定性的嵌套向量中断系统(NVIC)与不可屏蔽中断(NMI)、全新的调试单元等等，都带给了使用者全新的体验和更便利、更有效率的操作。

Cortex-M0其核心架构为ARMv6M，其运算能力可以达到0.9
DMIPS/MHz，而与其他的16位与8位处理器相比，由于CortexM0的运算性能大幅提高，所以在同样任务的执行上Cortex-M0只需较低的运行速度，而大幅降低了整体的动态功耗。

有关内核的更多信息请参考ARM官方技术手册“Cortex-M0 Technical Reference
Manual”（汉译版本为“Cortex-M0技术参考手册”）。

本小节重点描述NVIC控制器、SysTick定时器、LKS32MC09x中断向量表定义及中断向量表重定义三个功能。

## NVIC控制器

为了管理中断请求的优先级并处理其他异常，Cortex-M0处理器内置了嵌套中断控制器（NVIC）。NVIC的一些可编程控制器控制着中断管理功能，这些寄存器被映射到系统地址空间里，它们所处的区域被称为系统控制空间（SCS）。SCS的地址空间为:0xE000_E000
- 0xE000_EFFF。

NVIC有以下特性:

- 灵活的中断管理；

Cortex-M0处理器中，每一个外部中断都可以被使能或者禁止，并且可以被设置为挂起状态或者清除状态。处理器的中断可以是电平信号的（在中断服务程序清除中断请求以前，外设的请求会一直保持），也可以是脉冲信号的（最小一个始终周期），这样中断控制器就可以处理任何中断源。

- 支持嵌套中断；

Cortex-M0处理器的任何中断都有一个固定或者可编程的中断优先级。当外部中断之类的异常发生时，NVIC将该异常的优先级与当前的优先级进行比较，如果新的优先级更高，当前的任务会被暂停，处理器进行核心寄存器入栈保持，然后开始处理新的异常程序，这个过程也被称为“抢占”。高优先级的中断完成后，异常返回就会执行，处理器自动进行出栈操作恢复刚才寄存器的值，并继续运行刚才的任务。这种机制并没有带来软件开销。

- 向量化的异常入口；

异常发生时，处理器需要定位异常对用的程序入口。传统的处理方式需要软件去完成。而M0处理器会从存储器的向量表中，自动定位异常的程序入口。从异常到异常的处理事件会被缩减。

- 中断屏蔽；

NVIC通过一组特殊寄存器提供了一种中断屏蔽机制，NVIC除了硬件错误（HardFault）和NMI之外，可以屏蔽所有的异常。有些操作，比如对时间敏感的控制任务或实时多媒体解码任务，不应该被打断，此时中断屏蔽的作用就表现了出来。具体参见ARM手册。

LKS32MC09x支持ARM公司推出的CMSIS（Cortex Microcontroller Software
Interface
Standard，即Cortex微控制器软件接口标准）函数。用户在工程中包含cm0_core.h和cm0_core.c代码，即可实现对NVIC模块的操作。

## 异常和中断

异常，会引起程序控制的变化。在异常发生时，处理器停止当前的任务，转而执行异常处理程序，异常处理完成后，会继续执行刚才的任务。异常分为很多种，中断是其中之一。Cortex-M0处理器最多支持32个外部中断（IRQ）和一个不可屏蔽中断（NMI），中断事件的处理叫做中断服务程序（ISR），中断一般由芯片上的硬件资源产生。

每一个异常都对应一个异常编号，异常编号还指明了异常向量的地址。异常编号和中断编号是相互独立的。系统异常使用负数定义，中断使用0-31正数定义。复位是一种特殊的异常，数值为-15。除了NMI，HardFault和复位，其他所有异常的优先级都是可编程的，NMI和HardFault的优先级是固定的，并且比其他异常的优先级高。

LKS32MC09x系列芯片共使用了其中的21个外部中断，后11个保留未使用。最多支持4个中断优先级可供编程选择。

表4-1中断号分布

|||||||
|---|---|---|---|---|---|
|异常/中断号|说明|地址|异常/中断号|说明|地址|
|-14|NMI|0x00000008||||
|-13|HardFault|0x0000000C||||
|-12|保留|0x00000010||||
|-11||0x00000014||||
|-10||0x00000018||||
|-9||0x0000001C||||
|-8||0x00000020||||
|-7||0x00000024||||
|-6||0x00000028||||
|-5|SVCall|0x0000002C||||
|-4|保留|0x00000030||||
|-3||0x00000034||||
|-2|PendSV|0x00000038||||
|-1|SysTick|0x0000003C||||
|0|TIMER0|0x00000040|16|MCPWM0|0x00000080|
|1|TIMER1|0x00000044|17|MCPWM1|0x00000084|
|2|TIMER2|0x00000048|18|DMA0|0x00000088|
|3|保留|0x0000004C|19|保留|0x0000008C|
|4|QEP0|0x00000050|20|SIF0|0x00000090|
|5|保留|0x00000054|21|WAKEUP，唤醒中断|0x00000094|
|6|I2C0|0x00000058|22|软件中断|0x00000098|
|7|SPI0|0x0000005C|23|电源电压过低|0x0000009C|
|8|GPIO|0x00000060|24|CL0|0x000000A0|
|9|HALL0|0x00000064|25|Reserved|0x000000A4|
|10|UART0|0x00000068|26|CMP0|0x000000A8|
|11|UART1|0x0000006C|27|CMP1|0x000000AC|
|12|UART2|0x00000070|28|Reserved|0x000000B0|
|13|Reserved|0x00000074|29|Reserved|0x000000B4|
|14|ADC0|0x00000078|30|Reserved|0x000000B8|
|15|ADC1|0x0000007C|31|Reserved|0x000000BC|

异常发生时，处理器需要定位异常对应的程序入口。标准的Cortex-M0处理器不支持中断向量表的重定义，即每个异常的入口地址是固定的。在线升级应用，将擦除FLASH部分内容，用户可能擦除/破坏中断向量表。因此，此种应用，一般推荐关闭中断。LKS32MC09x芯片增加了该功能，实现了中断向量表的重定义功能。即在升级过程中，可开启中断，编程更灵活。具体使用，参见本文档FLASH章节--FLASH
在线升级(IAP)部分的描述。

## SysTick定时器

SysTick定时器是Cortex-M0处理器自带的系统滴答定时器。其存在的主要目的是为嵌入式操作系统提供100Hz(即10ms)的定时节拍。当然，也可以做普通定时等其他用途。

- 可编程设置频率的RTOS 定时器(例如100 Hz)，调用一个SysTick 服务程序。
- 简单计数器。软件可使用它测量时间 （如:完成任务所需时间、已使用时间）。

SysTick定时器使用起来非常简单。它一共有三个寄存器:SYST_CSR、SYST_RVR、SYST_CVR。寄存器的基地址为0xE000_E000。LKS32MC09x芯片，针对实际应用，三个寄存器的配置如下。

表4-2中断号分布

||||
|---|---|---|
|名称|偏移|描述|
|SYST_CSR|0x10|SysTick定时器控制和状态寄存器|
|SYST_RVR|0x14|SysTick定时器重载值寄存器|
|SYST_CVR|0x18|SysTick定时器当前值寄存器|

### SYST_CSR 控制和状态寄存器

地址:0xE000_E010

复位值:0x00000000

表4-3
SYST_CSR控制和状态寄存器

|||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|31|30|29|28|27|26|25|24|23|22|21|20|19|18||17||||16|
||||||||||||||||||FLAG|||
||||||||||||||||||R|||
||||||||||||||||||0|||
|15|14|13|12|11|10|9|8|7|6|5|4|3|2||1||||0|
|||||||||||||||CLKSRC||TICKINT||ENABLE||
|||||||||||||||RW||RW||RW||
|||||||||||||||0||0||0||

||||
|---|---|---|
|位置|位名称|说明|
|\[16\]|FLAG|SysTick定时器计数器回零标志位，读清除。0:没有回零1:发生回零|
|\[15:3\]|--|保持为0|
|\[2\]|CLKSRC|SysTick定时器时钟选择信号。默认为0。0:CPU时钟/81:CPU时钟|
|\[1\]|TICKINT|SysTick定时器中断使能信号。默认为0。0:关闭1:使能|
|\[0\]|ENABLE|SysTick定时器使能信号。默认为0。0:关闭1:使能|

### SYST_RVR 重载值寄存器

地址:0xE000_E014

复位值:0x00000000

表4-4
SYST_RVR重载值寄存器

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|31|30|29|28|27|26|25|24|23|22|21|20|19|18|17|16|
|||||||||RELOAD||||||||
|||||||||RW||||||||
|||||||||0||||||||
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|RELOAD||||||||||||||||
|RW||||||||||||||||
|0||||||||||||||||

||||
|---|---|---|
|位置|位名称|说明|
|\[31:24\]|--|保持为0|
|\[23:0\]|RELOAD|SysTick定时器周期寄存器，定时器在0--RELOAD之间计数。默认为0。|

### SYST_CVR 当前值寄存器

地址:0xE000_E018

复位值:0x00000000

表4-5
SYST_CVR 当前值寄存器

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|31|30|29|28|27|26|25|24|23|22|21|20|19|18|17|16|
|||||||||CURRENT||||||||
|||||||||RW||||||||
|||||||||0||||||||
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|RELOAD||||||||||||||||
|RW||||||||||||||||
|0||||||||||||||||

||||
|---|---|---|
|位置|位名称|说明|
|\[31:24\]|--|保持为0|
|\[23:0\]|CURRENT|读取该寄存器，返回SysTick定时器内部计数值，默认为0。对该寄存器写入任何值，将复位内部计数值，同时清除SYST_CSR.FLAG。|

