forked from wanrenqi/PASII
1
0
Fork 0
PASII/CandeII_1.4/Driver/timer.c

247 lines
5.2 KiB
C
Raw Permalink Normal View History

#include "timer.h"
#include "delay.h"
static TIMER_CTRL_TYPE * TIMER_CTRL = ((TIMER_CTRL_TYPE *) TIMER_CTRL_BASE);
//<2F><>ʱ<EFBFBD><CAB1><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> timer_x<5F>Ļص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>timer_callback[x]
static void (*timer_callback[3])(void);
/*
<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>0 <EFBFBD><EFBFBD><EFBFBD>ú<EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
uint32_t interval <EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>ǵݼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> interval<EFBFBD><EFBFBD><EFBFBD>Ǽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
void * p_callback <EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>жϵĻص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>: 32.768KHz
*/
void timer_0_enable(uint32_t interval, void * p_callback)
{
if(TIMER_CTRL->TIMER_0_EN== 1)
{
TIMER_CTRL->TIMER_0_EN = 0;
delay_us(50); //<2F><>΢<EFBFBD><CEA2>ʱ ʹ<><CAB9>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>
}
TIMER_CTRL->TIMER_0_VAL = interval;
TIMER_CTRL->TIMER_0_RGLR = 1; //1:reload enable
TIMER_CTRL->TIMER_0_INT_MASK = 0; //1:mask int
timer_callback[0] = ((void (*)(void))p_callback);
TIMER_CTRL->TIMER_0_INT_CLR = 1;
NVIC_EnableIRQ(TIMER0_IRQn);
TIMER_CTRL->TIMER_0_EN = 1;
}
uint32_t timer_0_get_val(void)
{
return TIMER_CTRL->TIMER_0_CNT;
}
/*
<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>0 ʧ<EFBFBD>ܺ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>رն<EFBFBD>ʱ<EFBFBD><EFBFBD>0<EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
*/
void timer_0_disable(void)
{
TIMER_CTRL->TIMER_0_EN = 0;
NVIC_DisableIRQ(TIMER0_IRQn);
TIMER_CTRL->TIMER_0_INT_CLR = 1;
}
/*
<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>0 <EFBFBD><EFBFBD>ʱ cnt<EFBFBD><EFBFBD>32us<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λΪ<EFBFBD><EFBFBD>32us <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ cnt*32 us
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>uint32_t cnt ΢<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void timer_0_delay_32us(uint32_t cnt)
{
TIMER_CTRL->TIMER_0_VAL= cnt;
TIMER_CTRL->TIMER_0_INT_MASK = 1;
TIMER_CTRL->TIMER_0_INT_CLR = 1;
TIMER_CTRL->TIMER_0_EN = 1;
while(TIMER_CTRL->TIMER_0_INT_STATUS==0);
TIMER_CTRL->TIMER_0_EN = 0;
TIMER_CTRL->TIMER_0_INT_CLR = 1;
}
/*
<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>0 <EFBFBD>жϷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˻ص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void TIMER0_IRQHandler(void)
{
if(TIMER_CTRL->TIMER_0_INT_STATUS == 1)
{
TIMER_CTRL->TIMER_0_INT_CLR = 1;
if(timer_callback[0] != 0)
(*timer_callback[0])();
}
}
/*
<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>1 <EFBFBD><EFBFBD><EFBFBD>ú<EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
uint32_t interval <EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>ǵݼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> interval<EFBFBD><EFBFBD><EFBFBD>Ǽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
void * p_callback <EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>жϵĻص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>: 32.768KHz
*/
void timer_1_enable(uint32_t interval, void * p_callback)
{
if(TIMER_CTRL->TIMER_1_EN== 1)
{
TIMER_CTRL->TIMER_1_EN = 0;
delay_us(50);
}
TIMER_CTRL->TIMER_1_VAL= interval;
TIMER_CTRL->TIMER_1_RGLR= 1;
TIMER_CTRL->TIMER_1_INT_MASK = 0;
timer_callback[1] = ((void (*)(void))p_callback);
TIMER_CTRL->TIMER_1_INT_CLR = 1;
NVIC_EnableIRQ(TIMER1_IRQn);
TIMER_CTRL->TIMER_1_EN = 1;
}
uint32_t timer_1_get_val(void)
{
return TIMER_CTRL->TIMER_1_CNT;
}
/*
<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>1 ʧ<EFBFBD>ܺ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>رն<EFBFBD>ʱ<EFBFBD><EFBFBD>1<EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
*/
void timer_1_disable(void)
{
TIMER_CTRL->TIMER_1_EN = 0;
NVIC_DisableIRQ(TIMER1_IRQn);
TIMER_CTRL->TIMER_1_INT_CLR = 1;
}
/*
<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>1 <EFBFBD>жϷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˻ص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void TIMER1_IRQHandler(void)
{
if(TIMER_CTRL->TIMER_1_INT_STATUS == 1)
{
TIMER_CTRL->TIMER_1_INT_CLR = 1;
if(timer_callback[1] != 0)
(*timer_callback[1])();
}
}
/*
<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>2 <EFBFBD><EFBFBD><EFBFBD>ú<EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
uint32_t interval <EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>ǵݼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> interval<EFBFBD><EFBFBD><EFBFBD>Ǽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
void * p_callback <EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>жϵĻص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>: 32.768KHz
*/
void timer_2_enable(uint32_t interval, void * p_callback)
{
if(TIMER_CTRL->TIMER_2_EN== 1)
{
TIMER_CTRL->TIMER_2_EN = 0;
delay_us(50);
}
TIMER_CTRL->TIMER_2_VAL= interval;
TIMER_CTRL->TIMER_2_RGLR= 1;
TIMER_CTRL->TIMER_2_INT_MASK = 0;
timer_callback[2] = ((void (*)(void))p_callback);
TIMER_CTRL->TIMER_2_INT_CLR = 1;
NVIC_EnableIRQ(TIMER2_IRQn);
TIMER_CTRL->TIMER_2_EN = 1;
}
uint32_t timer_2_get_val(void)
{
return TIMER_CTRL->TIMER_2_CNT;
}
/*
<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>2 ʧ<EFBFBD>ܺ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>رն<EFBFBD>ʱ<EFBFBD><EFBFBD>2<EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
*/
void timer_2_disable(void)
{
TIMER_CTRL->TIMER_2_EN = 0;
NVIC_DisableIRQ(TIMER2_IRQn);
TIMER_CTRL->TIMER_2_INT_CLR = 1;
}
/*
<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>2 <EFBFBD>жϷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˻ص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void TIMER2_IRQHandler(void)
{
if(TIMER_CTRL->TIMER_2_INT_STATUS == 1)
{
TIMER_CTRL->TIMER_2_INT_CLR = 1;
if(timer_callback[2] != 0)
(*timer_callback[2])();
}
}
/****************************************<2A><><EFBFBD>ٶ<EFBFBD>ʱ<EFBFBD><CAB1>***************************************************/
static H_TIMER_CTRL_TYPE * H_TIMER_CTRL = ((H_TIMER_CTRL_TYPE *) H_TIMER_CTRL_BASE);
static void (*htimer_callback)(void);
/*************************************************************
<EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD>ʱ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ú<EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
uint16_t interval interval<EFBFBD><EFBFBD><EFBFBD>Ǽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
void * p_callback <EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>жϵĻص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>: 64M
**************************************************************/
void Htimer_enable(uint16_t interval, void (*p_callback)(void))
{
if(H_TIMER_CTRL->BUSY == 1)
{
H_TIMER_CTRL->STOP = 1;
}
H_TIMER_CTRL->ONE_TIME = 0;
H_TIMER_CTRL->COUNTER_TOP = interval;
H_TIMER_CTRL->PRESCALER = H_TIMER_PERSCALER_1;
htimer_callback = p_callback;
H_TIMER_CTRL->EVENT = 1; //clr Int
H_TIMER_CTRL->INTEN = 1;
NVIC_EnableIRQ(HTIMER_IRQn);
H_TIMER_CTRL->START = 1; //set H_TIMER_CTRL->BUSY
}
uint16_t Htimer_get_val(void)
{
return H_TIMER_CTRL->COUNTER;
}
/*************************************************************
<EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD>ʱ<EFBFBD><EFBFBD>ֹͣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
**************************************************************/
void Htimer_disable(void)
{
H_TIMER_CTRL->STOP = 1; //clr H_TIMER_CTRL->BUSY
while(H_TIMER_CTRL->BUSY);
}
/*************************************************************
<EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>жϷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˻ص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
**************************************************************/
void HTIMER_IRQHandler(void)
{
uint8_t status = (uint8_t)H_TIMER_CTRL->EVENT;
H_TIMER_CTRL->EVENT = 1; //clr Int
if(htimer_callback != 0)
{
htimer_callback();
}
}