PASII/CandeII_1.4/Driver/timer.c

247 lines
5.2 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "timer.h"
#include "delay.h"
static TIMER_CTRL_TYPE * TIMER_CTRL = ((TIMER_CTRL_TYPE *) TIMER_CTRL_BASE);
//定时器回调函数定义 timer_x的回调函数是timer_callback[x]
static void (*timer_callback[3])(void);
/*
定时器0 配置函数
参数:
uint32_t interval 定时器是递减计数器 interval就是计数器初值
void * p_callback 定时器中断的回调函数
定时器时钟: 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); //稍微延时 使定时器重启成功
}
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;
}
/*
定时器0 失能函数 关闭定时器0的中断
*/
void timer_0_disable(void)
{
TIMER_CTRL->TIMER_0_EN = 0;
NVIC_DisableIRQ(TIMER0_IRQn);
TIMER_CTRL->TIMER_0_INT_CLR = 1;
}
/*
定时器0 延时 cnt个32us函数单位为32us 总延时 cnt*32 us
参数uint32_t cnt 微秒数
*/
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;
}
/*
定时器0 中断服务函数 这里调用了回调函数
*/
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])();
}
}
/*
定时器1 配置函数
参数:
uint32_t interval 定时器是递减计数器 interval就是计数器初值
void * p_callback 定时器中断的回调函数
定时器时钟: 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;
}
/*
定时器1 失能函数 关闭定时器1的中断
*/
void timer_1_disable(void)
{
TIMER_CTRL->TIMER_1_EN = 0;
NVIC_DisableIRQ(TIMER1_IRQn);
TIMER_CTRL->TIMER_1_INT_CLR = 1;
}
/*
定时器1 中断服务函数 这里调用了回调函数
*/
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])();
}
}
/*
定时器2 配置函数
参数:
uint32_t interval 定时器是递减计数器 interval就是计数器初值
void * p_callback 定时器中断的回调函数
定时器时钟: 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;
}
/*
定时器2 失能函数 关闭定时器2的中断
*/
void timer_2_disable(void)
{
TIMER_CTRL->TIMER_2_EN = 0;
NVIC_DisableIRQ(TIMER2_IRQn);
TIMER_CTRL->TIMER_2_INT_CLR = 1;
}
/*
定时器2 中断服务函数 这里调用了回调函数
*/
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])();
}
}
/****************************************高速定时器***************************************************/
static H_TIMER_CTRL_TYPE * H_TIMER_CTRL = ((H_TIMER_CTRL_TYPE *) H_TIMER_CTRL_BASE);
static void (*htimer_callback)(void);
/*************************************************************
高速定时器 配置函数
参数:
uint16_t interval interval就是计数器向上计数的最大值
void * p_callback 定时器中断的回调函数
定时器时钟: 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;
}
/*************************************************************
高速定时器停止函数
**************************************************************/
void Htimer_disable(void)
{
H_TIMER_CTRL->STOP = 1; //clr H_TIMER_CTRL->BUSY
while(H_TIMER_CTRL->BUSY);
}
/*************************************************************
高速定时器中断服务函数 这里调用了回调函数
**************************************************************/
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();
}
}