/*
* TrmerM.c
*
* Created on: 2024�?2�?21�?
*/
#include <stdint.h>
// #include "gpio.h"
// #include "timm.h"
// #include "isr.h"
#include "TrmerM.h"
typedef struct
{
TIMERM_PWM_Counter_en_t counter; //定时器选择
}Display_mode_Struct;
/*-------------------PWM相关-------------------------------------*/
// extern void TimerB_PWM_Init(void);
// extern uint8_t TimerB_PWM_Channel_Init(TIMERB_Channel_en_t enTimerBChannel, TIMERB_Clock_en_t enTimerBClock, TIMERB_Polarity_en_t enTimerBPolarity);
// extern uint32_t TimerB_PWM_Channel_Fre_Set(TIMERB_Channel_en_t enTimerBChannel, uint16_t u16Fre, uint16_t u16Duty);
// /*占空比精度千分之一*/
// extern void TimerB_PWM_Channel_Duty_Set(TIMERB_Channel_en_t enTimerBChannel, uint16_t u16Duty);
// extern void TimerB_PWM_Channel_Start(TIMERB_Channel_en_t enTimerBChannel);
// /*调用该函数后,仅重新调用开始函数功能即可正常使�?*/
// extern void TimerB_PWM_Channel_Stop(TIMERB_Channel_en_t enTimerBChannel);
// /*仅休眠时可调用,调用该函数后需要重新初始化相关通道才可以正常使用�?*/
// extern void TimerB_PWM_Channel_Sleep(TIMERB_Channel_en_t enTimerBChannel);
TMM_InitTypeDef TIMM_InitStructure[2] = {0};
static uint32_t cycle_pulse[2]; //一个周期的时钟�? //频率
static uint32_t high_level_Pulse[2][3]; //高电平时钟数 //占空�?
static uint32_t pwm_duty[2][3];
/**
* @brief 设置TimerM的定时器x的模式为比较输出
*
* @param counter 定时�?
* @param freq 比较输出频率
* @return uint8_t 返回0成功,非0失败
*/
uint8_t TimerM_PWM_counter_Output_Init(TIMERM_PWM_Counter_en_t counter, uint16_t freq, uint32_t PWM_Clock)//, uint32_t PWM_Clock //SystemCoreClock
{
if (counter == TIMERM_COUNTER0)
{
TIMM_InitStructure[counter].TMM_Select = TMM0;
TIMM_InitStructure[counter].TMM_Channel = TMM_Channel_A|TMM_Channel_B|TMM_Channel_C|TMM_Channel_D;
TIMM_InitStructure[counter].TMM_Mode = TMM_Mode_PWM;
TIMM_InitStructure[counter].TMM_CounterClear = TM_Clear_Match_TMGRA; //when TM is matched with TMGRA, TM0 is cleared
TIMM_InitStructure[counter].TMM_Intp = TMM_Int_NONE; ///compare match interrupt enable A (IMIEA)
}
else if (counter == TIMERM_COUNTER1)
{
TIMM_InitStructure[counter].TMM_Select = TMM1;
TIMM_InitStructure[counter].TMM_Channel = TMM_Channel_A|TMM_Channel_B;//|TMM_Channel_C|TMM_Channel_D;
TIMM_InitStructure[counter].TMM_Mode = TMM_Mode_PWM;
TIMM_InitStructure[counter].TMM_CounterClear = TM_Clear_Match_TMGRA; //when TM is matched with TMGRA, TM0 is cleared
TIMM_InitStructure[counter].TMM_Intp = TMM_Int_NONE; ///compare match interrupt enable A (IMIEA)
}
else
{
return 1;
}
// TIMM_InitStructure[counter].TMM_Channel = TMM_Channel_A|TMM_Channel_B|TMM_Channel_C|TMM_Channel_D;
// TIMM_InitStructure[counter].TMM_Mode = TMM_Mode_PWM;
// TIMM_InitStructure[counter].TMM_CounterClear = TM_Clear_Match_TMGRA; //when TM is matched with TMGRA, TM0 is cleared
// TIMM_InitStructure[counter].TMM_Intp = TMM_Int_IMIA; ///compare match interrupt enable A (IMIEA)
if (freq > 2000)
{
TIMM_InitStructure[counter].TMM_Clk = TMM_FCLK_Div1; // specify the operation clk of tim
cycle_pulse[counter] = PWM_Clock / freq;
}
// else if(freq >= 500)
// {
// TIMM_InitStructure[counter].TMM_Clk = TMM_FCLK_Div8; // specify the operation clk of tim
// cycle_pulse[counter] = PWM_Clock / 8 / freq;
// }
else if(freq >= 50)
{
TIMM_InitStructure[counter].TMM_Clk = TMM_FCLK_Div32; // specify the operation clk of tim
cycle_pulse[counter] = PWM_Clock / 32 / freq;
}
else
{
return 1;
}
TIMM_InitStructure[counter].TMM_CHA_Pulse = cycle_pulse[counter] & 0x0FFFF;//这里需要计算,调试�? period; //周期设置为period
// TMM_Init(&TIMM_InitStructure[counter]);
// if (counter == TIMERM_COUNTER0)
// {
// TMM0_Start(ENABLE);
// }
// else if (counter == TIMERM_COUNTER1)
// {
// TMM1_Start(ENABLE);
// }
return 0;
}
//uint8_t TimerM_PWM_counter_Output_Init(TIMERM_PWM_Counter_en_t counter, uint16_t freq)//, uint32_t PWM_Clock //SystemCoreClock
//{
// SystemCoreClock = 64000000UL;
//
// if (counter == TIMERM_COUNTER0)
// {
// TIMM_InitStructure[counter].TMM_Select = TMM0;
//
// TIMM_InitStructure[counter].TMM_Channel = TMM_Channel_B|TMM_Channel_C|TMM_Channel_D;
// TIMM_InitStructure[counter].TMM_Mode = TMM_Mode_PWM;
// TIMM_InitStructure[counter].TMM_CounterClear = TM_Clear_Match_TMGRA; //when TM is matched with TMGRA, TM0 is cleared
// TIMM_InitStructure[counter].TMM_Intp = TMM_Int_IMIA; ///compare match interrupt enable A (IMIEA)
// }
// else if (counter == TIMERM_COUNTER1)
// {
// TIMM_InitStructure[counter].TMM_Select = TMM1;
// TIMM_InitStructure[counter].TMM_Channel = TMM_Channel_B;
// TIMM_InitStructure[counter].TMM_Mode = TMM_Mode_PWM;
// TIMM_InitStructure[counter].TMM_CounterClear = TM_Clear_Match_TMGRA; //when TM is matched with TMGRA, TM0 is cleared
// TIMM_InitStructure[counter].TMM_Intp = TMM_Int_IMIA; ///compare match interrupt enable A (IMIEA)
// }
// else
// {
// return 1;
// }
//
//// TIMM_InitStructure[counter].TMM_Channel = TMM_Channel_A|TMM_Channel_B|TMM_Channel_C|TMM_Channel_D;
//// TIMM_InitStructure[counter].TMM_Mode = TMM_Mode_PWM;
//// TIMM_InitStructure[counter].TMM_CounterClear = TM_Clear_Match_TMGRA; //when TM is matched with TMGRA, TM0 is cleared
//// TIMM_InitStructure[counter].TMM_Intp = TMM_Int_IMIA; ///compare match interrupt enable A (IMIEA)
//
// if (freq > 2000)
// {
// TIMM_InitStructure[counter].TMM_Clk = TMM_FCLK_Div1; // specify the operation clk of tim
// cycle_pulse[counter] = SystemCoreClock / freq;
// }
// // else if(freq >= 500)
// // {
// // TIMM_InitStructure[counter].TMM_Clk = TMM_FCLK_Div8; // specify the operation clk of tim
// // cycle_pulse[counter] = SystemCoreClock / 8 / freq;
// // }
// else if(freq >= 50)
// {
// TIMM_InitStructure[counter].TMM_Clk = TMM_FCLK_Div32; // specify the operation clk of tim
// cycle_pulse[counter] = SystemCoreClock / 32 / freq;
// }
// else
// {
// return 1;
// }
//
// TIMM_InitStructure[counter].TMM_CHA_Pulse = cycle_pulse[counter] & 0x0FFFF;//这里需要计算,调试�? period; //周期设置为period
//
//
//
// // TMM_Init(&TIMM_InitStructure[counter]);
// // if (counter == TIMERM_COUNTER0)
// // {
// // TMM0_Start(ENABLE);
// // }
// // else if (counter == TIMERM_COUNTER1)
// // {
// // TMM1_Start(ENABLE);
// // }
// return 0;
//}
/**
* @brief 设置timerM定时器x通道x的占空比
*
* @param counter 定时�?
* @param ch 通道
* @param duty 占空�? xxxx/1000 千分�?
* @param ActiveLevel 0负占空比 1正占空比
* @return uint8_t 返回0成功,非0失败
*/
uint8_t TimerM_PWM_CH_Output_init(TIMERM_PWM_Counter_en_t counter, TIMERM_PWM_Channel_en_t ch,TIMERM_PWM_ActiveLevel_en_t ActiveLevel)
{
GPIO_InitTypeDef GPIO_InitStruct;
switch (ch)
{
case TIMERM_CHB:
TIMM_InitStructure[counter].TMM_CHB_Pulse = ((cycle_pulse[counter]) ) & 0x0FFFF; //TM计数达到TMGRB. 占空�?:duty2/period
TIMM_InitStructure[counter].TMM_PWM.TMM_CHB.TMM_PWMInitLevel = TMM_PWMInitLevel_High;
TIMM_InitStructure[counter].TMM_PWM.TMM_CHB.TMM_PWMActiveLevel = ActiveLevel;
if (counter == TIMERM_COUNTER0)
{
GPIO_PinAFConfig(GPIO_PORT1,GPIO_Pin_4,GPIO_P14,GROUP_AF_ODEFAULT); //P14 used as TMIOB0 output(default function)
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4 ;
}
else if (counter == TIMERM_COUNTER1)
{
GPIO_PinAFConfig(GPIO_PORT1,GPIO_Pin_0,GPIO_P10,GROUP_AF_ODEFAULT); //P14 used as TMIOB1 output(default function)
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 ;
}
break;
case TIMERM_CHC:
TIMM_InitStructure[counter].TMM_CHC_Pulse = ((cycle_pulse[counter]) ) & 0x0FFFF; //TM计数达到TMGRC. 占空�?:duty2/period
TIMM_InitStructure[counter].TMM_PWM.TMM_CHC.TMM_PWMInitLevel = TMM_PWMInitLevel_High;
TIMM_InitStructure[counter].TMM_PWM.TMM_CHC.TMM_PWMActiveLevel = ActiveLevel;
if (counter == TIMERM_COUNTER0)
{
GPIO_PinAFConfig(GPIO_PORT1,GPIO_Pin_6,GPIO_P16,GROUP_AF_ODEFAULT); //P16 used as TMIOC0 output(default function)
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
}
else if (counter == TIMERM_COUNTER1)
{
/* code */
}
break;
case TIMERM_CHD:
TIMM_InitStructure[counter].TMM_CHD_Pulse = ((cycle_pulse[counter]) ) & 0x0FFFF; //TM计数达到TMGRD. 占空�?:duty3/period
TIMM_InitStructure[counter].TMM_PWM.TMM_CHD.TMM_PWMInitLevel = TMM_PWMInitLevel_High;//TMM_PWMInitLevel_High;//
TIMM_InitStructure[counter].TMM_PWM.TMM_CHD.TMM_PWMActiveLevel = ActiveLevel;//TMM_PWMActiveLevel_Low;//TMM_PWMActiveLevel_High;//
if (counter == TIMERM_COUNTER0)
{
GPIO_PinAFConfig(GPIO_PORT1,GPIO_Pin_7,GPIO_P17,GROUP_AF_TMIOD0); //P15 used as TMIOD0 output(default function)
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7 ;
}
else if (counter == TIMERM_COUNTER1)
{
/* code */
}
break;
default:
return 1;
//break;
}
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_Level = GPIO_Level_LOW;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
TMM_Init(&TIMM_InitStructure[counter]);
if (counter == TIMERM_COUNTER0)
{
TMM0_Start(ENABLE);
}
else if (counter == TIMERM_COUNTER1)
{
TMM1_Start(ENABLE);
}
else
{
return 1;
}
GPIO_Init(GPIO_PORT1,&GPIO_InitStruct);
high_level_Pulse[counter][ch] = ((cycle_pulse[counter]) ) & 0x0FFFF;
pwm_duty[counter][ch] = 1000;
return 0;
}
extern void TMM0_Set_Counter(uint8_t ch,uint16_t value);
extern void TMM1_Set_Counter(uint8_t ch,uint16_t value);
/**
* @brief 改变TimerM PWM输出的占空比
*
* @param counter 定时器x
* @param ch 通道x
* @param duty 占空�? 千分之一
* @return uint8_t 返回0成功,非0失败
*/
uint8_t TimerM_PWM_set_duty(TIMERM_PWM_Counter_en_t counter, TIMERM_PWM_Channel_en_t ch, uint16_t duty )
{
if (duty >= 1000)
{
duty = 0;
}
else if (duty <= 0)
{
duty = 1000;
}
if (counter == TIMERM_COUNTER0)
{
high_level_Pulse[counter][ch] = (((cycle_pulse[counter] * duty) / 1000) & 0x0FFFF);
TMM0_Set_Counter(1 << (ch + 1), high_level_Pulse[counter][ch]);
}
else if (counter == TIMERM_COUNTER1)
{
high_level_Pulse[counter][ch] = (((cycle_pulse[counter] * duty) / 1000) & 0x0FFFF);
TMM1_Set_Counter(1 << (ch + 1), high_level_Pulse[counter][ch]);
}
else
{
return 1;
}
pwm_duty[counter][ch] = duty;
return 0;
}
/**
* @brief 改变TimerM 定时器x的PWM输出频率
*
* @param counter 定时器x
* @param freq PWM频率
* @return uint8_t 0成功 �?0失败
*
* @note 频率范围有两种,50~2000 2001~最大,如果初始话的频率和目标频率在一个区间可以使用TimerM_PWM_set_freq2函数来优雅的切换频率�?
* 如果不在一个频率区间就需要使用TimerM_PWM_set_freq来不优雅的切换频率,
* 如果看不懂注释也使用TimerM_PWM_set_freq来切换频率�?
*/
uint8_t TimerM_PWM_set_freq(TIMERM_PWM_Counter_en_t counter, uint16_t freq )
{
if (counter < TIMERM_COUNTER_MAX)
{
if (freq > 2000)
{
TIMM_InitStructure[counter].TMM_Clk = TMM_FCLK_Div1; // specify the operation clk of tim
cycle_pulse[counter] = SystemCoreClock / freq;
}
// else if(freq >= 500)
// {
// TIMM_InitStructure[counter].TMM_Clk = TMM_FCLK_Div8; // specify the operation clk of tim
// cycle_pulse[counter] = SystemCoreClock / 8 / freq;
// }
else if(freq >= 50)
{
TIMM_InitStructure[counter].TMM_Clk = TMM_FCLK_Div32; // specify the operation clk of tim
cycle_pulse[counter] = SystemCoreClock / 32 / freq;
}
else
{
return 1;
}
}
else
{
return 1;
}
high_level_Pulse[counter][TIMERM_CHB] = (((cycle_pulse[counter] * pwm_duty[counter][TIMERM_CHB]) / 1000) & 0x0FFFF);
high_level_Pulse[counter][TIMERM_CHC] = (((cycle_pulse[counter] * pwm_duty[counter][TIMERM_CHC]) / 1000) & 0x0FFFF);
high_level_Pulse[counter][TIMERM_CHD] = (((cycle_pulse[counter] * pwm_duty[counter][TIMERM_CHD]) / 1000) & 0x0FFFF);
TIMM_InitStructure[counter].TMM_CHB_Pulse = high_level_Pulse[counter][TIMERM_CHB];
TIMM_InitStructure[counter].TMM_CHC_Pulse = high_level_Pulse[counter][TIMERM_CHC];
TIMM_InitStructure[counter].TMM_CHD_Pulse = high_level_Pulse[counter][TIMERM_CHD];
TIMM_InitStructure[counter].TMM_CHA_Pulse = cycle_pulse[counter] & 0x0FFFF;
TMM_Init(&TIMM_InitStructure[counter]);
if (counter == TIMERM_COUNTER0)
{
TMM0_Start(ENABLE);
}
else if (counter == TIMERM_COUNTER1)
{
TMM1_Start(ENABLE);
}
return 0;
}
uint8_t TimerM_PWM_set_freq2(TIMERM_PWM_Counter_en_t counter, uint16_t freq )
{
if (counter == TIMERM_COUNTER0)
{
cycle_pulse[counter] = SystemCoreClock / freq;
high_level_Pulse[counter][TIMERM_CHB] = (((cycle_pulse[counter] * pwm_duty[counter][TIMERM_CHB]) / 1000) & 0x0FFFF);
high_level_Pulse[counter][TIMERM_CHC] = (((cycle_pulse[counter] * pwm_duty[counter][TIMERM_CHC]) / 1000) & 0x0FFFF);
high_level_Pulse[counter][TIMERM_CHD] = (((cycle_pulse[counter] * pwm_duty[counter][TIMERM_CHD]) / 1000) & 0x0FFFF);
TMM0_Set_Counter(1 << 1, high_level_Pulse[counter][TIMERM_CHB]);
TMM0_Set_Counter(1 << 2, high_level_Pulse[counter][TIMERM_CHC]);
TMM0_Set_Counter(1 << 3, high_level_Pulse[counter][TIMERM_CHD]);
TMM0_Set_Counter(1, cycle_pulse[counter]);
}
else if (counter == TIMERM_COUNTER1)
{
cycle_pulse[counter] = SystemCoreClock / freq;
high_level_Pulse[counter][TIMERM_CHB] = (((cycle_pulse[counter] * pwm_duty[counter][TIMERM_CHB]) / 1000) & 0x0FFFF);
high_level_Pulse[counter][TIMERM_CHC] = (((cycle_pulse[counter] * pwm_duty[counter][TIMERM_CHC]) / 1000) & 0x0FFFF);
high_level_Pulse[counter][TIMERM_CHD] = (((cycle_pulse[counter] * pwm_duty[counter][TIMERM_CHD]) / 1000) & 0x0FFFF);
TMM1_Set_Counter(1 << 1, high_level_Pulse[counter][TIMERM_CHB]);
TMM1_Set_Counter(1 << 2, high_level_Pulse[counter][TIMERM_CHC]);
TMM1_Set_Counter(1 << 3, high_level_Pulse[counter][TIMERM_CHD]);
TMM1_Set_Counter(1, cycle_pulse[counter]);
}
else
{
return 1;
}
return 0;
}
void TimerM_PWM_Init(void)
{
}