// 定时器驱动
// 杭州秒寻科技有限公司
// 周涛
// 2023-09-14

#include "includes.h"

// 3号定时器
static uint32 g_dwTimer3Ticks = 0; // 定时器滴答计数器

// 初始化定时器(500毫秒溢出一次)，使用3号通用定时器，该定时器给所有应用层提供定时时钟
void driver_timer_timer3_init()
{
    TIM_TimeBaseInitTypeDef stTimer = {0};
    NVIC_InitTypeDef stNvic = {0};

    // 使能定时器时钟（APB1时钟为61.44MHz）
    RCC_APB1PeriphClockCmd(DRIVER_TIM_BASE_TIME_CLK, ENABLE);

    // 初始化定时器
    TIM_DeInit(DRIVER_TIM_BASE_TIME_NO);
    stTimer.TIM_Prescaler = 6144 - 1;             // 分频系数，10000(10kHz) = 61440000/6144，每个周期100us
    stTimer.TIM_Period = 5000 - 1;                // 重装寄存器，表示计数次数，500ms = 5000 * 100us
    stTimer.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数，计到最大值后产生中断
    TIM_TimeBaseInit(DRIVER_TIM_BASE_TIME_NO, &stTimer);

    // 开启定时器中断
    TIM_ITConfig(DRIVER_TIM_BASE_TIME_NO, TIM_IT_Update, ENABLE);

    // 配置NVIC
    stNvic.NVIC_IRQChannel = DRIVER_TIM_BASE_TIME_IRQn;
    stNvic.NVIC_IRQChannelCmd = ENABLE;
    stNvic.NVIC_IRQChannelPreemptionPriority = 1; // 抢占优先级
    stNvic.NVIC_IRQChannelSubPriority = 0;        // 响应优先级
    NVIC_Init(&stNvic);

    // 使能定时器3
    TIM_Cmd(DRIVER_TIM_BASE_TIME_NO, ENABLE);

    return;
}

// 定时器3的中断服务入口（500毫秒进一次中断）
void TIM3_IRQHandler(void)
{
    if (TIM_GetITStatus(DRIVER_TIM_BASE_TIME_NO, TIM_IT_Update) == SET)
    {
        // 时基计数器加1
        g_dwTimer3Ticks++;

        TIM_ClearITPendingBit(DRIVER_TIM_BASE_TIME_NO, TIM_IT_Update); // 清除中断标识符
    }

    return;
}

// 获得计数器滴答值
void driver_timer_timer3_get_ticks(uint32 *pdwTicks)
{
    *pdwTicks = g_dwTimer3Ticks;

    return;
}