【原创】在 Kinetis 系列器件上使用 DMA 和GPIO 模拟定时器功能
0赞
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 输出信号。
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。
计数器值与 GPIO 输出信号之间的关系如下图所示。上面的波形表示 PIT 计数过程,下面的波形为 GPIO 的输出波形。当 PIT 计数器值变为 0 时,翻转 GPIO 信号。另外,PIT 将加载 LDVAL 中的新计数器值并启动向下计数。DMA触发下一个 DMA ch5,而 DMA ch5 将更新新的计数器值至 LDVAL。
4 注意事项
这些设置具有一些限制。
1. PIT 生成 DMA 多路复用器的周期性触发事件的通道分配,如下表所示。
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 传输未被处理。
好了,这个功能就介绍到这里,要不要自己试试呢?