STM32的时钟系统相当的复杂,包含了5个时钟源,分别是HSI HSE LSI LSE PLL,HSI是高速内部时钟、RC振荡器,频率为8MHz,HSE是高速外部时钟,即晶振,晶振频率为8MHz。LSI为低速内部时钟、RC振荡器,频率40kHz,LSE为低速外部时钟,接32.768kHz晶振,作为RTC时钟源。PLL为锁相环倍频输出,最大不超过72M。

在STM32Cube中结构如下:

Stm32单片机读书报告——定时器

有关时钟部分的代码:

1.配置TIM时钟

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

2.定时器基本配置

void TIM3_Configuration(void)

{

  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

   //  TIM_OCInitTypeDef  TIM_OCInitStructure ;

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

   

    TIM_TimeBaseStructure.TIM_Period = 5;        // 2.5ms    

   TIM_TimeBaseStructure.TIM_Prescaler = 36000;    // 分频36000      

   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;  // 时钟分频 

   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //计数方向向上计数

   TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

 

   

   TIM_ClearFlag(TIM3, TIM_FLAG_Update);

 

   

   TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);

 

   

   TIM_Cmd(TIM3, 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计数模式。

3.配置NVIC

       NVIC_InitStructure.NVIC_IRQChannel= TIM2_IRQChannel;

   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 4; 

   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

   NVIC_Init(&NVIC_InitStructure);

 

4.定义中断

void TIM3_IRQHandler(void)

{

......//中断处理

}

 

 

定时器的基本设置

  1.TIM_TimeBaseStructure.TIM_Prescaler = 7199;//时钟预分频数   例如 :时

钟频率=72/(时钟预分频+1) 

  2.TIM_TimeBaseStructure.TIM_Period = 9999; // 自动重装载寄存器周期的值(定时

时间)    累计 0xFFFF个频率后产生个更新或者中断(也是说定时时间到)

  3.TIM_TimeBaseStructure.TIM_CounterMode =  TIM1_CounterMode_Up; //定时器

模式  向上计数 

   4.TIM_TimeBaseStructure.TIM_ClockDivision= 0x0; //时间分割值 

  5.TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);//初始化定时器2

  6.TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);  //打开中断   溢出中断 

  7.TIM_Cmd(TIM3, ENABLE);//打开定时器

 

实例:

1.    打开STM32cubeMX的工程文件重新配置。开启定时器TIM3,选择内部时钟

Stm32单片机读书报告——定时器

2.    设置时钟频率

Stm32单片机读书报告——定时器

3.    内部时钟设置为不分频(CKD),则CK_PSC的时钟频率等于APB1的时钟频率108MHz,即108000 000Hz。若要定时时间为1s,则即可设置10800分频(预分频器寄存器 (TIMx_PSC)的值为10800-1),定时器的时钟CK_CNT的频率为10000Hz.则自动重载寄存器 (TIMx_ARR)设置为10000-1即定时为1s.TRGO为触发输出,可以触发内部ADC/DAC,这里我们没有用到这个功能,参数为默认设置.

Stm32单片机读书报告——定时器

Stm32单片机读书报告——定时器

4.    生成报告,以及生成代码,编译程序

5.    打开main.c文件,可在main()中的while循环中写下基本定时器中断模式计数。

/* USERCODE BEGIN 2 */

  /*##-1- Start the TIM Base generation ininterrupt mode ####################*/

  HAL_TIM_Base_Start_IT(&htim3);

/* USER CODE END 2 */

 

/* USER CODE BEGIN WHILE */

  while (1)

  {

  for(i=0;i<10000;i++);

         HAL_GPIO_LockPin(LED0_GPIO_Port,LED0_Pin);

  for(i=0;i<10000;i++);

 /* USER CODE END WHILE */

由于采用的是7200分频,最后定时器的频率为10000Hz,分频一个脉冲为1/10000s,所以一秒的设置为10000-1,如上代码中可以看到管脚的LED每一秒明灭一次,至此STM32单片机定时器的设置完毕。


相关文章:

  • 2021-04-04
  • 2022-12-23
  • 2021-12-03
  • 2021-12-22
  • 2021-11-17
  • 2021-11-21
猜你喜欢
  • 2022-01-10
  • 2021-11-23
  • 2021-08-24
  • 2021-11-17
  • 2021-08-10
  • 2021-07-26
相关资源
相似解决方案