/*
 * tim.c
 *
 *  Created on: 2024年6月22日
 *      Author: psx
 */

#include "tim.h"
#include "timeSliceOffset.h"
#include "pwm.h"

/* 时间基准为1ms，1ms切换一次任务 */
#define delayms 1

void TIM3_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));

void TIM3_Init(void)
{
    /* 分频系数 */
    uint16_t psc = (SystemCoreClock / 10000) - 1;
    /* 分频系数 */
    uint16_t arr = delayms * 10 - 1;

    TIM3_Int_Init(arr, psc);
}

void TIM3_Int_Init(uint16_t arr, uint16_t psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    RCC_PB1PeriphClockCmd(RCC_PB1Periph_TIM3, ENABLE); //使能TIM3时钟

    TIM_TimeBaseStructure.TIM_Period = arr;   //指定下次更新事件时要加载到活动自动重新加载寄存器中的周期值。
    TIM_TimeBaseStructure.TIM_Prescaler =psc; //指定用于划分TIM时钟的预分频器值。
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;     //时钟分频因子
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM计数模式，向上计数模式
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位

    TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE ); //使能TIM3中断，允许更新中断

    //初始化TIM NVIC，设置中断优先级分组
    NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;           //TIM3中断
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //设置抢占优先级0
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;        //设置响应优先级3
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;           //使能通道1中断
    NVIC_Init(&NVIC_InitStructure); //初始化NVIC

    TIM_Cmd(TIM3, ENABLE); //TIM3使能
}

void TIM3_IRQHandler(void)
{
//    static float duty_ratio = 0;
//    static int flag = 1;
//    static int flag1 = 0;
    if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) { //检查TIM3中断是否发生。
        TIM_ClearITPendingBit(TIM3, TIM_IT_Update);    //清除TIM3的中断挂起位。
        TimeSliceOffset_Produce();
//        flag1++;
//        if (flag1 == 20) {
//            if (flag) {
//                duty_ratio += 0.005;
//                if (duty_ratio > 1) {
//                    flag = !flag;
//                }
//            } else {
//                duty_ratio -= 0.005;
//                if (duty_ratio < 0) {
//                    flag = !flag;
//                }
//            }
//            flag1 = 0;
//            Set_duty_ratio(duty_ratio);
//            printf(" TIM3_IRQHandler \n");
//        }
    }
}

