forked from wanrenqi/PASII
247 lines
5.2 KiB
C
247 lines
5.2 KiB
C
|
#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();
|
|||
|
}
|
|||
|
}
|
|||
|
|