码迷,mamicode.com
首页 > 其他好文 > 详细

智能车学习(十九)——K60单片机定时中断学习

时间:2015-11-25 21:52:55      阅读:848      评论:0      收藏:0      [点我收藏+]

标签:

一、头文件

#ifndef _PIT_H_
#define _PIT_H_

extern uint32_t zero;

//定义定时器
typedef enum PITn
{
    PIT0,
    PIT1,
    PIT2,
    PIT3
} PITn;


void       pit_init(PITn, u32 cnt);                                                //初始化PITn,并设置定时时间(单位为bus时钟周期)
#define     pit_init_ms(PITn,ms)          pit_init(PITn,ms * bus_clk_khz);         //初始化PITn,并设置定时时间(单位为 ms)
#define     pit_init_us(PITn,us)          pit_init(PITn,us * bus_clk_khz/1000);    //初始化PITn,并设置定时时间(单位为 ms)

#define     PIT_Flag_Clear(PITn)          PIT_TFLG(PITn)|=PIT_TFLG_TIF_MASK        //清中断标志




void        pit_dma_init(PITn pitn, u32 cnt);
#define      pit_dma_init_ms(PITn,ms)     ASSERT( ((u64)(ms * bus_clk_khz)>>32)==0   );\
                                         pit_dma_init(PITn,ms * bus_clk_khz)

                                             
#define pit_get_cnt(pitn)  (~zero)-PIT_CVAL(pitn)
                                           
void pit_time_start(PITn pitn);

uint32_t pit_time_get(PITn pitn);

void pit_time_close(PITn pitn);


#endif  //_PIT_H_

 

二、源文件

#include "common.h"
#include  "PIT.h"     //周期中断计时器

/*************************************************************************
*  函数名称:pit_init
*  功能说明:PITn定时中断
*  参数说明:PITn        模块号(PIT0~PIT3)
             cnt         延时时间(单位为bus时钟周期)
*  函数返回:无
*************************************************************************/
void pit_init(PITn pitn, u32 cnt)
{
    //PIT 用的是 Bus Clock 总线频率
    //溢出计数 = 总线频率 * 时间

    /* 开启时钟*/
    SIM_SCGC6       |= SIM_SCGC6_PIT_MASK;                            //使能PIT时钟

    /* PIT模块控制 PIT Module Control Register (PIT_MCR) */
    PIT_MCR         &= ~(PIT_MCR_MDIS_MASK | PIT_MCR_FRZ_MASK );      //使能PIT定时器时钟 ,调试模式下继续运行

    /* 定时器加载值设置 Timer Load Value Register (PIT_LDVALn) */
    PIT_LDVAL(pitn)  = cnt;                                          //设置溢出中断时间

    //定时时间到了后,TIF 置 1 。写1的时候就会清0
    PIT_Flag_Clear(pitn);                                             //清中断标志位

    /* 定时器控制寄存器 Timer Control Register (PIT_TCTRL0) */
    PIT_TCTRL(pitn) |= ( PIT_TCTRL_TEN_MASK | PIT_TCTRL_TIE_MASK );   //使能 PITn定时器,并开PITn中断

    enable_irq(pitn + 68);                                            //开接收引脚的IRQ中断
}


/*************************************************************************
*  函数名称:pit_init
*  功能说明:PITn定时中断
*  参数说明:PITn        模块号(PIT0~PIT3)
             cnt         延时时间(单位为bus时钟周期)
*  函数返回:无
*************************************************************************/
void pit_dma_init(PITn pitn, u32 cnt)
{
    //PIT 用的是 Bus Clock 总线频率
    //溢出计数 = 总线频率 * 时间

    /* 开启时钟*/
    SIM_SCGC6       |= SIM_SCGC6_PIT_MASK;                            //使能PIT时钟

    /* PIT模块控制 PIT Module Control Register (PIT_MCR) */
    //PIT_MCR         &=~(PIT_MCR_MDIS_MASK | PIT_MCR_FRZ_MASK );       //使能PIT定时器时钟 ,调试模式下继续运行
    PIT_MCR = 0;

    /* 定时器加载值设置 Timer Load Value Register (PIT_LDVALn) */
    PIT_LDVAL(pitn)  = cnt;                                          //设置溢出中断时间

    //定时时间到了后,TIF 置 1 。写1的时候就会清0
    PIT_Flag_Clear(pitn);                                             //清中断标志位

    /* 定时器控制寄存器 Timer Control Register (PIT_TCTRL0) */
    PIT_TCTRL(pitn) |= (0
                        | PIT_TCTRL_TEN_MASK  //使能 PITn定时器
                        | PIT_TCTRL_TIE_MASK  //开PITn中断
                       );

    enable_irq(pitn + 68);                                            //开接收引脚的IRQ中断
}


void pit_time_start(PITn pitn)
{
    //PIT 用的是 Bus Clock 总线频率
    //溢出计数 = 总线频率 * 时间

    SIM_SCGC6       |= SIM_SCGC6_PIT_MASK;                          //使能PIT时钟

    PIT_MCR         &= ~(PIT_MCR_MDIS_MASK | PIT_MCR_FRZ_MASK );    //使能PIT定时器时钟 ,调试模式下继续运行

    PIT_TCTRL(pitn) &= ~( PIT_TCTRL_TEN_MASK );                     //禁用PIT ,以便设置加载值生效

    PIT_LDVAL(pitn)  = ~zero;                                          //设置溢出中断时间

    PIT_Flag_Clear(pitn);                                           //清中断标志位

    PIT_TCTRL(pitn) &= ~ PIT_TCTRL_TEN_MASK;                        //禁止PITn定时器(用于清空计数值)
    PIT_TCTRL(pitn)  = ( 0
                         | PIT_TCTRL_TEN_MASK                        //使能 PITn定时器
                         //| PIT_TCTRL_TIE_MASK                      //开PITn中断
                       );
}

 

三、小结

智能车学习(十九)——K60单片机定时中断学习

标签:

原文地址:http://www.cnblogs.com/BlueMountain-HaggenDazs/p/4995741.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!