garfield

【原创】在 Kinetis 系列器件上使用 DMA 和GPIO 模拟定时器功能

0
阅读(3228)

 

    arm是一个非常优秀的处理器,而飞思卡尔是一家非常优秀的半导体及解决方案供应商,当二者相结合的时候就迸发出了创新的火花,飞思卡尔kinetis是一些列非常优秀的处理器,本品博文介绍在kinetis 系列处理器上使用DMA和GPIO模拟定时器的功能。

    Freescale Kinetis 器件现已包含多个定时器外设。例如,MK 器件包含 3 个 FTM 模块(8ch、2ch、2ch)、1 个 RTC、PIT 通道、CMT 和LPTMR。即便已经具备以上这些丰富的定时器资源,而在实际的应用中还需要更多额外的定时器。

本例需要以下准备工作:

1 TWR-K40X256

2 IAR Embedded Workbench v6.10.1

现在开始:

1 特性介绍

· 时钟

· 时钟可由 1ch PIT、1ch DMA 和 GPIO 引脚生成

· 时钟占空比为 50%。

· 时钟最大频率为 PIT 计数器频率的二分之一。(PIT 最大频率为总线时钟频率)。

· PWM

PWM 可由 1ch PIT、2ch DMA 和 GPIO 引脚生成

· PWM 占空比可在 0%至 100%之间变化。当占空比为 0%时,GPIO 输出为 L;当占空比为 100%时,GPIO输出为 H

2 时钟设置

2.1 初始化

用户需要按照下述步骤初始化各模块:

1. GPIO

· 在引脚控制寄存器(PCR)中打开 PORTx CLOCK,并使能引脚的中断功能。将引脚 Mux 设置使能为 GPIO功能。将中断配置设置为触发上升或下降沿上的 DMA 请求。

· 设置端口数据方向,PDDR 为输出,飞思卡尔惯例1入0出。

2. PIT

· 启动 PIT 时钟。置位 PIT 模块控制寄存器 MDIS 位。MDIS 为禁用模块。用于禁用模块时钟。必须在执行任何其他设置之前使能该位。

· 设置 LDVAL 寄存器初始值。载入该寄存器中的 PIT 计数器值。

3. DMA

· 打开 DMA Mux 时钟。

· 设置 DMAMUX 通道配置寄存器。将 SOURCE 位段配置为要访问的 GPIO 的端口号。

· 按照如下所示设置传输控制描述符:

· saddr:GPIO 输出端口位配置信息存放地址。

· daddr:GPIO 端口值翻转寄存器地址。

· nbyte:4

· tcdAtter:ssize 和 dsize 均为 2

· channelno:0

· 置位 DMA 使能请求寄存器

2.2 启动顺序

启动 PIT 定时器。

PIT 计数器变为 0 时,PIT 触发 DMA。PIT 计数器加载 LDVALn 寄存器。

DMA 翻转 GPIO 输出信号。可通过访问 PTOR 寄存器翻转 GPIO 输出信号。

自动重复步骤 2 和 3。

下表为过程概述。PIT 为已使用的通道 0(ch0),DMA 为已使用的 ch0。PIT chn 将触发 DMA chn。如果 PIT 计数器

值变为 0,则 PIT 将触发 DMA 并加载 LDVAL 的计数器值。DMA 将翻转 GPIO 输出信号。

image

3 PWM设置

3.1 初始化

用户需要按照下述步骤初始化各模块:

1. GPIO

· 设置引脚控制寄存器(PCR)的引脚复用控制和中断配置。将引脚复用设置为 GPIO 功能。将中断配置设置为任一边沿上的 DMA 请求。

· 设置端口数据方向为输出,PDDR。

2. PIT

· 启动 PIT 时钟

· 置位 PIT 模块控制寄存器 MDIS 位。MDIS 为禁用模块,用于禁用模块时钟。必须在对 PIT 模块执行任何其他设置之前使能该位。

· 设置初始 LDVAL 寄存器值。载入该寄存器中的 PIT 计数器值。

3. DMA

· 启动 DMA 多路复用器时钟。

· 设置 DMA 多路复用器通道配置寄存器。将 SOURCE 位段配置为要访问的 GPIO 的端口号。

· 按照下述步骤设置传输控制描述符:

· tcd0

· saddr:GPIO 输出端口位配置信息存放地址。

· daddr:GPIO 端口值翻转寄存器地址。

· nbyte:4

· tcdAtter:ssize 和 dsize 均为 2

· csr:设置链路通道为 tcd1

· channelno:0~4

· tcd1

· saddr:下一个 PIT 计数器值地址。

· daddr:PIT LDVAL 地址的地址。

· nbyte:4

· tcdAtter:ssize 和 dsize 均为 2

· soff:4

· slast:-8

· loopcount:2

· channelno:5~

· 置位 DMA 使能请求寄存器

3.2 启动过程

1. 启动 PIT 定时器。

2. PIT 计数器变为 0 时,PIT 触发 DMA。PIT 计数器加载 LDVALn 寄存器。

3. DMA 翻转 GPIO 输出信号。可通过访问 PTOR 寄存器翻转 GPIO 输出信号。该 DMA 与其他 DMA 链接在一

起,因此,将会触发下一个 DMA,以载入新的 LDVALn 寄存器值。

4. 下一个 DMA 将新的值存储到 LDVALn 寄存器中。然后,用户将 2 个 32bit 的字依次传递到 PIT 的 LDVAL 寄

存器中作为向下计数的值。在奇数循环中,第一个字存储在 LDVAL 寄存器中,在偶数循环中,第二个字存储

在 LDVAL 寄存器中。

5. 重复步骤 2 至 4。

image

计数器值与 GPIO 输出信号之间的关系如下图所示。上面的波形表示 PIT 计数过程,下面的波形为 GPIO 的输出波形。当 PIT 计数器值变为 0 时,翻转 GPIO 信号。另外,PIT 将加载 LDVAL 中的新计数器值并启动向下计数。DMA触发下一个 DMA ch5,而 DMA ch5 将更新新的计数器值至 LDVAL。

image

4 注意事项

这些设置具有一些限制。

1. PIT 生成 DMA 多路复用器的周期性触发事件的通道分配,如下表所示。

image

2. 如果 PWM 占空比设为 0 或 100%,则存在一些尖峰信号。

3. 每个 GPIO 端口的 GPIO 输出引脚数为 1。不允许 1 个端口存在 2 个输出引脚。因为 GPIO 只接受 1 个 DMA触发器。

4. 最大频率为 PIT 频率的一半。但是,当 CPU 频率为 100MHz、总线频率为 50MHz、PIT 频率为 50MHz 时,频率可高达 1.5MHz。

5. 抖动:如果将 LDVAL 设置为小于 30,则约为 300nsec。

使用这些功能时,请注意以下建议:

1. 为了获得最佳效果,不允许有其他的 DMA 传输,或者对 GPIO/Peripheral Bridge 1 进行写入操作。此外,如果正在传输 SRAMU 的 DMA,则任何 CPU 或其他主机 RAM 访问将限制为 SRAML,反之亦然。

2. 如果无法满足以上条件,则在执行诸如以上之类的访问之前,软件应检查 PIT 计数寄存器,以确保不会在执行所需访问过程中挂起的 DMA 传输未被处理。

 

好了,这个功能就介绍到这里,要不要自己试试呢?