STM32F7xx —— Timer

发布者:tmgouzi最新更新时间:2020-12-17 来源: eefocus关键字:STM32F7xx  Timer  PWM 手机看文章 扫描二维码
随时随地手机看文章

作用:输出PWM,测量脉冲长度,定时等。


一、基础定时器配置

// 基本定时器

#define TIMER_CHANNEL             TIM3

#define TIMER_PREEMPT_PRIO        TIM_PRIORITY

#define TIMER_RCC_FUNC            __HAL_RCC_TIM3_CLK_ENABLE

#define TIMER_IRQ                 TIM3_IRQn

#define TIMER_IRQ_FUNC            TIM3_IRQHandler

#define TIMER_DIV                 (10800 - 1)

#define TIMER_PERIOD              (100 - 1)

 

static TIM_HandleTypeDef timer_handler;     // 定时器操作句柄

 

// Period:自动重装值。 Prescaler:时钟预分频数

// 定时器溢出时间计算方法:Tout=((Period+1)*(Prescaler+1))/Ft us.

// Ft=定时器工作频率,单位:Mhz

void TimerInit(void)

{

  timer_handler.Instance = TIMER_CHANNEL;

  timer_handler.Init.Prescaler = TIMER_DIV;

  timer_handler.Init.CounterMode = TIM_COUNTERMODE_UP;

  timer_handler.Init.Period = TIMER_PERIOD;

  timer_handler.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

  HAL_TIM_Base_Init(&timer_handler);

  HAL_TIM_Base_Start_IT(&timer_handler);

}

 

// 定时器底层驱动 开启时钟 设置中断优先级

// 此函数会被 HAL_TIM_Base_Init()函数调用

void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *timer)

{

  TIMER_RCC_FUNC();

  HAL_NVIC_SetPriority(TIMER_IRQ, TIM_PRIORITY, 1);

  HAL_NVIC_EnableIRQ(TIMER_IRQ);

}

 

 

void TIMER_IRQ_FUNC(void)

{

  HAL_TIM_IRQHandler(&timer_handler);

}

 

// 中断服务函数调用

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *timer)

{

  if(timer == (&timer_handler))

  {

     // do something

  }

}

 


二、带回调定时器

使用回调函数,以链表的方式管理所有的定时器。检测时间到,执行回调函数。TimerRun定时运行,TimerCreate创建一个定时器,TimerStart开启定时器。这里只是写了一个比较简单的定时器,操作系统里面也有类似的定时接口。


#define TIMER_CHANNEL             TIM3

#define TIMER_PREEMPT_PRIO        TIM_PRIORITY

#define TIMER_RCC_FUNC            __HAL_RCC_TIM3_CLK_ENABLE

#define TIMER_IRQ                 TIM3_IRQn

#define TIMER_IRQ_FUNC            TIM3_IRQHandler

#define TIMER_DIV                 (10800 - 1)

#define TIMER_PERIOD              (100 - 1)

 

static struct

{

  timer_t *next;

} timer_run;

 

static volatile uint32_t timer_ticks;

static uint32_t timer_ticks_run;

 

static TIM_HandleTypeDef timer_handler;     // 定时器操作句柄

 

// Period:自动重装值。 Prescaler:时钟预分频数

// 定时器溢出时间计算方法:Tout=((Period+1)*(Prescaler+1))/Ft us.

// Ft=定时器工作频率,单位:Mhz

void TimerInit(void)

{

  timer_run.next = NULL;

 

  timer_handler.Instance = TIMER_CHANNEL;

  timer_handler.Init.Prescaler = TIMER_DIV;

  timer_handler.Init.CounterMode = TIM_COUNTERMODE_UP;

  timer_handler.Init.Period = TIMER_PERIOD;

  timer_handler.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

  HAL_TIM_Base_Init(&timer_handler);

  HAL_TIM_Base_Start_IT(&timer_handler);

}

 

// 定时器底层驱动 开启时钟 设置中断优先级

// 此函数会被 HAL_TIM_Base_Init()函数调用

void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *timer)

{

  TIMER_RCC_FUNC();

  HAL_NVIC_SetPriority(TIMER_IRQ, TIM_PRIORITY, 1);

  HAL_NVIC_EnableIRQ(TIMER_IRQ);

}

 

 

void TIMER_IRQ_FUNC(void)

{

  HAL_TIM_IRQHandler(&timer_handler);

}

 

// 中断服务函数调用

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *timer)

{

  if(timer == (&timer_handler))

  {

    ++timer_ticks;

  }

}

 

//======================================================================================================

void TimerRun(void)

{

  timer_t *timer;

  timer_t *timer_done;

 

  timer_done = NULL;

 

  while(timer_ticks_run != timer_ticks)

  {

    timer = timer_run.next;

 

    if(timer)

    {

      if(timer->ticks)

      {

        ++timer_ticks_run;

        timer->ticks--;

      }

      // 将后续超时的定时器都移除

      while(timer && (0 == timer->ticks))

      {

        timer_run.next = timer->next;

        timer->next = timer_done;

        timer_done = timer;

        timer = timer_run.next;

      }

    }

    else

    {

      ++timer_ticks_run;

    }

  }

 

  while(timer_done)

  {

    timer = timer_done;

    timer_done = timer->next;

    timer->next = NULL;

    timer->handler(timer->param);

  }

}

 

void TimerCreate(timer_t *timer, timer_cb_t handler, void *param)

{

  timer->handler = handler;

  timer->param = param;

}

 

void TimerStart(timer_t *timer, uint32_t timeout)

{

  timer_t *p;

  uint32_t ticks = (timeout + 9) / 10;

 

  TimerCancel(timer);

 

  p = (timer_t *)&timer_run;

 

  while(p->next)

  {

    if(ticks <= p->next->ticks)

    {

      p->next->ticks -= ticks;

      break;

    }

    else

    {

      ticks -= p->next->ticks;  // ticks 有可能为 0

    }

    p = p->next;

  }

  timer->ticks = ticks;

  timer->next = p->next;

  p->next = timer;

}

 

void TimerCancel(timer_t *timer)

{

  timer_t *p;

 

  if(NULL == timer)

  {

    return;

  }

 

  p = (timer_t *)&timer_run;

 

  while(p->next)

  {

    if(p->next == timer)

    {

      if(timer->next)

      {

        timer->next->ticks += timer->ticks;

      }

      p->next = timer->next;

      timer->next = NULL;

      break;

    }

    p = p->next;

  }

}

static timer_t timer;

static void handler(void *param)

{

  TimerStart(&timer, 1000);

 

  printf("TimerStartrn"); 

}

 

 

  TimerCreate(&timer, handler, NULL);

  TimerStart(&timer, 1000);

 

  TimerRun(); // 放在10ms任务中运行


关键字:STM32F7xx  Timer  PWM 引用地址:STM32F7xx —— Timer

上一篇:STM32F7xx —— LAN8720(FreeRTOS+LWIP)
下一篇:STM32F7xx —— FatFS(W25QXX)

推荐阅读最新更新时间:2024-11-05 20:49

TL598在小型直流电机PWM调速中的应用
    摘要: 介绍了TL598芯片的特点及使用方法,提出了基于TL598芯片设计电机PWM控制系统的方法。给出了采用TL598设计的电机位置随动系统电路和电机调速系统电路图,并给出了用MCS51命令编写的脉冲产生程序。文中介绍的两种电路造价便宜,可靠性高,可方便的实现TL598与计算机的接口。     关键词: TL598 PWM 电机 调速 1 引言 TL598是德州仪器公司生产的一种开关电源脉宽调制器集成电路,它可用于直流电动机的脉宽调制以实现对电流、转速的调节,也可以用一块芯片实现T型双极模式PWM控制,或用两块芯片实现H型双极模式PWM控制。和直流电机的专用PWM集成电路相比,TL598价格较低
[工业控制]
51单片机+PWM控制渐变七彩灯C51程序
一、硬件介绍: (采用5050LED 2W) RGB三色LED控制引脚分别为单片机P1.2 、 P1.1 、 P1.0。LED正极接主电源(24V)正极,负极接驱动3颗三极管的集电极,单片机控制脚分别接3颗NPN三极管,三极管发射极接地,而单片机的供电是来自三端稳压器7805,祥细原理如下: 二、实物图片: 三、软件部分: 1、/*原理: 先亮红灯(保持一会儿)----红绿过度(绿加1、红减1循环240次)------ 绿灯亮起(保持一会儿)----绿兰过度(兰加1、绿减1循环240次) -----兰灯亮起(保持)-----兰白过度(绿加1、红加1循环240次、兰不变) ---白红过度,技术支持网站: http
[单片机]
51单片机+<font color='red'>PWM</font>控制渐变七彩灯C51程序
STM32之PWM波形输出配置总结
一. TIMER分类: STM32中一共有11个定时器,其中TIM6、TIM7是基本定时器;TIM2、TIM3、TIM4、TIM5是通用定时器;TIM1和TIM8是高级定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。其中系统嘀嗒定时器是前文中所描述的SysTick。 定时器 计数器分辨率 计数器类型 预分频系数 产生DMA请求 捕获/比较通道 互补输出 TIM1 TIM8 16位 向上,向下,向上/向下 1-65536之间的任意数 可以 4 有 TIM2 TIM3 TIM4 TIM5 16位 向上,向下,向上/向下 1-65536之间的任意数 可以 4 没有 TIM6 TI
[单片机]
STM32之<font color='red'>PWM</font>波形输出配置总结
[组图]单端PWM控制器NCP1205及其应用
摘要: NCP1205是安森美公司采用先进技术生产的一种单端脉冲宽度调制控制器。该控制器可保证在任何负载/线路条件下的完全继续传导模式DCM和准谐振QR操作,同时,该器件还组合了一个真正的电流模式控制调制器和一个退磁检测器。文中介绍了NCP1205 PWM控制芯片的基本结构、工作原理和主要特点,给出了它的典型应用电路。 关键词:QR ;I/CO;频率软折弯;PWM控制器;NCP1205 1 概述 NCP1205是安森美公司生产的一种先进的单端PWM控制器。其应用领域主要包括:较大功率笔记本电脑用AD/DC适配器、脱机电池充电器和DVD、CD唱机、TVS、机顶盒(STB)等系统的开关电流(SMPS)及USB中的辅助
[模拟电子]
[组图]单端<font color='red'>PWM</font>控制器NCP1205及其应用
STM32 PWM的输出与Keil软件仿真
STM32 PWM的输出 脉冲宽度模式(PWM模式)可以用来产生一个由TIMx_ARR寄存器确定平率,由TIMx_CCRx寄存器确定占空比的信号。在STM32开发中,由于官方提供了较为完善的库函数,使得我们的开发工作变得相当的轻松,甚至可以在不需要太多了解硬件结构的条件下,完成我的开发工作,实现我们所需要的功能。在此,笔者也建议大家,在初学的时候尽量去熟悉固件库中提供的函数来调节PWM的频率和占空比,对底层寄存器的操作应尽量减少。 本文使用的STM32F103RB的芯片,输出通道是TIM2_CH2通道,STM32有较强的可移植性,如果读者的芯片类型跟我不一样,可以做适当的修改,完成自己的开发。 使用到的库函数有: s
[单片机]
基于PWM控制的开关电源系统仿真研究
   0 引 言   通过数学的方法,把小功率开关电源系统表示成数学模型和非线性控制模型,建立一种开关电源全系统的仿真模型,提高了仿真速度。Matlab是一个高级的数学分析软件,Simulink是运行在Matlab环境下,用于建模、仿真和分析动态系统的软件包,它支持连续、离散及两者混合的线性及非线性系统。   在Matlab 5.2中推出了电力系统工具箱,该工具箱可以与Simulink配合使用,能够更方便地对电力电子系统进行仿真。随着电源技术的发展,PWM控制的开关电源得到了广泛的研究和应用,如通信电源,机车电源等。这里以220 V高频开关电源为研究对象,建立模型。该电源采用脉宽调制控制方式,实现了减轻重量、缩小体积、提高精度
[电源管理]
52单片机Timer2的中断应用
/* This file is an example to use timer2 in mode 0 此程序用于定时器2模式0*/ #define MSB_reload_value 0x36 /* msb reload value exemple 高位重载值:延时60ms*/ #define LSB_reload_value 0x36 /* lsb reload value exemple 低位重载值*/ #include reg_c51.h //当前文件夹内的文件 /* * FUNCTION_PURPOSE: This file set up timer 2 in mode 0 (16 b
[单片机]
【STM32】解决引脚复用成PWM开漏输出峰值达不到外部上拉的电
项目场景: 因为项目的一个功能需求,需要输出一个高电平为5V的PWM。 问题描述: 发现输出的PWM高电平最高只有4V不到的样子,很接近于4V。实测过普通开漏输出,高电平完全可以达到外部上拉的5V。HAL库也试过了,也是完全可以达到5V的,但是标准库的配置一直上不去。 原因分析: 仔细对比发现没啥异常,配的都是对的,但是可以肯定的是,肯定还是配置,因为HAL库可以实现,那就说明一定还是某个地方配的有问题。最后才知道开漏输出脚必须配置为浮空,不配置的话实测默认的是内部上拉。 1.内部下拉: 2.内部上拉: 3.浮空: 解决方案: 一句话:GPIO_InitStructure.GPIO_PuPd = GPIO_
[单片机]
【STM32】解决引脚复用成<font color='red'>PWM</font>开漏输出峰值达不到外部上拉的电
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved