ARM学习 Timer定时器

定时器介绍

STM32F1 系列中,除了互联型的产品,共有 8个定时器,分为基本定时器,通用定时器和高级定时器。 基本定时器 TIM6 和 TIM7 是一个 16位的只能向上计数的定时器,只能定时,没有外部 IO。 通用定时器 TIM2/3/4/5是一个 16位的可以向上/下计数的定时器,可以定时,可以输出比较,可以输入捕捉, 每个定时器有四个外部IO。高级定时器 TIM1/8是一个 16位的可以向上/下计数的定时器,可以定时,可以输出比较, 可以输入捕捉,还可以有三相电机互补输出信号,每个定时器有8 个外部 IO。

基本定时器的核心是时基,不仅基本定时器有,通用定时器和高级定时器也有。学习定时器时,我们先从简单的基本定时器学起, 到了后面的通用和高级定时器的学习中,我们直接跳过时基部分的讲解即可。

基本定时器配置

void BASIC_TIM_Config(void)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

    // 开启定时器时钟,即内部时钟CK_INT=72M
    BASIC_TIM_APBxClock_FUN(BASIC_TIM_CLK, ENABLE);

    // 自动重装载寄存器周的值(计数值)
    TIM_TimeBaseStructure.TIM_Period=1000;

    // 累计TIM_Period个频率后产生一个更新或者中断
    // 时钟预分频数为71,则驱动计数器的时钟CK_CNT = CK_INT / (71+1)=1M
    TIM_TimeBaseStructure.TIM_Prescaler= 71;

    // 时钟分频因子 ,基本定时器没有,不用管
    //TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;

    // 计数器计数模式,基本定时器只能向上计数,没有计数模式的设置
    //TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;

    // 重复计数器的值,基本定时器没有,不用管
    //TIM_TimeBaseStructure.TIM_RepetitionCounter=0;

    // 初始化定时器
    TIM_TimeBaseInit(BASIC_TIM, &TIM_TimeBaseStructure);

    // 清除计数器中断标志位
    TIM_ClearFlag(BASIC_TIM, TIM_FLAG_Update);

    // 开启计数器中断
    TIM_ITConfig(BASIC_TIM,TIM_IT_Update,ENABLE);

    // 使能计数器
    TIM_Cmd(BASIC_TIM, ENABLE);

    // 暂时关闭定时器的时钟,等待使用
    BASIC_TIM_APBxClock_FUN(BASIC_TIM_CLK, DISABLE);
}

定时器中断优先级配置

// 中断优先级配置
void BASIC_TIM_NVIC_Config(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
    // 设置中断组为0
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
    // 设置中断来源
    NVIC_InitStructure.NVIC_IRQChannel = BASIC_TIM_IRQ ;
    // 设置主优先级为 0
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    // 设置抢占优先级为3
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

定时器中断服务程序

void  BASIC_TIM_IRQHandler (void)
{
    if ( TIM_GetITStatus( BASIC_TIM, TIM_IT_Update) != RESET ) {
        time++;
        TIM_ClearITPendingBit(BASIC_TIM , TIM_FLAG_Update);
    }
}

main

 
/* 包含头文件 ----------------------------------------------------------------*/
#include "stm32f10x.h"
#include "bsp/led/bsp_led.h"
#include "bsp/key/bsp_key.h"
#include "bsp/delay/delay.h"
#include "bsp/systick/bsp_SysTick.h"
#include "bsp/GeneralTIM/bsp_GeneralTIM.h" 
/* 函数体 --------------------------------------------------------------------*/
 
__IO uint16_t timer_count=0;
/**
  * 函数功能: 主函数.
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明: 无
  */
int main(void)
{
	LED_GPIO_Init();
 //KEY_GPIO_Init();
//	KEY1_EXIT_Config();
//	KEY2_EXIT_Config();
//	KEY3_EXIT_Config();
	/* 初始化系统滴答定时器 */  
//  SysTick_Init();
	
	
  /* 通用定时器初始化:1ms中断一次  */
  GENERAL_TIMx_Configuration();  
  while (1)
  {
    if(timer_count==500)
    {
      LED1_ON;
	  LED2_OFF;
	  LED3_OFF;
    }
	 if(timer_count==1000)
    {
      LED1_OFF;
	  LED2_ON;
      LED3_OFF;
    }
   if(timer_count==1500)
    {
      timer_count=0;
      LED1_OFF;
	  LED2_OFF;
	  LED3_ON;
    }
    
  }
 
}
 

  • 11
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值