STM32F407VG (五)定时器

一、定时器节本分类和主要特点

1.STM32定时器分类:

1)看门狗定时器

2)SysTick定时器

3)RTC定时器

4)通用定时器

a)通用定时器TIM2~TIM5, 当中TIM2和TIM5是32位,TIM3和TIM4是16位

具有四个独立通道

中断/DMA事件

支持增量编码器和霍尔传感器

b)通用定时器TIM9~TIM14,16位定时器

最多具有连个独立通道

中断事件

5)基本定时器TIM6,TIM7,16位定时器

同步电路触发DAC

中断/DMA事件

6)高级定时器TIM1。TIM8,16位定时器

具有四个独立通道

中断/DMA事件

支持增量编码器和霍尔传感器

输入信号能够改变计数器状态或复位

可改变定期器寄存器的反复计数器。

二、实例1. 定时中断

1.时钟初始化

TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE);

TIM_DeInit(TIM2);

/* 时钟预分频数 */       //84000000/84=1000000,预分频后时钟为1M

TIM_TimeBaseStructure.TIM_Prescaler= (84 - 1);

/* 自己主动重装载寄存器周期的值(计数值) */ /*
累计 TIM_Period个频率后产生一个更新或者中断 */

TIM_TimeBaseStructure.TIM_Period =1000-1 ;

/* 採样分频 */

TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;

/* 向上计数模式 */

TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;

//调用初始化函数

TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

/* 清除溢出中断标志 */

TIM_ClearFlag(TIM2, TIM_FLAG_Update);

/*设置产生TIM_FLAG_Update中断*/

TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);

/* 开启时钟 */

TIM_Cmd(TIM2, ENABLE);

2. 设置中断向量。具体的解释见本博客有关“中断”部分的文章

1)中断初始化

NVIC_InitTypeDef NVIC_InitStructure;

/* Enable TIM2 interrupt IRQ channel */

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

2)中断函数

void TIM2_IRQHandler(void)

{

static unsigned int cpu_counter = 0;

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

{

TIM_ClearITPendingBit(TIM2,TIM_FLAG_Update);

cpu_counter ++;

if(cpu_counter >= 500) //等闪烁的周期是1s

{

cpu_counter = 0;

GPIO_ToggleBits(LED1);

}

}

}

波形非常标准吧:)

时间: 2024-11-11 01:33:16

STM32F407VG (五)定时器的相关文章

初入android驱动开发之字符设备(五-定时器)

这个字符设备系列,主要借助较容易上手的字符设备实例,去讲解linux的一些机制,以及驱动中比较常用到的中断.定时器.信号量等一些知识,由于本人自身的知识有限,对于arm的架构体系不太了解,这里,一般这里只讲,如何去用,对于一些原理性的东西不会深究,以后的文章会慢慢的加深. 想想我们当初玩51单片机的时候,那时候按键防抖是一个硬件.软件都需要处理的地方.软件一般就是加延时检测判断.当然,这里我们也可以用到定时器的这个机制,做按键驱动,这里主要还是以按键为例,但不是讲的按键防抖. 1. 定时器的一些

(笔记)Linux内核学习(八)之定时器和时间管理

一 内核中的时间观念 内核在硬件的帮助下计算和管理时间.硬件为内核提供一个系统定时器用以计算流逝的时间.系 统定时器以某种频率自行触发,产生时钟中断,进入内核时钟中断处理程序中进行处理. 墙上时间和系统运行时间根据时钟间隔来计算. 利用时间中断周期执行的工作: 更新系统运行时间: 更新实际时间: 在smp系统上,均衡调度程序中各处理器上运行队列: 检查当前进程是否用尽了时间片,重新进行调度: 运行超时的动态定时器: 更新资源消耗和处理器时间的统计值: 二 节拍率 系统定时器的频率:通过静态预处理

6种中断点亮一个LED

一.外部中断0.1(分别點亮一個LED) /******************************************************************************* * 标题: 计数器中断实验 * #include <reg52.h> #include<intrins.h> sbit led1 = P0^0; sbit led2 = P0^1; void main(void) { // IT0=0; //低电平触发 IT0=1; //下降沿触发

STC51六中中断配置点亮一个LED

一.外部中断0.1(分别點亮一個LED) /******************************************************************************* * 标题: 计数器中断实验 * #include <reg52.h> #include<intrins.h> sbit led1 = P0^0; sbit led2 = P0^1; void main(void) { // IT0=0; //低电平触发 IT0=1; //下降沿触发

s5pv210 datasheet_overview

1 OVERVIEW OF S5PV210 1.1 ARCHITECTURAL OVERVIEW S5PV210 is a 32-bit RISC cost-effective, low power, andhigh performance microprocessor solution for mobile phones and general applications. It integrates the ARM Cortex-A8 core, which implements the AR

JAVA基础再回首(二十五)——Lock锁的使用、死锁问题、多线程生产者和消费者、线程池、匿名内部类使用多线程、定时器、面试题

JAVA基础再回首(二十五)--Lock锁的使用.死锁问题.多线程生产者和消费者.线程池.匿名内部类使用多线程.定时器.面试题 版权声明:转载必须注明本文转自程序员杜鹏程的博客:http://blog.csdn.net/m366917 我们来继续学习多线程 Lock锁的使用 虽然我们可以理解同步代码块和同步方法的锁对象问题,但是我们并没有直接看到在哪里加上了锁,在哪里释放了锁,为了更清晰的表达如何加锁和释放锁,JDK5以后提供了一个新的锁对象Lock Lock void lock():获取锁 v

STM32学习笔记(五)——通用定时器计数延时

STM32定时器概述 STM32F40x系列总共最多有14个定时器,定时器分为三类:基本定时器.通用定时器和高级定时器.它们的都是通过计数来达到定时的目的,和51的定时器差不多,基本原理都是一样的,就是功能多了一些,这些计数器都是自动重新装载初值的,使用起来非常方便,而且计数时钟频率可以通过分频系数来设置.本文章将介绍使用定时器中断来控制LED间隔1s闪烁. 计数的时钟来源主要有四个: 内部时钟CK_INT 外部时钟模式1:外部输入脚TIx 外部时钟模式2:外部触发输入ETR,仅适用于 TIM2

(五)转载:通用定时器PWM输出

1.     TIMER输出PWM基本概念   脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术.简单一点,就是对脉冲宽度的控制.一般用来控制步进电机的速度等等. STM32的定时器除了TIM6和TIM7之外,其他的定时器都可以用来产生PWM输出,其中高级定时器TIM1和TIM8可以同时产生7路的PWM输出,而通用定时器也能同时产生4路的PWM输出. 1.1   PWM输出模式 S

Linux嵌入式驱动学习之路(十五)按键驱动-定时器防抖

在之前的定时器驱动程序中,我们发现在连续按下按键的时候,正常情况下应该是一次按下对应一次松开.而程序有时候会显示是两次按下,一次松开.这个问题是因为在按下的时候,因为是机械按键,所以电压信号会产生一定的波动,会让程序进行两次中断,如何解决这个问题呢? 我们可以在发生一次中断之后等待一段时间再去判断按键是否已经被按下,如果是已经被按下了 则本次有效,否则无效.这里用到了定时器. 定时器常用的操作函数有:   init_timer(&timer);   //定时器初始化   timer.data=1