S08至Kinetis E系列迁移指南

Freescale Semiconductor
Application Note
Document Number:AN4757
Rev 0, 07/2013
从 S08 到 Kinetis E 系列移植指南
通过: William Jiang
内容
1 简介
Kinetis E (KE) 系列是采用稳健技术、新式 5 V I/O 焊盘和
ARM® Cortex® M0+ 内核的首款 Kinetis MCU。 此 KE 系
列还针对不同的外设模块引入了许多新功能。 这些新功
能使得 KE 系列有更低的功耗、更好的 EFT/ESD 保护和更
高的性能。
本应用说明概述了 S08(主要指 S08P)与 KE 产品系列之
间的主要差别,并提供了代码转换建议方法以帮助缩短学
习时间。
2 设备概述
Kinetis E 系列设备面向家用电器细分市场,具有以下特性。
• 基于运行频率高达 20 MHz(对于 KE02)/48 MHz(对
于其他 KE)的 ARM Cortex-M0+ 内核,提供位处理
引擎 (BME)
• 高达 128 KB 闪存
• 高达 16 KB SRAM
• ROM(仅限某些 KE 成员)
• 结合内部参考时钟 (IRC) 的时钟发生器
• 晶体振荡器和 FLL
• 多达 3 个具有 LIN 从机功能的 SCI
• 多达 2 个 SPI
• 2 个 I2C
• 1 个 CAN(仅限某些 KE 成员)
• 3 个 16 位 FlexTimer
© 2013 Freescale Semiconductor, Inc.
1
简介.........................................................................1
2
设备概述.................................................................1
3
编程模型................................................................3
4
嵌套向量中断控制器 (NVIC)...............................9
5
位操作引擎(BME)..........................................10
6
时钟模块..............................................................13
7
系统集成模块(SIM)........................................15
8
电源管理控制器...................................................15
9
闪存、EEPROM 和闪存控制器模块.................16
10
引脚分配变化.......................................................16
11
安全功能增强.......................................................16
12
端口控制和 GPIO................................................17
13
定时器模块...........................................................19
14
调试.......................................................................21
15
ADC 模块.............................................................22
16
参考.......................................................................23
17
术语表...................................................................23
18
修订历史记录.......................................................23
设备概述
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
1 个 PWT
1 个 32 位双通道 PIT
RTC
符合 IEC60730 规范的看门狗
CRC
多达 16 通道的 12 位 ADC,提供 8 级 FIFO
2 个 ACMP
16 通道 TSI 用于触控输入(仅限某些 KE 成员)
4 通道 DMA(仅限某些 DMA 成员)
多达 82 个 GPIO 引脚,8 个高驱动引脚支持 20 mA
支持 2.7–5.5 V 工作电压的嵌入式电压调节器,通电复位,可编程的低电压检测器
两种低功耗模式
长达 10 字节的独特芯片 ID
单线调试 (SWD) 接口
支持 –40 °C 到 +105 °C 的宽广温度范围
与 S08 设备(S08AC、S08P)相比,KE 系列采用 ARM Cortex-M0+ 内核、BME 和 32 位设备,大多数外围设备与
S08P 类似。 下表汇总了这些系列之间的主要特性比较:
表 1. S08AC、S08P 与 KE 产品系列的特性比较
S08AC
特性
S08P
KE 系列
内核平台
8 位 S08 内核,最大频率
40 MHz
总线时钟
核心频率的一半,最高 20 MHz 与核心频率相同,最高 20 MHz 可与核心频率相同,最高 48
MHz
单周期 32 位 x 32 位乘法
调试
嵌套向量中断控制器 (NVIC)
低功耗 8 位 S08 内核,最大频 高能效 32 位 Cortex-M0+ 内
率 20 MHz
核,最高支持 48 MHz,可在一
个周期内处理大多数指令
仅支持 8 位 x 8 位
仅支持 8 位 x 8 位
1 引脚调试模块 (BDM)
1 引脚调试模块 (BDM)
•
•
•
•
无 NVIC
无 IPC
不支持硬件嵌套中断
不支持中断向量重定位
• 无 NVIC
• 包含中断优先级控制器
(IPC),这需要软件代码支
持嵌套中断。
• 不支持中断向量重定位
有
2 引脚串行线调试 (SWD)
• 支持中断向量重定位,可
在闪存或 RAM 中重定
位。
• 真正的硬件中断嵌套,无
需任何软件代码
数据访问字节顺序
高字节序
高字节序
直接内存访问 (DMA)
无
无
已经为 KE06 成员添加
• RUN
• WAIT
• STOP3(典型电流值
1.3 µA)
• 类似于 S08P
功率模式
• RUN
• WAIT
• STOP2(部分断电,最低
功耗)
• STOP3
EEPROM
无
有
闪存控制器 (FMC)
无
无
FlexTimer
无,只提供传统的 TPM
• 提供扩展的 TPM 功能用
于支持电动机控制和电
源应用
• TPM 功能向下兼容
• 在停止模式下不起作用
系统节拍 (SysTick)
无
无
RTC
无
有
低字节序
大多数成员有
有
增强的 Flextimer,提供中间负
载、全局时基、周期 TOF、故
障极性控制、通道交换/反转控
制和调试模式选项
24 位定时器(内核时钟/16)
有
下一页继续介绍此表...
从 S08 到 Kinetis E 系列移植指南, Rev 0, 07/2013
2
Freescale Semiconductor, Inc.
编程模型
表 1. S08AC、S08P 与 KE 产品系列的特性比较 (继续)
特性
S08AC
S08P
ADC 模块
• 高达 10 位分辨率
• 寄存器访问仅限 8 位
• 支持高达 12 位分辨率
• 寄存器访问仅限 8 位
TSI 模块
无
标识寄存器 (ID)
2 字节
KE 系列
类似于 S08P,但寄存器访问
为 32 位
扫描结束中断(只限某些 S08P 仅限某些 KE 成员
成员)
• 扫描结束中断
• 超出范围中断
• 噪音检测
8 字节
8 字节通用唯一标识符 (UUID)
加 2 字节 Kinetis ID
ARM Cortex M0+ 是市场上尺寸最小、功耗最低的 ARM 处理器,与其他所有 Cortex-M 内核兼容。 以下是该处理器
相比 8 位微处理器的优势。
• 这是迄今设计出来的能效最高的 32 位处理器,相比 8/16 位处理器,在能效方面具有明显的优势。在降低功耗
的同时,仍能实现 2.15 CoreMark/MHz(ARM 编译器 5.0.3 版)的高性能,这是 8/16 位处理器的 2 到 40 倍,并
且比 Cortex-M0 高 9%。
• 此外,它的编码效率也高于 8 位和 16 位 CPU。
• 由于采用了支持 C 语言的体系结构,为动态异常处理程序提供可重定位向量表(可将向量表移入 RAM),包含
简单的指令集并整合了功能最丰富的开发生态系统,因此,与 8 位微处理器产品相比,能够使软件开发变得简
单而快速。
有关此处理器的详细信息,请访问: arm.com。
3 编程模型
3.1 寄存器集
本节阐述 S08 系列可用的寄存器,以及 Kinetis E 系列使用的 ARM Cortex-M0+ 处理器。
以下是 S08 系列的寄存器集合。
• 一个累加器 A,即通用型 8 位寄存器,用作算术与逻辑运算以及内存加载/存储指令的目标和源。
• 一个 16 位索引寄存器 H:X,用作索引引用指针,X 可用作 8 位通用型寄存器。
• 一个 16 位堆栈指针(SP),指向自动后进先出(LIFO) 堆栈上的下一个可用位置。
• 除了 16 位程序计数器(PC)外,还有一个 8 位条件代码寄存器 (CCR),其中包含中断掩码 (I),以及五个
标志用于指示最近执行的指令的结果。
以下是 KE 系列使用的 Cortex M0+ 内核寄存器的说明。
• 16 个 32 位寄存器 R0-R15
• R0-R12 基本上可用于所有指令
• R13 用作堆栈指针
• R14 用作链接寄存器(用于子例程和异常返回)
• R15 用作程序计数器
Cortex-M0+ 内核寄存器都不可直接寻址。 由于所有的 Cortex-M0+ 内核寄存器都是 32 位,因此能够有效支持 32 位
算术和逻辑运算。
除了 R0-R15 通用型寄存器外,Cortex M0+ 还有一些专用的寄存器,例如程序状态寄存器、异常屏蔽寄存器、中断屏
蔽寄存器和控制寄存器。
从 S08 到 Kinetis E 系列移植指南, Rev 0, 07/2013
Freescale Semiconductor, Inc.
3
编程模型
• 程序状态寄存器(xPSR):具有多个别名的单个 32 位寄存器,每个别名提供不同内容子集的视图。 PSR 结合
了以下寄存器。
• 应用程序状态寄存器(APSR):APSR 基于用户立场包含了 ALU 状态标志。
• 中断程序状态寄存器 (IPSR)
:此寄存器包含当前正在执行的中断数(如果当前没有任何活动的中断,则
为零),以供操作系统和异常处理使用。
• 执行程序状态寄存器 (EPSR):包含反映执行状态的位,不可直接访问。
有关 Cortex M0+ 寄存器及其功能的详细信息,请参见以下网站上提供的《Cortex-M0 设备常规用户指南》
: arm.com
3.2 寻址模式
寻址模式定义了 CPU 访问操作数和数据的方式。 S08 支持多个寻址模式。 下面列出了这些模式。
• 固有寻址模式(INH)
• 相对寻址模式 (REL)
• 直接寻址模式 (DIR)
• 索引寻址模式,具体如下:
• 无偏移 (IX)
• 无偏移带后增量 (IX+)
• 8 位偏移 (IX1)
• 8 位偏移带后增量 (IX1+)
• 16 位偏移 (IX2)
• SP 相对 8 位偏移 (SP1)
• SP 相对
• 16 位偏移 (SP2)
• 内存间寻址模式,具体如下:
• 直接-直接
• 立即-直接
• 索引-直接带后增量
• 直接-索引带后增量
Cortex-M0+ 寻址模式可以很方便地应用到内存访问,并具有以汇编语言表达的偏移寻址模式:[<Rn>,<offset>]。
3.3 指令集
S08 支持 8 位指令集。 指令的长度可变,经扩展后可以包括指令流中长度为 1-4 字节的操作数。
Cortex-M0+ 支持部分 Thumb-2 指令集。 尽管大多数指令都是 16 位,但也有少量的 Thumb 指令是 32 位,例如 BL、
DMB、DSB、ISB、MRS 和 MSR。 一个重要的差别在于,指令不能扩展为包括操作数数据。 有关指令的任何信息
必须在指令本身内部编码。 这种限制的后果之一是无法在指令中指定任意 32 位常数或地址,因此,必须采用其他方
法来实现此目的。 支持 Cortex-M0+ 的所有 C 编译器都毫无限制地允许程序员使用此功能。
3.4 工作模式
S08 可在以下模式下工作。
• 运行、等待和停止模式:等待和停止模式是低功耗模式,可分别通过执行 WAIT 和 STOP 指令进入。 有关这些
模式的详细信息,请参见电源管理控制器 。
• 后台调试模式:后台模式功能通过 S08 内核中的后台调试控制器 (BDC) 管理。 在软件开发过程中,可以结合
使用 BDC 和片上调试模块 (DBG) 进行 MCF 操作分析。 有关后台调试的详细信息,请参见调试 。
• 安全模式:处于安全模式时,将会限制从外部访问内部内存,以便只有从安全内存中提取的指令才能访问安全
内存。 当代码从内部内存运行时,可以访问所有资源而不存在任何限制。
从 S08 到 Kinetis E 系列移植指南, Rev 0, 07/2013
4
Freescale Semiconductor, Inc.
编程模型
Cortex-M0+ 支持两种模式。
• 线程模式(用于用户进程):此模式用于执行应用软件。
• 处理器模式:此模式用于处理异常情况,发生异常时,将自动进入此模式。
同时还定义了“权限”的概念。无权限的执行只能访问或者根本无法访问某些资源(例如,无权限代码无法屏蔽或
取消屏蔽中断)。 处理器模式执行始终是有权限的。 默认情况下,线程模式也是通过权限执行的,但程序员可将线
程模式配置为不使用权限执行。 可以使用这种配置来提供某种程度的系统保护,以防止不良或恶意程序的破坏。
3.5 堆栈
S08 堆栈朝低位 RAM 地址(即以降序)扩展。 堆栈可定位在使用 RAM 的 64 KB 地址空间内的任意位置,并可以采
用任何大小,但不能超过可用的 RAM 量。 通常将其放置在内部 SRAM 中以实现最佳性能。 可按字节访问堆栈。
堆栈指针(SP)指向堆栈上的下一个可用位置,复位时将初始化为 0x00FF;此地址位于直接页面寄存器段或 RAM 中。
但是,建议让应用代码重新初始化 SP,使其指向 RAM 的最后一个位置,如以下示例中所示:
LDHX #RamLast+1 ; Point at next addr past RAM
TXS ; SP <-(H:X)-1
在此情况下,至少需要耗时五个 CPU 周期才能重新初始化堆栈。
堆栈指针在存储或推送操作之后将会递减,在加载或弹出操作之前将会递增。
Cortex-M0+ 支持当前堆栈指针寻址到的满递减堆栈(类似于 S08 堆栈)。 但是,堆栈指针指示堆栈内存中的最后一
个堆栈条目。 堆栈大小仅受可用 RAM 空间的限制。 Cortex-M0+ 堆栈指针通常初始化为已分配堆栈区域顶部上方
的字(32 位)。 复位时初始化堆栈指针不需要任何 CPU 指令(即 CPU 周期)。 由于堆栈模块是满递减的,因此,堆
栈指针在第一次存储之前会递减,并将第一个字放置在已分配区域顶部的堆栈上。 Cortex-M0+ 上的所有堆栈访问都
以字大小进行。
3.6 异常和中断
S08P 具有一个不可屏蔽的中断源(SWI)和 39 个可屏蔽的中断源,其中包括一个外部可屏蔽中断 IRQ。 可以使用
对应于最高优先级的最小向量编号固定中断优先级。 在启用中断优先级控制器后,则可以支持四个优先级。 实施嵌
套中断方案时需要额外的软件开销。
Cortex-M0+ 具有集成的嵌套向量化中断控制器,最多支持 32 个独立的中断源。 共有四个中断优先级,支持真正的
硬件嵌套中断方案。 Cortex-M0+ 还支持外部不可屏蔽中断 (NMI) 以及多个内部中断,例如硬故障、SVC 等。
3.7 向量表
S08P 向量表定位在内部闪存上端的固定地址上。 不支持向量表重新定位。 每个向量包含相应中断处理程序/服务例
程的地址。 向量下端地址存储中断处理程序地址的高位字节,而向量上端地址存储中断处理程序地址的低位字节。
POR 和其他复位向量位于闪存 0xFFFE–0xFFFF 的高端。
KE 系列向量默认位于地址 0x00000000 上。 在初始化期间,可将其重定位到闪存或 RAM 区域中的某个位置。 将向
量表放置在内部 SRAM 中可以提高性能。 在向量表中,每个条目包含相应处理程序例程的起始地址。 位于向量表偏
移 0 位置的第一个向量包含初始/起始 SP(监管器 SP),位于向量表偏移 4 位置的第二个向量包含起始 PC。 以下代
码段显示了前两个向量条目:
#define VECTOR_000 (pointer*)__BOOT_STACK_ADDRESS // ARM core Initial Supervisor SP
#define VECTOR_001 __startup// 0x0000_0004 ARM core Initial Program Counter
要将向量表重新定位到偏移 vtor 位置,请使用以下代码段:
SCB_VTOR = vtor
从 S08 到 Kinetis E 系列移植指南, Rev 0, 07/2013
Freescale Semiconductor, Inc.
5
编程模型
3.8 复位和中断处理程序
对于 S08,在使用“从中断返回”(RTI) 指令时,中断服务例程就会结束。该指令可通过读出堆栈中以前保存的信息,
将 CCR、A、X 和 PC 寄存器还原到中断前的值。
使用 C 代码时,为 S08 设备定义中断处理程序,则必须使用编译器指令来告诉编译器该处理程序是一个中断服务例
程,而不是标准的 C 例程/函数。 以下示例显示了如何使用 CodeWarrior 定义中断服务例程:
interrupt VectorNumber_Vrtc void Rtc_ISR(void)
{
…
}
Cortex-M0+ 支持硬件中的所有异常进入和退出序列,因此允许中断例程是符合 ARM 体系结构过程调用标准
(AAPCS)的标准 C 函数。 只需通过引用相应的地址,就能在向量表中安置任何兼容的函数,并将其用作处理器。
使用此方案时,代码开发员并不需要记住此类编译器指令。 以下代码段显示了如何使用 C 语言定义与标准函数相同
的 Rtc_ISR :
void Rtc_ISR(void)
{
…
}
3.9 内存
S08 内核可以寻址 64 KB 的内存空间,并将内存分割成五个主要段,如下表中所示。
表 2. S08 内存映射
名称
地址
备注
直接页面寄存器
0x0000–0x00xx
RAM
0x00xx–1
高页面寄存器
0x1800–0x18yy
闪存
2–0xFFFF
向量
0xFFCO–0xFFFF
多达 128 字节
包括某些直接页面位置
系统配置
多达 60 KB
多达 32 x 2 字节
1. 上限取决于给定的设备
2. 下限取决于给定的设备
S08 内核能够以高效寻址模式访问直接页面寄存器/RAM,并允许使用 BSET、BCLR、BRSET 和 BRCLR 位处理指令
来设置、清除或测试这些寄存器中的任何位。 这种“位带”操作十分简单,但需耗时 2–5 个 CPU 周期。
Cortex-M0+ 处理器可以访问 4 GB 内存空间,并将内存分割成多个空间。 但并不支持类似于“位带”的操作。 不过,
KE 系列添加了位操作引擎 (BME) 以用于实现这种“位带”操作。 有关 BME 的详细信息,请参见位操作引擎(BME)
。 下表简要描述了 KE02 系统内存映射。
表 3. KE02 内存映射
系统 32 位地址范围
用途
0x0000_0000–0x07FF_FFFF
程序闪存和只读数据(包括前 196 个字节中的异常向量)
0x1000_0000–0x1000_00FF2
EEPROM
下一页继续介绍此表...
从 S08 到 Kinetis E 系列移植指南, Rev 0, 07/2013
6
Freescale Semiconductor, Inc.
编程模型
表 3. KE02 内存映射 (继续)
系统 32 位地址范围
用途
0x1FFF_FC00–0x1FFF_FFFF
SRAM_L:下位 SRAM
0x2000_0000–0x2000_0BFF
SRAM_U:上位 SRAM
0x4000_0000–0x4007_FFFF
AIPS 外围设备
0x400F_F000–0x400F_FFFF
GPIO
0x400F_F000–0x400F_FFFF
通过 BME 访问的修饰 AIPS 外围设备空间
0xE000_0000–0xE00F_FFFF
专用外围设备
0xF000_2000–0xF000_2FFF
ROM 表
0xF000_3000–0xF000_3FFF
杂项控制模块 (MCM)
0xF800_0000–0xFFFF_FFFF
单周期(内核时钟)IOPORT
其他
保留
3.10 访问类型
S08 处理器支持对内存进行字节访问和位访问。 通过位可寻址区(如前所述的直接页面)支持位访问。 由于可从内
存中加载的最大条目为 8 位,而目标也是 8 位,因此,所加载值的符号并不重要。 为了提高编译器的效率,该处理
器针对 16 位加载/存储和比较运算执行 LDHX、STHX 和 CPHX 指令。
Cortex-M0+ 是 32 位处理器,所有内部寄存器均为 32 位。 支持 8 位字节、16 位半字和 32 位字内存传输。 在使用字
节和半字时,程序员需要指定是将加载值处理为有符号还是无符号值。 在进行有符号加载时,加载值将进行符号扩
展,以在目标寄存器中创建 32 位有符号值;进行无符号加载时,寄存器的上部将会清零。
Cortex-M0+ 还提供多重加载与存储指令,能够通过一条指令与相邻的内存块来回传输多个字。
3.11 位带
S08 位可寻址区支持独立位通过位处理指令对直接页面位置进行访问。 位设置/清除指令需耗时 5 个总线时钟周期。
因此,对于位切换,则需耗时 10 个总线时钟周期。
KE04 和更新款的子系列支持位带。 上部 SRAM 区域 (SRAM_U) 是位带区。 位带可将内存别名区中的整个内存字
映射到位带区中的单个位。 例如,写入一个别名字会设置或清除位带区中的相应位。 这样,便可以使用单个 LDR
指令从字对齐地址中直接访问位带区中的每个位,并通过 C/C++ 切换每个位,而无需执行读取-修改-写入指令序列。
使用位带时,只需耗时两个内核时钟周期就能切换一个位,而使用读取-修改-写入序列时,则至少需要三个周期。 因
此,使用 KE 系列中的位带可以明显地改善性能。
此外,所有 KE 系列都采用了 BME 技术来支持位带。 有关 BME 的详细信息,请参见位操作引擎(BME) 。
3.12 调试
下表提供了 S08 和 KE 系列中的调试模块在某些特性方面的比较。
从 S08 到 Kinetis E 系列移植指南, Rev 0, 07/2013
Freescale Semiconductor, Inc.
7
编程模型
表 4. S08P 与 KE 系列调试模块的比较
S08
KE 系列
使用单线 BDM 接口
使用串行线调试(SWD) 接口,该接口包括两条线:一条用于
时钟,另一条用于数据 I/O。
支持三个硬件断点,或两个硬件断点加一个监测点
支持两个断点和两个监测点
支持 Loop1 捕获模式,可跟踪捕获 FIFO 中,用于代码跟踪的 无跟踪功能
8 字宽最新 COF 事件;另外还支持九种触发模式
有关调试的详细信息,请参见调试 。
3.13 电源管理
S08P 支持两种低功耗模式:等待和停止。
Cortex-M0+ 支持睡眠和深度睡眠模式。
• 在睡眠模式下,通常会将外部逻辑配置为停止处理器时钟,以最大程度地降低功耗。 NVIC 的电源和时钟保持
为打开状态,以便在发生异常时能够退出睡眠模式。
• 在深度睡眠模式下,处理器可能会完全断电,通常只有外部唤醒中断控制器(WIC)处于活动状态。 在检测到
任何未屏蔽外部中断时,WIC 将唤醒处理器。
可通过以下方法进入睡眠模式。
• 立即睡眠:等待中断(WFI)或等待事件(WFE)指令能使处理器立即进入睡眠模式。 检测到中断或调试事件
时将退出该模式。
• 退出时睡眠:设置系统控制寄存器中的 SLEEPONEXIT 字段 (SCR[SLEEPONEXIT]) 可以在退出上一个未完成
的 ISR 时,使处理器进入睡眠模式。 在此情况下,异常上下文将保留在堆栈中,以便能够立即处理唤醒处理器
的异常。
此外,可通过设置 SCR[SLEEPDEEP] 进入深度睡眠模式。 如果设置了此字段,在进入睡眠模式时,处理器将向外部
系统指示其可以进入更深度的睡眠。
实际上,KE 系列将睡眠模式实现为等待模式,将深度睡眠模式则实现为停止模式。
以下代码段显示了如何进入等待模式和停止模式:
void wait (void)
{
/* Clear the SLEEPDEEP bit to make sure we go into WAIT (sleep) mode instead
* of deep sleep.
*/
SCB_SCR &= ~SCB_SCR_SLEEPDEEP_MASK;
/* WFI instruction will start entry into WAIT mode */
#ifndef KEIL
asm("WFI");
#else
__wfi();
#endif
}
void stop (void)
{
/* Set the SLEEPDEEP bit to enable deep sleep mode (STOP) */
SCB_SCR |= SCB_SCR_SLEEPDEEP_MASK;
/* WFI instruction will start entry into STOP mode */
#ifndef KEIL
asm("WFI");
#else
从 S08 到 Kinetis E 系列移植指南, Rev 0, 07/2013
8
Freescale Semiconductor, Inc.
嵌套向量中断控制器 (NVIC)
__wfi();
#endif
}
4 嵌套向量中断控制器 (NVIC)
NVIC 是 ARM Cortex M 系列上的标配模块。 此模块与内核紧密集成,可以大大缩短进入与退出中断服务例程 (ISR)
的延迟时间。 需要耗时 15 个周期进入和退出 ISR,除非退出中断后再进入其他等待中的 ISR。 在此情况下,MCU
尾链以及退出和再进入操作则需要耗时 11 个周期。
NVIC 提供四个不同的中断优先级,可以使用这些优先级来控制为中断提供服务的顺序。 优先级为 0-3,其中 0 是最
高优先级。 例如,在电机控制应用中,如果同时发生定时器中断和 UART,而运转电机的定时器中断比接收字符的
UART 中断更为紧急。 那么,必须将定时器优先级设置为高于 UART。这样,无需额外的软件代码,就能实现真正
的硬件中断嵌套。
配备中断优先级控制器 (IPC) 的 S08 可以支持不同的中断优先级,但需要在中断服务例程中添加 prolog 和 epilog 软件
代码。
以下代码段显示了如何在 KE 系列中使用给定的 IRQ 编号启用或禁用中断:
void enable_irq (int irq)
{
/* Make sure that the IRQ is an allowable number. Up to 32 is
* used.
*
* NOTE: If you are using the interrupt definitions from the header
* file, you MUST SUBTRACT 16!!!
*/
if (irq > 32)
printf("\nERR! Invalid IRQ value passed to enable irq function!\n");
else
{
/* Set the ICPR and ISER registers accordingly */
NVIC_ICPR |= 1 << (irq%32);
NVIC_ISER |= 1 << (irq%32);
}
}
void disable_irq (int irq)
{
/* Make sure that the IRQ is an allowable number. Right now up to 32 is
* used.
*
* NOTE: If you are using the interrupt definitions from the header
* file, you MUST SUBTRACT 16!!!
*/
if (irq > 32)
printf("\nERR! Invalid IRQ value passed to disable irq function!\n");
else
/* Set the ICER register accordingly */
NVIC_ICER = 1 << (irq%32);
}
void set_irq_priority (int irq, int prio)
{
/*irq priority pointer*/
uint32 *prio_reg;
uint8 err = 0;
uint8 div = 0;
/* Make sure that the IRQ is an allowable number. Right now up to 32 is
从 S08 到 Kinetis E 系列移植指南, Rev 0, 07/2013
Freescale Semiconductor, Inc.
9
位操作引擎(BME)
* used.
*
* NOTE: If you are using the interrupt definitions from the header
* file, you MUST SUBTRACT 16!!!
*/
if (irq > 32)
{
printf("\nERR! Invalid IRQ value passed to priority irq function!\n");
err = 1;
}
if (prio > 3)
{
printf("\nERR! Invalid priority value passed to priority irq function!\n");
err = 1;
}
if (err != 1)
{
/* Determine which of the NVICIPx corresponds to the irq */
div = irq / 4;
prio_reg = ((uint32*)&NVIC_IP(div));
*prio_reg = (((prio&0x3) << (8 - ARM_INTERRUPT_LEVEL_BITS))) << (((irq-(div<<2)))<<3);
}
}
有关 NVIC 和代码示例的详细信息,请参见以下网站上提供的《Kinetis L 外围模块快速参考指南》(KLQRUG):
freescale.com
5 位操作引擎(BME)
位操作引擎 (BME) 为原子“读取-修改-写入”存储器对外围设备地址空间的操作提供硬件支持。 此架构功能也称
为“修饰存储”,它定义了一种新的理念,不仅仅是将数据值读/写到编址存储器单元内,而且为存储器映射的外围设
备的载入和存储操作提供了附加语义。 BME 修饰参考仅可用于处理器内核生成的系统总线事务,并针对基址为
0x4000_0000 到 0x4007_FFFF(AIPS 外围设备)的标准 512 KB 外围设备地址空间,部分针对从 0x400F_F000 开始
的 GPIO 空间。 不能使用 BME 来访问其他内存区,包括 RAM 和闪存。
修饰语义嵌入在地址位 28–19 中,并在地址 0x4400_0000–0x5FFF_FFFF 上创建 448 MB 的空间。 这些位是从发送给
外围总线控制器的实际地址中剥离而得,由 MBE 用来定义和控制其运算。 对于大多数 BME 命令而言,单个内核读
或写总线周期将转换为原子读-修改-写序列,也就是说,一个不能分割的“先读后写”总线序列。
BME 支持修饰存储(逻辑与、逻辑或、位域插入)和修饰加载(加载-清除 1 位、加载-设置 1 位、无符号位域提取)。
外围地址位 31–29 始终是 010,也就是说,用于 BME 的外围内存空间从 0x40000000 开始。
数据大小由读取或写入运算指定,可为字节(8 位)、半字(16 位)或字(32 位)。
对于逻辑 AND、OR 和 XOR 存储运算,外围地址位 28–26 指定此表中提供的运算代码 (opcode)。
表 5. S08P 与 KE 的特性比较
运算
操作码
备注
与
001
在外围写入期间,将使用逻辑与运算将相
应的外围数据与写入数据进行合并。
或
010
在外围写入期间,将使用逻辑或运算将相
应的外围数据与写入数据进行合并。
异或
011
在外围写入期间,将使用逻辑异或运算将
相应的外围数据与写入数据进行合并。
从 S08 到 Kinetis E 系列移植指南, Rev 0, 07/2013
10
Freescale Semiconductor, Inc.
位操作引擎(BME)
地址位 25–20 是“任意”位。 地址位 19–0 是外围空间的实际内存地址位。
对于逻辑位域插入 (BFI)、加载-清除/设置 1 位和位域提取 (UBFX) 存储运算,外围地址位 28–26 指定此表中提供的
操作码。
表 6. S08P 与 KE 的功能比较
运算
操作码
备注
加载-清除
010
在外围读取期间,只将相应的位载入变量,
并清除目标位。
加载-设置
011
在外围读取期间,只将相应的位载入变量,
并设置目标位。
位域插入/提取
1xx
位 28 始终是 1,将会相应地使用位号位填
充位 27–26。
在外围读取期间,会将供应位号中的相应
位域提取到读取变量。
在外围写入期间,只将使用写入数据供应
位号中的相应位域写入从位置供应位号开
始的相应位域。
注: 位域插入/提取运算不能应用到从
0x400F_F000 开始的 GPIO 地址,因
为地址位 19 由位宽度占用。 因此,
无法使用此位域操作访问
GPIOx_PDOR/PSOR/PCOR/
PTOR/PDIR/PDDR。 可以使用特殊
的 C 语言方法,如以下代码段中所
示。
对于无符号位域提取操作,地址位 18–0 是外围空间的实际内存地址位。
下图显示了不同运算的地址位表示形式。
b31
30
29
25
24
23
22
21
20
字节访问:
0
1
0
操作码
-
-
-
-
-
-
16 位访问:
0
1
0
操作码
-
-
-
-
-
-
32 位访问:
0
1
0
操作码
-
-
-
-
-
-
28
27
26
19
18
...
5
4
3
2
1
0
存储器地址位 19 ... 0
存储器地址位 19 ... 1
存储器地址位 19 ... 2
0
0
0
图 1. 与、或、异或存储的地址位
从 S08 到 Kinetis E 系列移植指南, Rev 0, 07/2013
Freescale Semiconductor, Inc.
11
位操作引擎(BME)
b31
30
29
字节访问:
0
1
0
16 位访问:
0
1
32 位访问:
0
1
28
25
24
操作码
-
-
0
操作码
-
0
操作码
27
26
23
22
21
位数
20
19
18
4
3
2
1
存储器地址位 19 ... 1
-
位数
5
0
存储器地址位 19 ... 0
-
位数
...
0
存储器地址位 19 ... 2
-
0
0
1
0
图 2. 载入-清除/设置 1 位运算的地址位
b31
30
29
28
27
26
字节访问:
0
1
0
1
-
-
16 位访问:
0
1
0
1
-
32 位访问:
0
1
0
1
25
24
位数
位数
位数
23
20
19
22
21
-
位字段宽度
-1
位字段宽度 -1
位字段宽度 -1
18
...
5
4
3
2
存储器地址位 18 ... 0
存储器地址位 18 ... 1
存储器地址位 18 ... 2
0
0
0
图 3. 位域插入/提取运算的地址位
以下代码段显示了如何使用 BME 运算:
// BME operation code
#define BME_OPCODE_AND1
#define BME_OPCODE_OR2
#define BME_OPCODE_XOR3
#define BME_OPCODE_BITFIELD4
//macro used to generate hardcoded AND address
#define BME_AND(ADDR) (*(volatile uint32_t *)(((uint32_t)ADDR) | (BME_OPCODE_AND<<26)))
BME_AND(&FTM2_OUTMASK) = 0x02;
//macro used to generate hardcoded OR address
#define BME_OR(ADDR) (*(volatile uint32_t *)(((uint32_t)ADDR) | (BME_OPCODE_OR<<26)))
BME_OR(&FTM2_OUTMASK) = 0x02;
//macro used to generate hardcoded XOR address
从 S08 到 Kinetis E 系列移植指南, Rev 0, 07/2013
12
Freescale Semiconductor, Inc.
时钟模块
#define BME_XOR(ADDR) (*(volatile uint32_t *)(((uint32_t)ADDR) | (BME_OPCODE_XOR<<26)))
BME_XOR(&FTM2_OUTMASK) = 0x02;
//macro used to generate hardcoded bit field insert address
#define BME_BITFIELD_INSERT(ADDR,bit,width) (*(volatile uint32_t *)(((uint32_t)ADDR) \
| (BME_OPCODE_BITFIELD <<26) \
| ((bit & 0x1F)<<23) | ((width-1) & 0xF)<<19))
BME_BITFIELD_INSERT(&PORT_IOFLT,16,2) = (0x03 << 16); // write 3 to PORT_IOFLT [10:8]
#define GPIO_ALIAS_OFFSET 0x000F0000L
#define GPIOB_PDOR_ALIAS (((uint32_t)&GPIOB_PDOR)-GPIO_ALIAS_OFFSET)
BME_BITFIELD_INSERT(GPIOB_PDOR_ALIAS,19, 2) = (3<<19); // write 3 to GPIOB_PDOR[20:19]
//macro used to generate hardcoded bit field extract address
#define BME_BITFIELD_EXTRACT(ADDR,bit,width) (*(volatile uint32_t *)(((uint32_t)ADDR) \
| (BME_OPCODE_BITFIELD <<26) \
| ((bit & 0x1F)<<23) | ((width-1) & 0xF)<<19))
Data = BME_BITFIELD_EXTRACT(&ADC_R,0, 12); // extract 12 bits: ADC_R[11:0]
//macro used to generate hardcoded load 1 bit clear address
#define BME_BIT_CLEAR(ADDR,bit) (*(volatile uint32_t *)(((uint32_t)ADDR) \
| (BME_OPCODE_BIT_CLEAR <<26) \
| ((bit & 0x1F)<<21)))
//macro used to generate hardcoded load 1 bit set address
#define BME_BIT_SET(ADDR,bit) (*(volatile uint32_t *)(((uint32_t)ADDR) \
| (BME_OPCODE_BIT_SET <<26) \
| ((bit & 0x1F)<<21)))
bit = BME_BIT_SET(&I2C0_S,1); // read I2C0_S[IICIF] and then clear it by writing
// 1 to it
bit = BME_BIT_CLEAR(&ACMP0_CS,5); // read ACMP0_CS[ACF] and then clear it
6 时钟模块
内部时钟源(ICS)为 MCU 提供时钟源选项。 其中包含的锁频环(FLL)可用作时钟源,该时钟可由内部或外部参
考时钟控制。 此模块可提供该 FLL 时钟或者内部或外部参考时钟作为 MCU 系统时钟的时钟源。 另外还提供了一
些信号来控制低功耗振荡器(OSC)模块。 这些信号将配置和启用 OSC 模块,以生成供外围设备模块使用的外部晶
振/谐振器时钟(OSCOUT)并用作 ICS 外部参考时钟源。 ICS 内部参考时钟可以是 OSC 提供的外部晶振/谐振器时
钟(OSCOUT),也可以是其他外部时钟源。
KE 系列上的 ICS 和 OSC 结构与 S08P 十分相似。 KE02 子系列与 S08P 之间的主要差别在于,KE02 中的 FLL 倍增
因子固定为 1024,即 S08P 系列的两倍。 因此,FLL 输出频率为参考时钟频率 x 1024。 可以通过
SIM_BUSDIV[BUSDIV] 将分频器(BDIV)后面的 FLL 输出时钟进一步对半分割,以便同时提供总线时钟和 Flash
时钟。
可通过时钟门控功能对所有外围时钟进行门控。 默认情况下,在复位后,除闪存和 SWD(串行线调试)以外的所有
外围时钟都将阻断以节省电源。 这与 S08P 在复位后启用所有外围时钟不同。
下图给出了系统时钟示意图
从 S08 到 Kinetis E 系列移植指南, Rev 0, 07/2013
Freescale Semiconductor, Inc.
13
时钟模块
SIM
ICS
CG
ICSIRCLK
ICSFFCLK
32 kHz IRC
1
CG
RTC / WDOG
CG
FTM
CG
内核时钟
平台时钟
系统时钟
CG
总线时钟
闪存时钟
CG
RTC / WDOG / ADC
FLL
0
IREFS
ICSFLLCLK
RDIV
1
0
BDIV
ICSOUTCLK
1
0
CLKS
TCLKS
系统振荡器
CLK_GEN
EXTAL
1
XTAL_CLK
XTAL
OSC
逻辑
BUSDIV
OSCCLK
OSCERCLK
0
OSCOS
PMC
1kHz LPO
LPOCLK
RTC / WDOG
CG - 时钟门控
图 4. 系统时钟示意图
以下代码段显示了如何使用 8 MHz 外部晶振将 ICS 和 OSC 模块从 FEI 模式初始化为 FEE 模式:
/* assume external crystal is 8Mhz *
*/
/* enable OSC with high gain, high range and select oscillator output as OSCOUT
*
*/
OSC_CR = OSC_CR_OSCEN_MASK
| OSC_CR_OSCSTEN_MASK
/* enable stop */
/* wait for OSC to be initialized
*
*/
while(!(OSC_CR & OSC_CR_OSCINIT_MASK));
/* divide down external clock frequency to be within 31.25K to 39.0625K
*
*/
/* 8MHz */
ICS_C1 = ICS_C1 & ~(ICS_C1_RDIV_MASK) | ICS_C1_RDIV(3); /* now the divided
frequency is 8000/256 = 31.25K */
/* change FLL reference clock to external clock */
ICS_C1 = ICS_C1 & ~ICS_C1_IREFS_MASK;
while(ICS_S & ICS_S_IREFST_MASK);
/* wait for FLL to lock */
while(!(ICS_S & ICS_S_LOCK_MASK));
/* now FLL output clock is 31.25K*512*2 = 32MHz
*
*/
if(((ICS_C2 & ICS_C2_BDIV_MASK)>>5) != 1)
{
ICS_C2 = (ICS_C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(1);
从 S08 到 Kinetis E 系列移植指南, Rev 0, 07/2013
14
Freescale Semiconductor, Inc.
系统集成模块(SIM)
}
/* now system/bus clock is the target frequency 16MHz
*
*/
/* clear Loss of lock sticky bit */
ICS_S |= ICS_S_LOLS_MASK;
以下代码段显示了如何门通/阻断 KBI0 时钟:
SIM_SCGC |= SIM_SCGC_KBI0_MASK; // enable KBI0 clock
SIM_SCGC &= ~SIM_SCGC_KBI0_MASK; // gate off KBI0 clock
7 系统集成模块(SIM)
下表列出了 S08P、S08AC 和 KE 系列的 SIM 模块的差别。
表 7. S08 与 KE 产品系列的 SIM 模块比较
KE02
S08
包括 Kinetis 系列 ID、子系列 ID、修订版号和设备引脚 ID 的字 包括通用唯一标识符(UUID)
段。
系统复位状态标志在 SRSID 寄存器的低半字中体现。 提供了 SYS_SRS 寄存器包括只读状态标志,用于指示最近发生的复位
三个新的状态标志:来自 SWD 的 MDM-AP 系统复位请求
的来源。 未提供直接软件复位机制。
(SIM_SRSID[MDMAP])、内核死锁 (SIM_SRSID[LOCKUP]),
以及由于进入停止模式失败(原因通常是未通过 IIC 应答进入停
止模式)而造成的停止模式应答错误复位
(SIM_SRSID[SACKERR])。 此外,Cortex-M0+ 内核可通过应
用中断与复位控制寄存器生成软件复位。
时钟门由 SIM_SCGC 寄存器控制。
时钟门由 S08P 中的 SCG_C1 到 SCG_C4 寄存器控制。
引脚重新映射由 SIM_PINSEL 寄存器控制。
引脚重新映射由 S08P 中的 SYS_SOPT1 寄存器控制。
可以单独控制每个 Flextimer 引脚重新映射。
在 S08P 中,每个 Flextimer 模块的引脚只能以组为单位重组。
可以通过 SIM_BUSDIV 寄存器,针对总线时钟和闪存时钟将总 没有 SIM_BUSDIV 寄存器。 不能进一步对总线时钟和闪存时
线时钟进一步对半分频。
钟进行分频。
KE 系列中没有非法地址寄存器。
S08P 有非法地址寄存器。
8 电源管理控制器
KE 系列中的电源管理控制器(PMC)与 S08P 中的类似。 支持等待和停止模式,并具有通电复位(POR)功能。 可
以启用或禁用低电压检测(LVD)和低电压警告中断。 当 CPU 执行停止指令时,如果 LVD 在停止模式下启用(同
时设置了 PMC_SPMSC1[LVDE] 和 PMC_SPMSC1[LVDSE]),那么电压调节器在停止模式下将继续保持激活状态。
要获得最低功耗模式 (Stop3),请通过清除这两个字段,在停止模式下禁用 LVD。
以下代码段显示了如何进入 Stop3 模式。
PMC_SPMSC1 = 0x00;//disable LVD;
stop();
从 S08 到 Kinetis E 系列移植指南, Rev 0, 07/2013
Freescale Semiconductor, Inc.
15
闪存、EEPROM 和闪存控制器模块
9 闪存、EEPROM 和闪存控制器模块
KE 系列上的闪存与 EEPROM 模块与 S08P 上的模块十分相似。 KE 系列的闪存带有缓存,而 EEPROM 则没有缓
存。 这极大地改善了闪存存取的性能。 但是,所有 S08 设备都没有闪存缓存。 在 KE 系列中,可按字(32 位)、半
字(16 位)或字节访问闪存;但只能按字节访问 EEPROM。
此外,KE 系列具有其他新的闪存操作功能:可同时读写。 允许在编程/擦写闪存的同时读取闪存。 对于不需要从
RAM 运行代码的应用,尤其是内存占用空间较小的设备,此功能十分有用。 可通过在 MCM_PLACR 中设置“启用
停顿闪存控制器”字段来启用此功能,如以下代码中所示。
MCM_PLACR |= MCM_PLACR_ESFC_MASK;
闪存控制器是一个内存加速单元,有以下特点:
• 在总线主控与 32 位闪存之间提供接口。
• 提供可加快闪存数据传输速度的缓冲器和缓存。
闪存控制器拥有两个单独机制,用于加快总线主控与闪存之间的接口的速度。 32 位前瞻缓冲器可预取下一个 32 位
闪存位置,而 4 路、4 组的程序闪存缓存可存储之前访问的闪存数据,以便快速访问。
不仅支持指令推测和缓存,而且还支持数据推测和缓存。
可以在 MCM_PLACR 寄存器中启用或禁用这些不同的功能。
可以使用以下方法来检查最近编程的数据是否正确:在读取闪存之前使缓存失效:
MCM_PLACR |= MCM_PLACR_CFCC_MASK;
这是为了确保缓存包含目标位置的更新值。
10 引脚分配变化
KE 系列的引脚分配与 S08P 兼容。 两者都有 8 个支持 20 mA 驱动能力的高驱动引脚。
KE 系列采用经过优化的新 I/O 结构,能够改善瞬态保护和 EMC 性能。 以下列表提供了引脚分配存在的变化(以
S08P 为例)。
• 将调试端口替换为两个 SWD 引脚:SWD_DIO 和 SWD_CLK 引脚。 KE 系列中没有 BKGD 功能。
• KE 系列使用了稳健可靠的解决方案,可以应对家用电器面对的苛刻使用环境。 EFT 可以支持 4.4 kV 或更高电
压,电源 ESD 直接接触放电电压为 20 kV 或更高。 强化的 IO 焊盘设计可以承受系统 EMC 和 ESD 干扰,具体
特性包括:
• 在 GPIO/RST/IRQ 上进行滤波以实现噪声抑制
• 驱动强度控制符合 EMI/EMC 规范
• 所有 GPIO 默认使用高阻抗(包括非粘合引脚)
11 安全功能增强
从 S08 到 Kinetis E 系列移植指南, Rev 0, 07/2013
16
Freescale Semiconductor, Inc.
端口控制和 GPIO
11.1 看门狗
看门狗 (WDOG) 定时器模块是可供系统使用的独立定时器。 如果在指定的时间段内未使用特定数据写入序列将其
更新/刷新,则复位 MCU。 可以将其用作一种安全元件,以确保软件按计划运行,同时确保 CPU 不会陷于无限循环
或执行意外代码。 看门狗是根据 IEC60730 安全标准设计的。
此模块与 S08P 系列中的对应模块类似。 以下是有关使用此模块的一些准则:
• WDOG 寄存器映射以类似于 S08P 的 big-endian 模式进行组织,但是,Cortex-M0+ 内核使用 little-endian 访问模
式。 因此,在使用 16 位地址模式访问 WDOG_CNT、WDOG_TOVAL 和 WDOG_WIN 等 WDOG 寄存器时,
始终要记住值的高位字节在高位字节地址中,值的低位字节在低位字节地址中。
例如,以下代码段会将 0xA6 写入 WDOG_CNTL(高位字节地址),将 0x02 写入 WDOG_CNTH(低位字节地
址)。
WDOG_CNT = 0xA602;
• 刷新序列(即向 WDOG 馈送数据)的计数器必须在 16 个总线时钟周期内完成,否则将出现复位。
• 解锁序列写入必须在 16 个总线时钟周期内完成,以便对一次写入配置位进行更新,否则将出现复位。
• 软件必须在解锁后、WDOG 关闭解锁窗口前的 128 个总线时钟周期内完成更新,否则将出现复位。
11.2 CRC
循环冗余检查(CRC)模块为错误检测生成 16/32 位 CRC 代码。 它提供了可编程的多项式、WAS 以及实施 16 位
或 32 位 CRC 标准所需的其他参数。 可以一次性计算 32 位数据的 16/32 位代码。 此模块与 S08P 系列中的模块类
似,不过仍存在以下差别:
• 支持输入数据或输出数据的按位/按字节移位(CRC 作用的结果)。 S08P 仅支持按位移位。
• 支持对寄存器进行 32 位访问。 S08P 仅支持对寄存器进行 8 位访问。
假如 KE 系列上的 CRC_DATA 寄存器是一个 32 位寄存器,那么,它相当于在 S08P 上串联了 CRC_D0 到 CRC_D3
这四个 8 位寄存器。
12 端口控制和 GPIO
端口控制模块控制数字干扰滤波器、上拉和高驱动。 在 KE 系列中,有四个 32 位寄存器:PORT_IOFLT、PORT_PUEL/
H 和 PORT_HDRVE。 这些寄存器与 S08P 中的对应寄存器在功能上类似,唯一的差别在于,KE 系列中的这些寄存
器可以在 32 位模式下访问。 这极大地改善了针对多个 I/O 的控制速度。
注
• PORT_PUEL/H 是对应于 S08P 中 PORT_PTxPE 组合寄存器的端口上拉启用
寄存器。 因此,需要相应地更改用于访问 S08P 中任何 PORT_PTxPE 的代
码。 KE 系列中没有端口输入和输出启用寄存器(PORT_PTxIE、
PORT_PTxOE)。 KE 系列改为使用 GPIOx_PDDR 来控制数据方向,使用
GPIOx_PIDR 来启用或禁用 GPIO 输入。
• 在复位后,所有 GPIO 引脚将默认为外围输入,在此情况下,引脚数据输入寄
存器中的相应位显示为 0。 要正确读取引脚状态,必须清除端口输入禁用寄存
器 (PIDR) 中的相应位。
KE 系列中的 GPIO 模块控制方向以及 I/O 引脚的输入和输出数据,这一点也与 S08P 系列类似。 但是,KE 系列中
的 GPIO 寄存器可以在 32 位模式下访问。 此外,还可以通过单周期(内核时钟)IOPORT 接口访问它的 GPIO。 这
称为快速 GPIO 或 FGPIO。 此 FGPIO 的内存映射从 0xF800_0000 开始。
通过 IOPORT 接口(FGPIO 内存空间)执行的访问与任何指令的获取保持同步,因此可在一个内核时钟周期内完成。
参见下图。
从 S08 到 Kinetis E 系列移植指南, Rev 0, 07/2013
Freescale Semiconductor, Inc.
17
端口控制和 GPIO
Cortex-M0+ 内核
Dbg
获取
AGU
NMC
LD/ST
Doc
Rn
SHFT
ALU
NUL
IO 端口
32
PRAM
RAM
阵列
GPIO
s1
m0
AXBS
-Lite
s2
BME
PBRIDGE
从机
外围设备
32
s0
FMC
32
NVM
阵列
图 5. Cortex-M0+ 内核平台框图
以下是 GPIO 主要特性的列表:
•
•
•
•
在所有数字引脚多路复用模式下均显示引脚输入数据寄存器
引脚输出数据寄存器,具有对应的设置/清除/切换寄存器
引脚数据方向寄存器
可通过 IOPORT 对 GPIO 寄存器执行零等待状态访问
注
复位后,所有 GPIO 引脚将默认为外围输入,在此情况下,引脚数据输入寄存器中
的相应位显示为 0。 要正确读取引脚状态,必须清除端口输入禁用寄存器 (PIDR) 中
的相应位。
以下代码段演示了如何使用端口控制和 GPIO:
PORT_IOFLT = 0x0; // Filter clock source is BUSCLK
PORT_PUEH = 0x0;
PORT_PUEL = 0x1; // Enable pullup for PTA0
PORT_HDRVE = 0x0; // No high drive pin
/* normal GPIO manipulation */
GPIOA_PDDR = 1<<0; // PTA0 is set as output pin
GPIOA_PTOR = 1<<0; // Toggle PTA0
GPIOA_PIDR &= ~2; // configure PTA2 pin as GPIO input, must clear PIDR bit
GPIOA_PDDR &= ~2; // direction is INPUT
从 S08 到 Kinetis E 系列移植指南, Rev 0, 07/2013
18
Freescale Semiconductor, Inc.
定时器模块
/* GPIO manipulation via IOPORT interface */
FGPIOA_PDDR = 1<<0; // PTA0 is set as output pin
FGPIOA_PTOR = 1<<0; // Toggle PTA0
13 定时器模块
13.1 RTC
实时计数器 (RTC) 由一个 16 位计数器、一个 16 位比较器、多个二进制和十进制预分频器因子、三个时钟源、一个
可编程周期中断和一个可编程外部切换脉冲输出组成。 S08P 与 KE 系列之间的差别在于寄存器访问宽度。
S08P 中的两个 8 位状态与控制寄存器(RTC_SC1 和 RTC_SC2),级联后则相当于 KE 系列中的一个 32 位寄存器
RTC_SC。 S08P 中的两个 8 位 RTC 模数寄存器(RTC_MODH、RTC_MODL),级联后则相当于一个 32 位 RTC_MOD
寄存器。
RTC 计数器寄存器的情况与此类似。因此,S08P 中用于访问 RTC_SC1、RTC_SC2、RTC_MODH、RTC_MODL、
RTC_CNTH 和 RTC_CNTL 的代码需相应地更改为访问 RTC_SC、RTC_MOD 和 RTC_CNT。
13.2 FlexTimer
FlexTimer(FTM)以简单定时器,即 S08 设备上使用的 TPM 模块为基础而设计,并将其功能扩展,从而可满足电动
机控制、数字灯光解决方案和电源转换的需求。 下面将介绍对定时器模块所做的多个关键性增强部分。
• 带符号的递增计数器
• 死区时间插入硬件
• 故障控制输入
• 增强的触发功能
• 初始化和极性控制
以下列表介绍了 S08 设备中 FlexTimer 模块的主要特性。
• FTM 源时钟可选。
• 源时钟包括系统时钟、固定频率时钟或外部时钟。
• 固定频率时钟是附加的时钟输入,允许选择除系统时钟以外的片上时钟源。
• 选择外部时钟可将 FTM 时钟连接到芯片级输入引脚,因此,可将 FTM 计数器与片下时钟源同步
• 1、2、4、8、16、32、64 或 128 分频的预分频器
• 16 位计数器
• 可以是自由运行计数器,也可以是带有初始值和最终值的计数器。
• 计数可以是递增或递减计数。
• 可为输入捕获、输出比较或边沿对齐的 PWM 模式配置每个通道。
• 在输入捕获模式下:
• 捕获可以在上升沿和/或下降沿发生
• 可为某些通道选择输入滤波器
•
•
•
•
•
•
•
•
在输出比较模式下,可以在匹配时设置、清除或切换输出信号。
可为中心对齐 PWM 模式配置所有通道。
每个通道对都可以组合,以生成一个 PWM 信号,该信号独立于 PWM 信号两个边沿的控制。
FTM 通道可以作为提供相同输出的对、提供互补输出的对,或者提供独立输出的独立通道进行操作。
针对每个互补对提供死区时间插入。
生成匹配触发器
PWM 输出的软件控制
提供多达四个故障输入,从而结合可编程极性进行全局故障控制
从 S08 到 Kinetis E 系列移植指南, Rev 0, 07/2013
Freescale Semiconductor, Inc.
19
定时器模块
•
•
•
•
•
•
•
•
•
•
每个通道的极性可配置。
为每个通道生成一个中断
计数器溢出时生成中断
检测到故障状态时生成中断
同步加载写入缓冲 FTM 寄存器
为关键寄存器提供写保护
与 TPM 向下兼容
陷入 0 和 1 状态时测试输入捕获
可进行双边沿捕获以便进行脉宽和期限测量
为同步不同的 FlexTimer 模块提供全局时基
与 S08P 相比,KE 系列中的 FlexTimer 模块具有下列新的增强特性。
• 反转控制/通道交换
• 故障输入极性控制
• 中间负载
• 软件输出控制
• 调试模式功能
• TOF 频率/周期 TOF
可通过清除或设置 FTMx_FLTPOL[FLTnPOL],将故障输入极性配置为高电平有效或低电平有效。 FTM 可设置为在
进入调试模式后仍起作用。 为此,可以设置 FTMx_CONF[BDMMODE]。
反转功能可以交换通道(n) 和通道(n+1) 输出之间的信号。 当条件为(FTMEN = 1)、(QUADEN = 0)、(DECAPEN
= 0)、(COMBINE = 1)、(COMP = 1)、(CPWMS = 0) 和(INVm = 1)(其中的 m 代表通道对)时,将选择反转操作。
因其中间负载特性,PWMLOAD 寄存器允许使用寄存器缓冲器在定义加载点的内容更新 MOD、CNTIN 和 C(n)V 寄
存器。 在此情况下,则不需要使用 PWM 同步。 支持以下加载点/条件。
• 当 FTM 计数器从 MOD 值变化为 CNTIN 时
• 语句 When CHjSEL = 1 则是进行通道(j) 匹配(FTM 计数器 = C(j)V)。
配置加载点后,必须通过设置 FTMx_PWMLOAD[LDOK] 启用这些加载点。 必须设置此字段,以便在后续加载点发
生加载。
以下代码段显示了如何使用通道 2 匹配启用中间加载功能:
FTM2_MOD = 1200;
FTM2_CNTIN = 200;
FTM2_MODE = 0x05; /* FTM features are enabled ans write protection is disabled */
FTM2_COMBINE = 0x23; /* Combine is enabled, Output CH0 and CH1 are complementary */
FTM2_SYNCONF = 0x4; // CNTIN register is updated with its buffer value by the
// PWM synchronization.
FTM2_C0SC = 0x28; /* No Interrupts; High True pulses on Edge Aligned PWM */
FTM2_C1SC = 0x28;
FTM2_C0V = 300; /* 25% pulse width */
FTM2_C1V = 1100; /* 91% pulse width */
FTM2_SC = 0x08; /* CLK source is System clock / 1 */
FTM2_SYNC = 0x80; /* OUTMASK register is updated with the value of its buffer only by the
PWM synchronization. */
FTM2_C0V = 150; /* 25% pulse width */
FTM2_C1V = 550;
FTM2_MOD = 600;
FTM2_PWMLOAD = 0x203 ; /* enable load on both load points */
在生成 PWM 时,软件输出控制将根据特定时间的软件定义值强制设定通道输出值。 当条件为(FTMEN = 1)、
(QUADEN = 0)、(DECAPEN = 0)、(COMBINE = 1)、(CPWMS = 0) 和(CHnOC = 1),将选择软件输出控制。 CHnOC
字段可针对特定的通道输出启用软件输出控制,CHnOCV 可选择强制到此通道输出的值。
可通过 FTMx_CONF[NUMTOF] 设置 TOF 频率。 将会针对第一次发生的计数器溢出设置 TOF 标志,而不会针对后
续的 N 次溢出设置此标志(其中的 N = NUMTOF 且不为 0)。 如果只需要在若干个 PWM 周期后更改 PWM 事件,
则此功能十分有用。 这会大大减少 CPU 过载现象。
此外,用户必须了解下列其他两个差异。
从 S08 到 Kinetis E 系列移植指南, Rev 0, 07/2013
20
Freescale Semiconductor, Inc.
调试
• 在 KE 系列中,几乎所有的 FTM 通道都可单独重新映射到不同的引脚;而在 S08P 中,只有 FTM2 通道才能在
组中进行替换引脚的重新分配。 可以使用引脚选择寄存器(SIM_PINSEL) 实现这种重新映射。
• 可以使用 32 位访问寄存器以改善性能。
13.3 PIT
KE 系列周期中断定时器 (PIT) 是一系列可用于引发中断和触发器的定时器/通道。 这是一个 32 位模块,每个定时器
是倒计数计时器,该定时器的初始值则在 PIT_LDVALn 寄存器中指定。 每当定时器达到 0 时,将生成触发脉冲并设
置中断标志。 如果已通过设置 PIT_TCTRLn[TIE] 启用了相应的功能,则可以生成新的中断,不过只会在清除上一个
中断后才生成。 通过使用 PIT_TCTRLn[TEN] 先禁用,而后再启用定时器,即可以重新开始计数器周期。 可通过
PIT_CVALn 寄存器读取定时器的当前计数器值。
可以在不重新启动定时器的情况下更改计数器周期,方法是使用新的加载值写入 PIT_LDVALn 寄存器,此值将在发
生下一个触发事件后生效。
可以链接 PIT 中的定时器,就如同这些定时器是一个整体一样。
注
在执行其他任何设置之前,必须通过清除 PIT_MCR[MDIS] 启用该模块。
以下代码段显示了如何设置定时器链(定时器 1 和 0),以便在生成 PIT channel1 中断之前先计数 10000 个周期:
enable_irq(23);// enable PIT channel 1/timer1 interrupt
PIT_MCR = 0; // enable PIT
PIT_LDVAL0 = 1000-1;
PIT_LDVAL1 = 10-1;
PIT_TCTRL0 = PIT_TCTRL_TEN_MASK;
PIT_TCTRL1 = PIT_TCTRL_TIE_MASK|PIT_TCTRL_TEN_MASK
| PIT_TCTRL_CHN_MASK; // Enable PIT Chain Mode for timer1:0
#define VECTOR_039 pit_ch1_isr
void pit_ch1_isr(void)
{
// clear PIT ch1/timer1 interrupt flag
PIT_TFLG1 = PIT_TFLG_TIF_MASK;
printf("\tEntered PIT CH1 ISR *\n");
}
14 调试
KE 系列实施了 2 引脚串行线调试 (SWD) 端口:SWD_CLK 和 SWD_DIO。 SWD 基于 ARM CoreSight 体系结构。 基
本调试功能包括处理器停止、单步、处理器内核寄存器访问、复位和硬故障向量捕获、软件断点和全面系统内存访问。
有关此体系结构的详细信息,请访问: arm.com。
通过 ARM 调试访问端口(DAP),调试器可访问 DAP 总线上被用作寄存器的状态和控制单元。 这些寄存器提供了
低功耗模式恢复和典型运行控制场景的其他控制和状态。 状态寄存器位还为调试器提供了用于获取内核的最新状
态,而同时无需启动交叉开关中的总线事务的方式,从而避免在调试会话期间过多的打扰。 重要的是要注意,这些
DAP 控制和状态寄存器在系统内存映射内未进行内存映射,而且只可使用 SWD 通过调试访问端口进行访问。
KE 系列调试模块支持两个断点和两个监测点。 但其并不提供微跟踪缓冲器(MTB),因此,用户无法使用 SWD 模
块获得迹函数。
注
在复位期间,请不要尝试读取 MDM-AP 状态寄存器的位 2(安全状态)。 仅当设备
处于非复位状态时,此位才有效。
从 S08 到 Kinetis E 系列移植指南, Rev 0, 07/2013
Freescale Semiconductor, Inc.
21
ADC 模块
15 ADC 模块
12 位模数转换器 (ADC) 是一种逐次逼近 ADC,其速度比 Σ-Δ 转换器要快,同时还能保持同等的高精度。
以下是 ADC 模块特性的列表。
• 采用 8 位、10 位或 12 位分辨率的线性逐次逼近算法
• 多达 16 个外部模拟输入、外部引脚输入以及 5 个内部模拟输入,包括内部带隙、温度传感器和参考电压
• 8 位、10 位或 12 位靠右对齐、无符号输出格式
• 单一或连续转换(单一转换后自动返回到空闲状态)
• 支持高达 8 个结果 FIFO,可选择 FIFO 深度
• 可配置采样时间和转换速度/功率
• 转换完成标志和中断
• 可从多达 4 个源中选择输入时钟
• 在等待或 stop3 模式下运行,即可实现低噪声运行
• 异步时钟源,即可实现低噪声运行
• 可选异步硬件转换触发器
• 自动与可编程值进行比较(小于、大于或等于),根据结果生成中断
KE 系列中的 ADC 模块与 S08P 中的类似,唯一的差别在于,前者的寄存器可以在 32 位模式下访问。 可以在一个周
期内读取 ADC 12 位结果。 因此,它的速度比 S08P 要快得多。
以下代码段显示了如何初始化该 ADC,以及读取 ADC 处理器中的 ADC 结果寄存器:
void ADC_init(void)
{
/* The following code segment demonstrates how to initialize ADC by low-power mode, long
sample time, bus frequency, hardware triggered from AD1, AD3, AD5, and AD7 external pins
with 4-level FIFO enabled */
ADC_APCTL1 = ADC_APCTL1_ADPC6_MASK | ADC_APCTL1_ADPC5_MASK | ADC_APCTL1_ADPC3_MASK |
ADC_APCTL1_ADPC1_MASK;
ADC_SC3 = ADC_SC3_ADLPC_MASK | ADC_SC3_ADLSMP_MASK | ADC_SC3_MODE1_MASK;
// setting hardware trigger
ADC_SC2 = ADC_SC2_ADTRG_MASK ;
//4-Level FIFO
ADC_SC4 = ADC_SC4_AFDEP1_MASK | ADC_SC4_AFDEP0_MASK;
// dummy the 1st channel
ADC_SC1 = ADC_SC1_ADCH0_MASK;
// dummy the 2nd channel
ADC_SC1 = ADC_SC1_ADCH1_MASK | ADC_SC1_ADCH0_MASK;
// dummy the 3rd channel
ADCSC1 = ADCSC1_ADCH2_MASK | ADC_SC1_ADCH0_MASK;
// dummy the 4th channel and ADC starts conversion
ADC_SC1 = ADC_SC1_AIEN_MASK | ADC_SC1_ADCH2_MASK | ADC_SC1_ADCH1_MASK | ADC_SC1_ADCH0_MASK;
}
/* FIFO ADC interrupt service routine */
unsigned short buffer[4];
void ADC_isr(void)
{
/* The following code segment demonstrates read AD result FIFO */
// read conversion result of channel 1 and COCO bit is cleared
buffer[0] = ADCR;
// read conversion result of channel 3
buffer[1] = ADCR;
// read conversion result of channel 5
buffer[2] = ADCR;
// read conversion result of channel 7
buffer[3] = ADCR;
}
从 S08 到 Kinetis E 系列移植指南, Rev 0, 07/2013
22
Freescale Semiconductor, Inc.
参考
16 参考
•《KLQRUG:Kinetis L 外围模块快速参考》,可从以下网站获得: freescale.com
•《AN4347:将 S08AC 和 S08FL 系列中的应用移植到 S08PT 系列》,可从以下网站获得: freescale.com
•《AN4560:使用 Kinetis FlexTimer 进行 PWM 同步》,可从以下网站获得: freescale.com
•《Cortex -M0 设备常规用户指南》,可从以下网站获得: arm.com
17 术语表
ACMP
模拟比较器
BME
位操作引擎
CRC
循环冗余检查
DMA
直接内存访问
FMC
闪存控制器
IRC
内部参考时钟
PWT
脉冲宽度定时器
RTC
实时计数器
SWD
串行线调试
18 修订历史记录
修订版号
日期
0
07/2013
重要改动
首版
从 S08 到 Kinetis E 系列移植指南, Rev 0, 07/2013
Freescale Semiconductor, Inc.
23
How to Reach Us:
Home Page:
freescale.com
Web Support:
freescale.com/support
本文档中的信息仅供系统和软件实施方 使用飞思卡尔产品。 未包含基于
本文档信息设计或加工 任何集成电路的任何明确或隐含的版权许可授权。
飞思卡尔保留对此处任何产品进行更改的权利, 如有更改,恕不另行通
知。
飞思卡尔对其产品在任何特定用途方面的适用性不做任何担保、声明或保
证,也不承担因为应用 或使用产品或电路所产生的任何责任, 明确拒绝
承担包括但不局限于因果性或附带损害在内的所有责任。 飞思卡尔 数据
表和/或规格中所提供的“典型”参数在不同应用中可能 并且确实不同,
实际性能会随时间而有所变化。 所有工作参数, 包括“典型值”在内,
在每个 客户应用中必须经由客户的技术专家进行验证。 飞思卡尔未转让
与其专利权及其他 权利相关的许可。 飞思卡尔销售产品时 遵循以下网址
中包含的标准销售条款和条件: freescale.com/
SalesTermsandConditions 。
Freescale, Freescale logo, and Kinetis are trademarks of Freescale
Semiconductor, Inc., Reg. U.S. Pat. & Tm. Off. All other product or
service names are the property of their respective owners.
© 2013 飞思卡尔半导体有限公司
Document Number AN4757
Revision 0, 07/2013