PWM例程__MK20DX128VLH5_K20系列

/* cpu:MK20DX128VLH5  */

#include "MK20D5.h"

void PWMInit(void);
void GPIOInit(void);

int main(void)
{
    //时钟初始化在“systm_MK20D5.c”中配置为8M
    GPIOInit();
    PWMInit();  
    while(1)
    {
    }
}

void GPIOInit(void)
{
    SIM->SCGC5 |= SIM_SCGC5_PORTC_MASK | SIM_SCGC5_PORTD_MASK;  //开端口时钟门控

    //PC.3、PD.4配置为普通IO口
    PORTC->PCR[3] &= ~PORT_PCR_MUX_MASK;
    PORTC->PCR[3] |= PORT_PCR_MUX(1);
    PORTD->PCR[4] &= ~PORT_PCR_MUX_MASK;
    PORTD->PCR[4] |= PORT_PCR_MUX(1);

    PTC->PDDR |= 1 << 3;            //PC.3输出
    PTD->PDDR |= 1 << 4;            //PD.4输出

    PTC->PSOR |= 1 << 3;            //PC.3 = 1,初始化为高
    PTD->PSOR |= 1 << 4;            //PD.4 = 1,初始化为高
}

/* FTM0_CH7配置为边界对齐PWM,对应管教PA.2,周期2ms,占空比1/4 */
void PWMInit(void)  
{
    SIM->SCGC5 |= SIM_SCGC5_PORTA_MASK; 
    PORTA->PCR[2] &= ~PORT_PCR_MUX_MASK;
    PORTA->PCR[2] |= PORT_PCR_MUX(3);   //管脚功能FTM0_CH2

    SIM->SCGC6 |= SIM_SCGC6_FTM0_MASK;  //开FTM0门控

    /* disable FTM, we must set CLKS(0) before config FTM! */
    FTM0->SC = 0;

    FTM0->MODE |= FTM_MODE_WPDIS_MASK; //清除写保护

    FTM0->CNT = 0;
    FTM0->CNTIN = 0;
    FTM0->MOD = 2000 - 1;           //PWM周期,对应定时器时钟设置为1M,则PWM周期设置为2ms
                                    //The EPWM period is determined by (MOD - CNTIN + 0x0001) and 
                                    //the pulse width(duty cycle) is determined by (CnV - CNTIN).

    /* set LOCK bit to load MOD value */
    FTM0->PWMLOAD = 0xFFFFFFFF;         //有没有这句话貌似没影响

    FTM0->SC &= ~FTM_SC_CLKS_MASK;
    FTM0->SC |= FTM_SC_CLKS(1);         //时钟源选择sytemclock

    FTM0->SC &= ~FTM_SC_PS_MASK;
    FTM0->SC |= FTM_SC_PS(3);           //8分频,主频为8M,这样定时器时钟为1M

    //配置为边界对齐模式:QUADEN = 0, DECAPEN = 0, COMBINE = 0, CPWNS = 0, MSnB =1    ,ELSB=1/ELSA=1
    FTM0->CONTROLS[7].CnSC &= ~FTM_CnSC_MSA_MASK;
    FTM0->CONTROLS[7].CnSC |= FTM_CnSC_MSB_MASK;    
    FTM0->CONTROLS[7].CnSC &= ~FTM_CnSC_ELSA_MASK;
    FTM0->CONTROLS[7].CnSC |= FTM_CnSC_ELSB_MASK;

    FTM0->OUTINIT |= FTM_OUTINIT_CH7OI_MASK;    //通道输出初始化为高
    FTM0->OUTMASK &= ~FTM_OUTMASK_CH7OM_MASK;  //Channel output is not masked. It continues to operate normally.   

    FTM0->CONTROLS[7].CnV = 500;    //脉宽设置,硬件仿真显示此句不能直接放在语句“FTM0->MOD = 2000 - 1;”之后,不然没有输出

    //中断设置
    FTM0->SC |= FTM_SC_TOIE_MASK;   //使能溢出中断
    NVIC_EnableIRQ(FTM0_IRQn);
}

/* 中断响应 */
void FTM0_IRQHandler(void)
{
    FTM0->SC &= ~FTM_SC_TOF_MASK;  //清中断TOF位,写0清除,写1没有影响
    PTC->PTOR |= 1 << 3;    //翻转PC.3
    PTD->PTOR |= 1 << 4;    //翻转PD.4
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值