stm32定时器时间计算,STM32L4定时器频率

牵着乌龟去散步 万象 9 0

大家好,如果您还对stm32定时器时间计算不太了解,没有关系,今天就由本站为大家分享stm32定时器时间计算的知识,包括STM32L4定时器频率的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

本文目录

  1. 基于stm32的多功能时钟1——时钟显示
  2. stm32cubemx定时器怎么设置2秒
  3. STM32中,systick具体延时时间怎么计算的
  4. stm32中Delay()函数延时的时间是怎么计算的

一、基于stm32的多功能时钟1——时钟显示

        读者们,大家好!

        接着上一章多功能时钟(绪论)的内容,在这一章中,我将介绍多功能时钟的时钟显示部分。话不多说,我们正式开始吧~

        多功能时钟,时钟显示功能是必不可少的。所以,我们利用stm32的定时器来计时。本来打算采用stm32的RTC实时时钟,但后来想,刚开始弄得时候,尽量简单一些,别一开始就给自己出难题,毕竟RTC实时时钟要配置的东西还挺多的。如果此次做得不错的话,后面可以再加RTC实时时钟。

        stm32不同于51,共有11个定时器,其中2个高级控制定时器(TIM1和TIM8),4个普通定时器(TIM2~TIM5)和2个基本定时器(TIM6和TIM7),以及2个看门狗定时器和1个系统滴答定时器。这里,我们采用普通定时器TIM2,并且开启定时器的中断,中断时间为1s,并且在中断函数里,模拟时钟的计时功能。

stm32定时器时间计算,STM32L4定时器频率-第1张图片-

   NVIC_InitTypeDef NVIC_InitStruct;

   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

   NVIC_InitStruct.NVIC_IRQChannel= TIM2_IRQn;

   NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority= 2;//抢占优先级为2

   NVIC_InitStruct.NVIC_IRQChannelSubPriority= 0;//子优先级为0

   NVIC_InitStruct.NVIC_IRQChannelCmd= ENABLE;

   NVIC_Init(&NVIC_InitStruct);

        这里,我们只需对NVIC_InitStruct结构体的每个元素赋值,其中TIM2_IRQn为定时器TIM2中断线,设置优先级组为2,即抢占优先级组为4组,这里抢占优先级为2,子优先级为0,然后使能NVIC(优先级不能理解上网查询)。

   TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;

   tim2_nvic_config();                //配置NVIC

   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//开启时钟

   TIM_DeInit(TIM2);                   //定时器2复位

   TIM_TimeBaseInitStruct.TIM_Period= 2000-1;         //自动重装载寄存器值

   TIM_TimeBaseInitStruct.TIM_Prescaler= 36000-1;       //时钟预分频数

   TIM_TimeBaseInitStruct.TIM_ClockDivision= TIM_CKD_DIV1;  //采样分频

   TIM_TimeBaseInitStruct.TIM_CounterMode= TIM_CounterMode_Up;//计数模式

   TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);      //初始化TIM2

   TIM_ClearFlag(TIM2, TIM_FLAG_Update);            //清除溢出中断标志

   TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);

   TIM_Cmd(TIM2, ENABLE);                   //使能时钟

        TIM2初始化,首先配置NVIC,打开TIM2时钟,复位TIM2。然后对TIM_TimeBaseInitStruct结构体的每个元素赋值。这里,主要阐述如何计算定时中断时间。定时器的溢出中断时间由TIM_Period和TIM_Prescaler来决定的。这里,我直接给出公式:发生中断时间=(TIM_Period+1)*(TIM_Prescaler+1)/FCLK,而FCLK为72M,所以定时1s,可以这样:TIM_Period=2000-1,TIM_Prescaler=36000-1;最后清除溢出中断标志,使能时钟即可计时。

   if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)

     sec++;

     if(sec>=60)

       sec= 0;

       min++;

       if(min>=60)

      {

         min= 0;

         hour++;

         if(hour>=24)

        {

           hour= 0;

        }

      }

   TIM_ClearITPendingBit(TIM2,TIM_FLAG_Update);

这里,先定义时、分、秒三个变量,然后在中断函数里,对时间变量的关系进行换算即可。

        这里,我们采用LCD12864实时显示。LCD12864的相关内容,我后面在LCD库函数章节中,会专门介绍的。这里,只将时间显示即可。

    lcd_display_num_m(2, 16, hour/10);

   lcd_display_num_m(2, 24, hour%10);

   lcd_display_string(2,32,"时");

   lcd_display_num_m(2, 48, min/10);

   lcd_display_num_m(2, 56, min%10);

   lcd_display_string(2,64,"分");

   lcd_display_num_m(2, 80, sec/10);

   lcd_display_num_m(2, 88, sec%10);

   lcd_display_string(2,96,"秒");

        LCD12864的驱动函数,我跟着黄老师的视频后面写的,在老师的基础上,增加了汉字字符串显示函数。这里,看成库函数即可,只需简单的调用,显示时间就行。

        成功显示时间后,我们需要按键来调整时间。我们需要设置时钟启/停键(K1),时间位选择键(K2),数值增加键(K3),数值减小键(K4)。

1.我们先对按键的GPIO进行配置,开启相应的时钟,选择相关引脚,设置浮空输入模式等。

   GPIO_InitTypeDef GPIO_InitStructure;

  /*使能GPIO的RCC时钟*/

   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

  /*配置PB11~PB14引脚*/

   GPIO_InitStructure.GPIO_Pin= GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14;

   GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;

   GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IN_FLOATING;

   GPIO_Init(GPIOB,&GPIO_InitStructure);

2.配置好按键的GPIO口后,编写按键扫描函数,从而达到调整时间的功能。

u8 flag,mark;//flag为定时器启停标志位,mark为位选择标志位

//mark为0表示未选中,mark为1表示选择时位,mark为2表示选择分位,mark为3表示选择秒位

   if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==RESET)

     delay_ms(10);

     if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==RESET)

       flag=~flag;

       if(!flag)

      {

         TIM_Cmd(TIM2, ENABLE);

      }

       else

      {

         TIM_Cmd(TIM2, DISABLE);

         mark= 0;

      }

    }while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==RESET);

   if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12)==RESET)

     delay_ms(10);

     if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12)==RESET)

       mark= mark>=3?0:mark+1;

    }while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12)==RESET);

   if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)==RESET)

     delay_ms(10);

     if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)==RESET)

       if(flag)

      {

         switch(mark)

        {

           case 1:hour= hour<23?hour+1:0;break;

           case 2:min= min<59?min+1:0;break;

           case 3:sec= sec<59?sec+1:0;break;

                  default:break;

        }

      }

    }while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)==RESET);

   if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==RESET)

     delay_ms(10);

     if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==RESET)

       if(flag)

      {

         switch(mark)

        {

           case 1:hour= hour>0?hour-1:23;break;

           case 2:min= min>0?min-1:59;break;

           case 3:sec= sec>0?sec-1:59;break;

           default:break;

        }

      }

    }while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==RESET);

        至此,我们完成了时钟显示的功能,当然,后期如果可以的话,我们可以使用stm32的RTC实时时钟资源,还可以设置闹钟、整点报时的功能。

        本章,我主要介绍了如何利用stm32的TIM定时器和GPIO资源,实现时钟显示和按键调整的功能。下一章中,我将介绍如何利用DHT11模块来测量温度和湿度,从而实现系统对环境参量的获取。

二、stm32cubemx定时器怎么设置2秒

3、在“Pinout”选项卡中,找到需要的定时器。

4、在定时器配置界面中,选择合适的时钟源和预分频器。

5、设置定时器的自动重载值(ARRE),这个值决定了定时器的溢出时间。为了使定时器溢出时间达到2秒,需要根据选择的时钟源和预分频器计算出正确的ARRE值。

6、配置定时器的其他参数,如输出比较通道、PWM模式等,根据需求进行设置。

7、点击“Project”菜单,选择“GenerateCode”生成代码。

三、STM32中,systick具体延时时间怎么计算的

1、SysTick就是一个定时器而已,只是它放在了NVIC(嵌套中断控制器)中,主要的目的是为了给操作系统提供一个硬件上的中断(号称滴答中断)。

2、滴答中断:操作系统进行运转的时候,也会有“心跳”。

3、它会根据“心跳”的节拍来工作,把整个时间段分成很多小小的时间片,每个任务每次只能运行一个“时间片”的时间长度就得退出给别的任务运行,这样可以确保任何一个任务都不会霸占整个系统不放。

4、这个心跳,可以通过定时器来周期性触发,而这个定时器就是systick。很明显,这个“心跳”是不允许任何人来随意地访问和修改的。只要不把它在SysTick控制及状态寄存器中的使能位清除,就永不停息。

四、stm32中Delay()函数延时的时间是怎么计算的

单片机编程过程中经常用到延时函数,最常用的莫过于微秒级延时delay_us(

)。1.普通延时法这个比较简单,让单片机做一些无关紧要的工作来打发时间,经常用循环来实现,不过要做的比较精准还是要下一番功夫。下面的代码是在网上搜到的,经测试延时比较精准。//粗延时函数,微秒

}2.SysTick定时器延时CM3内核的处理器,内部包含了一个SysTick

定时器,SysTick是一个24位的倒计数定时器,当计到0时,将从RELOAD

寄存器中自动重装载定时初值。只要不把它在SysTick

控制及状态寄存器中的使能位清除,就永不停息。SysTick在STM32

的参考手册里面介绍的很简单,其详细介绍,请参阅《Cortex-M3权威指南》。

这里面也有两种方式实现:a.中断方式

如下,定义延时时间time_delay,SysTick_Config()定义中断时间段,在中断中递减time_delay,从而实现延时。

volatile unsigned long time_delay;//

void delay_ms(volatile unsigned long nms)

//SYSTICK分频--1ms的系统时钟中断

if(SysTick_Config(SystemFrequency/1000))

SysTick->CTRL=0x00;//关闭计数器

SysTick->VAL=0X00;//清空计数器

void delay_us(volatile unsigned long nus)

//SYSTICK分频--1us的系统时钟中断

if(SysTick_Config(SystemFrequency/1000000))

SysTick->CTRL=0x00;//关闭计数器

SysTick->VAL=0X00;//清空计数器

}//在中断中将time_delay递减。实现延时void

文章分享结束,stm32定时器时间计算和STM32L4定时器频率的答案你都知道了吗?欢迎再次光临本站哦!

标签: 定时器 频率 STM32L4 时间 计算

抱歉,评论功能暂时关闭!