• STM32通用定时器


    本篇文章主要讲解用通用定时器TIM2产生1ms定时的中断:

    首先是定时器配置,代码如下:

    void Tim2_Configration(void)
    {
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
        TIM_DeInit(TIM2);//重新将Timer设置为缺省值  
      TIM_InternalClockConfig(TIM2); //采用内部时钟给TIM2提供时钟源,内部时钟(CK_INT)、外部时钟模式1:外部输入脚(TIx)、外部时钟模式2:外部触发输入(ETR)  
        TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1; //计数器时钟为72MHz/72 = 1MHz    
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//设置时钟分割    
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Down;//设置计数器模式为向上计数模式    
        TIM_TimeBaseStructure.TIM_Period = 1000 - 1;//设置计数溢出大小,每计1000个数就产生一个更新事件    
        TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);//将配置应用到TIM2中        
        TIM_ClearFlag(TIM2, TIM_FLAG_Update);//清除溢出中断标志    
        TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//开启TIM2的中断
        TIM_Cmd(TIM2, ENABLE);  //计数器使能,开始工作    
    }

    TIM_Period设置了在下一个更新事件装入活动的自动重装载寄存器周期的值。它的取值必须在0x0000和0xFFFF之间。

    TIM_Prescaler设置了用来作为TIMx时钟频率除数的预分频值。它的取值必须在0x0000和0xFFFF之间。

    TIM_ClockDivision的作用是做一段延时,一般在特殊场合的时候会用到,可不关心。

    TIM_CounterMode选择了计数器模式。

        TIM_CounterMode_Up
        TIM向上计数模式
        TIM_CounterMode_Down
        TIM向下计数模式
        TIM_CounterMode_CenterAligned1   TIM中央对齐模式1计数模式
        TIM_CounterMode_CenterAligned2   TIM中央对齐模式2计数模式
        TIM_CounterMode_CenterAligned3   TIM中央对齐模式3计数模式

    注意:单片机时钟频率72MHz,APB1 二分频36MHz,故TIM2自动2倍频至72MHz

    NVIC的配置:

    void NVIC_Configuration(void)
    {
        NVIC_InitTypeDef NVIC_InitStructure;
        #ifdef  VECT_TAB_RAM  
            /* Set the Vector Table base location at 0x20000000 */ 
            NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); 
        #else  /* VECT_TAB_FLASH  */
            /* Set the Vector Table base location at 0x08000000 */ 
            NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   
        #endif
    
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//1 bits for pre-emption priority  3 bits for subpriority
    
        /* Enable the TIM2 gloabal Interrupt */
        NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;    
        NVIC_Init(&NVIC_InitStructure);
    }

    中断服务函数:

    void TIM2_IRQHandler(void)
    {
        if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
        {
            TIM_ClearITPendingBit(TIM2, TIM_IT_Update);    
        }
    }
  • 相关阅读:
    【HDU
    【HDU
    【AtCoder
    【POJ
    Apache、Nginx、IIS日志记录分析&详解
    在Windows Server 2008 R2上安装IIS
    SQL 注入漏洞研究
    利用Nginx实现反向代理web服务器(Linux+Nginx+Mysql+PHP)
    CentOS 7 LAMP搭建并且部署sqli-labs
    Kali 下配置Nessus-2020年3月新版
  • 原文地址:https://www.cnblogs.com/zpehome/p/3166789.html
Copyright © 2020-2023  润新知