STM32定时与计数器总结 第一部分

        STM32F103系列MCU提供定时器有SysTick定时器(系统滴答定时器)、基本定时器、通用定时器和高级定时器。

1.SysTick定时器

        该定时器是一个 24 位的倒计数定时器。当计到 0 时该定时器就会从 LOAD 寄存器中自动重装载定时初值。只 要不把 CTRL 寄存器中的 ENABLE 位清 0,SysTick 定时器就一直工作下去。

void SysTick_Init(void)
{
	 /* SysTick_Config会选择SysTick定时器时钟是HCLK,打开SysTick定时器并开启中断  */
	 SysTick_Config(72000);        //需要减一,重装值设为71999
	
//	 SysTick_Config(72000/8);        //重装值设为8999
//	 SysTick->CTRL  &= ~SysTick_CTRL_CLKSOURCE_Msk;   //选择SysTick定时器时钟是HCLK/8	
}
	
/**************************************************************************************
 * 描  述 : SysTick中断服务函数
 * 入  参 : 无
 * 返回值 : 无
 **************************************************************************************/
void SysTick_Handler(void)
{
	if(timecount>1000)
	{
		timecount=0;                //变量timecount清零
		led_toggle(LED_1);          //1s执行一次翻转指示灯D1的操作
	}
	else
	{
		timecount++;                //变量timecount累加1
	}
}

 

2.基本定时器(TIM6和TIM7)

        STM32F103 系列 MCU 基本定时器用计数器只可向上计数,向上计数最大到 65535。 计数器从 0 累加计数到自动重装载数值(TIMx_ARR 寄存器)后重新从 0 开始计数并产生 一个计数器溢出事件。

        基本定时器用计数器的时钟频率计算公式:

STM32定时与计数器总结 第一部分_第1张图片

        基本定时器溢出时间计算公式:

        STM32定时与计数器总结 第一部分_第2张图片 

 TIM_TimeBaseInitTypeDef 结构体是针对基本定时器、通用定时器和高级定时器声明的。

STM32定时与计数器总结 第一部分_第3张图片

 

TIM_ITConfig 库函数是 TIM 中断使能函数,作用是使能或禁止指定的 TIM 中断。 

STM32定时与计数器总结 第一部分_第4张图片基本定时器的配置步骤

STM32定时与计数器总结 第一部分_第5张图片

 

 

/**************************************************************************************
 * 描  述 : 初始化TIM6并配置TIM6中断优先级
 * 入  参 : 无
 * 返回值 : 无
 **************************************************************************************/
void TIM6_Init(void)
{//TIM_TimeBaseInitTypeDef 结构体是针对基本定时器、通用定
//时器和高级定时器声明的
	TIM_TimeBaseInitTypeDef			TIM_TimeBaseInitStruct;
	NVIC_InitTypeDef NVIC_InitStructure;

	RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM6 , ENABLE);   //打开外设TIM6时钟 
	
	TIM_DeInit(TIM6);                                  //将外设TIM6寄存器重设为缺省值  
	
  //TIM6是基本定时器,只需配置TIM_Period和TIM_Prescaler即可
	TIM_TimeBaseInitStruct.TIM_Period = 9999 ;         //设置计数器自动重装载值,取值范围0x0000~0xFFFF   
	TIM_TimeBaseInitStruct.TIM_Prescaler = 7199 ;      //设置预分频器数值,取值范围0x0000~0xFFFF 
	TIM_TimeBaseInit(TIM6, &TIM_TimeBaseInitStruct ) ;       

	TIM_ClearFlag(TIM6, TIM_FLAG_Update);              //清除TIM6的待处理标志位    
	TIM_ITConfig(TIM6, TIM_IT_Update,ENABLE);          //使能TIM6中断  
	TIM_Cmd(TIM6, ENABLE);                             //使能TIM6外设  
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);    //NVIC_Group:先占优先级2位,从优先级2位  
      NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;    //配置为TIM6中断  
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;        //先占优先级为1  
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;               //从优先级为2  
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                  //使能中断通道  
      NVIC_Init(&NVIC_InitStructure); 
}

/**************************************************************************************
 * 描  述 : TIM6中断服务函数
 * 入  参 : 无
 * 返回值 : 无
 **************************************************************************************/
void TIM6_IRQHandler(void)
{
	led_toggle(LED_1);                             //1s执行一次翻转指示灯D1的操作
	TIM_ClearFlag(TIM6, TIM_FLAG_Update);          //清除中断标志位 
}

 

        文中的代码来自艾克姆的开发板,由于我比较懒,不想对相关代码进行重新编辑,如果觉得我侵犯了权益,请联系我。 

        我是初学者,欢迎对我的文章提出您的意见和建议。非常期待您与我交流。

你可能感兴趣的:(stm32,stm32,单片机,arm)