STM8 TIM常用配置
前言
由于公司项目需要不得不使用STM8单片机,在开发STM8时遇到很多坑,但是经过挑灯夜战,终于把这些问题解决了。
开发环境
- 软件环境:IAR for ARM;
- 硬件环境:STM32L15X系列。
定时器
TIM1 ETR
代码
/*
****************************************************************************************************
*函数名:TIM1_CH1_ETR_Init()
*功 能:
*参 数:
****************************************************************************************************
*/
void TIM1_CH1_ETR_Init(void)
{
TIM1_DeInit(); //复位TIME1
CLK_PeripheralClockConfig(CLK_Peripheral_TIM1,ENABLE);
GPIO_Init(GPIOD,GPIO_Pin_3,GPIO_Mode_In_PU_No_IT);
TIM1_ETRClockMode2Config(TIM1_ExtTRGPSC_OFF, TIM1_ExtTRGPolarity_Inverted, 0x00);
//外部计数配置(TIM1_ExtTRGPSC_DIV2,TIM1_ExtTRGPolarity_Inverted,0);//没有外部触发预分频器,高电平或上升沿有效,使能外部时钟模式1
TIM1_SelectInputTrigger(TIM1_TRGSelection_ETRF);
TIM1_ARRPreloadConfig(ENABLE);
TIM1_ClearFlag(TIM1_FLAG_Update);
TIM1_ITConfig(TIM1_IT_Update,ENABLE);
TIM1_SetCounter(0);
TIM1_Cmd(ENABLE);
enableInterrupts();
// ITC_SetSoftwarePriority()
}
/*
****************************************************************************************************
*TIMER1_IRQHandler()
*功 能:中断处理
*参 数: 无
****************************************************************************************************
*/
#pragma vector=23+2
__interrupt void TIMER1_IRQHandler(void)
{
// if(TIM1_GetITStatus(TIM1_IT_Update) != RESET)
// {
TIM1_ClearITPendingBit(TIM1_IT_Update);
Cnt_a++;
Cnt_a_View = Cnt_a;
// }
}
TIM1 通用
/*
****************************************************************************************************
*函数名:TIMER1_Init()
*功 能:定时器1初始化
*参 数:psc:分频数;count:计数值;arr:重装载值
****************************************************************************************************
*/
//TIMER1_Init(1600-1,10000-1,0);//��Ƶ 16M /1600=10KHZ 0.1ms*10000=1s
void TIMER1_Init(u16 psc,u16 count , u16 arr )
{
TIM1_DeInit(); //复位TIME1
CLK_PeripheralClockConfig(CLK_Peripheral_TIM1,ENABLE); //开启TIME1的时钟中断
TIM1_TimeBaseInit(psc,TIM1_CounterMode_Up,count,arr); //psc:分频数;count:计数值;arr:重装载值
TIM1_ARRPreloadConfig(ENABLE); //打开自动重装,打开计数器
TIM1_ClearFlag(TIM1_FLAG_Update);
TIM1_ITConfig(TIM1_IT_Update, ENABLE); //允许定时器1更新中断
TIM1_Cmd(ENABLE); //使能定时器1
}
/*
****************************************************************************************************
*TIMER1_IRQHandler()
*功 能:中断处理
*参 数: 无
****************************************************************************************************
*/
#pragma vector=23+2
__interrupt void TIMER1_IRQHandler(void)
{
if(TIM1_GetITStatus(TIM1_IT_Update) != RESET)
TIM1_ClearITPendingBit(TIM1_IT_Update);
}
TIM2 通用
/*
****************************************************************************************************
*函数名:TIMER2_Init()
*功 能:定时器2初始化
*参 数:psc:分频数;count:计数值;arr:重装载值
****************************************************************************************************
*/
//TIMER2_Init(10000); //10ms
void TIMER2_Init(u16 arr)
{
CLK_PeripheralClockConfig(CLK_Peripheral_TIM2,ENABLE);
TIM2_DeInit(); //复位TIME2
TIM2_TimeBaseInit(TIM2_Prescaler_16, TIM2_CounterMode_Up,arr);
TIM2_ARRPreloadConfig(ENABLE); //打开自动重装,打开计数器
// TIM2_ClearFlag(TIM2_FLAG_Update);
TIM2_ITConfig(TIM2_IT_Update, ENABLE); //允许定时器2更新中断
TIM2_Cmd(ENABLE);
enableInterrupts();
}
/***********************************************************
*@fuction :TIMER2_IRQHandler
*@brief :定时器2中断 10ms
*@param :--
*@return :--
*@author :LCH
*@date :2023-3-21
***********************************************************/
#pragma vector=19+2
__interrupt void TIMER2_IRQHandler(void)
{
TIM2_ClearITPendingBit(TIM2_IT_Update);
// if(TIM2_GetITStatus(TIM2_IT_Update)== SET) //溢出中断
// {
// TIM2_ClearITPendingBit(TIM2_IT_Update);
if(TIM2_Count++ >= 100)
{
TIM2_Count = 0;
flag_1s=1;
User_PAR.Timer_1s_flag = Valid;
User_PAR.Timer_1s_Filter_flag = Valid;
Cnt_c = TIM1_GetCounter();
View_Val = Cnt_a * 65536 + TIM1_GetCounter();
Frequency_b = Cnt_a * 65536 + TIM1_GetCounter();
TIM1_SetCounter(0);
}else;
// }else;
}
TIM2 ETR
/*
****************************************************************************************************
*函数名:TIM2_CH1_ETR_Init()
*功 能:定时器1初始化
*参 数:psc:分频数;arr:重装载值
****************************************************************************************************
*/
void TIM2_CH1_ETR_Init(void)
{
uint8_t ICFilter = 0;
GPIO_Init(GPIOB,GPIO_Pin_3,GPIO_Mode_In_PU_No_IT);
TIM2_DeInit(); //复位TIME2
CLK_PeripheralClockConfig(CLK_Peripheral_TIM2,ENABLE); //开启TIME2的时钟中断
TIM2_ETRClockMode2Config(TIM2_ExtTRGPSC_OFF,TIM2_ExtTRGPolarity_Inverted,0);//没有外部触发预分频器,高电平或上升沿有效,使能外部时钟模式2
TIM2_SelectInputTrigger(TIM2_TRGSelection_ETRF); //选择外部触发
TIM2_ARRPreloadConfig(ENABLE);
TIM2_ClearFlag(TIM2_FLAG_Update);
TIM2_ITConfig(TIM2_IT_Update,ENABLE); //打开中断
TIM2_SetCounter(0);
TIM2_Cmd(ENABLE);
}
/***********************************************************
*@fuction :TIMER2_IRQHandler
*@brief :定时器2中断 10ms
*@param :--
*@return :--
*@author :LCH
*@date :2023-3-21
***********************************************************/
#pragma vector=19+2
__interrupt void TIMER2_IRQHandler(void)
{
TIM2_ClearITPendingBit(TIM2_IT_Update);
}