【原创】在 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 传输未被处理。
好了,这个功能就介绍到这里,要不要自己试试呢?