标签:
一、头文件
#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中断 ); }
三、小结
标签:
原文地址:http://www.cnblogs.com/BlueMountain-HaggenDazs/p/4995741.html