freetech

kinetis的FTM例程——定时器模计数(查询方式)

0
阅读(3367)

kinetis有好几种定时器,FTM是功能比较多的一种。我们先来用其模计数功能实现昨天的跑马灯功能。同样在使用FTM之前要先配置系统集成模块,打开FTM的时钟。下面介绍相关寄存器:

FTMx_MODE - 模式寄存器。

FTMx_SC - 状态和控制寄存器,设置时钟源、分频系数等。

FTMx_CNTIN - 计数初值寄存器,当溢出时从该值开始下一轮计数。

FTMx_CNT - 计数寄存器。

FTMx_MOD - 模寄存器,当计数到该值时,溢出寄存器置位,如果使能了溢出中断,将进入溢出中断服务程序。

下面是完整代码:

/*
* main implementation: use this 'C' sample to create your own application
*
*/

#define GPIO_PIN_MASK            0x3C000000
#define GPIO_PIN(x)                ((1<<x)&GPIO_PIN_MASK)

#include <stdio.h>

#include "derivative.h" /* include peripheral declarations */

void delay()
{
    int i =0;
    int j=0;
    for(i=0;i<3000;i++)
      for(j=0;j<1000;j++)
          asm("nop");
}
void GPIO_Init()
{
    SIM_SCGC5 = SIM_SCGC5_PORTA_MASK | SIM_SCGC5_PORTB_MASK | SIM_SCGC5_PORTC_MASK | SIM_SCGC5_PORTD_MASK | SIM_SCGC5_PORTE_MASK;
    /* Set GPIOA pin26~29 as GPIO*/
    PORTA_PCR26=(PORT_PCR_MUX(1));
    PORTA_PCR27=(PORT_PCR_MUX(1));
    PORTA_PCR28=(PORT_PCR_MUX(1));
    PORTA_PCR29=(PORT_PCR_MUX(1));
    //set GPIOA pin26~29 to be output
    GPIOA_PDDR=GPIO_PDDR_PDD(GPIO_PIN(26))
         | GPIO_PDDR_PDD(GPIO_PIN(27))
         | GPIO_PDDR_PDD(GPIO_PIN(28))
         | GPIO_PDDR_PDD(GPIO_PIN(29));
    GPIOA_PDOR = 0;//所有LED灭
}
void FTM0_Init()
{
    SIM_SCGC6 |= (uint32_t)0x01000000UL;
    FTM0_MODE = (uint32_t)0x04UL;
    FTM0_SC = (uint32_t)0x00UL;
    FTM0_CNTIN = (uint32_t)0x00UL;//初值值0
    FTM0_CNT = (uint32_t)0x00UL;//计数值0
    FTM0_MOD = (uint32_t)50000;//模50000
    FTM0_SC = (uint32_t)0x0FUL;//系统时钟,128分频
}
int main(void)
{
    static int counter = 26;
    FTM0_Init();
    GPIO_Init();
    printf("Hello (Kinetis) World in 'C' from PK60X256 derivative! \n\r");
    for(;;)
    {
        if( (FTM0_SC&0x80)!=0 )
        {
            FTM0_SC &= ~0x80;
            GPIOA_PDOR = GPIO_PDOR_PDO(GPIO_PIN(counter));
            counter++;
            if(counter > 29)
            {
                counter = 26;
            }
        }
    }
    return 0;
}

效果如下:D6->D3依次点亮

图片 005

图片 002

图片 003

图片 004