前言

由于公司项目需要不得不使用STM8单片机,在开发STM8时遇到很多坑,但是经过挑灯夜战,终于把这些问题解决了。

开发环境

  1. 软件环境:IAR for ARM;
  2. 硬件环境: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);
}