STM32F4 定时器TIM(1)定时器控制输出

发布者:Serendipitous55最新更新时间:2016-12-19 来源: eefocus关键字:STM32F4  定时器  控制输出 手机看文章 扫描二维码
随时随地手机看文章

高级时钟控制定时器TIM1&TIM8简介:

STM32F4的高级控制定时器包含一个自动重装载计数器,计数器的输入是一个被预分频的系统时钟。

这个定时器有多种用途,包括车辆输入信号长度(输入捕获模式)或者产生波形输出(输出捕获,PWM,带死区插入的互补PWM输出等)

脉冲长度和波形周期可在通过定时器的预分频器或者RCC的预分频器在几个微秒时钟内调整。

高级控制定时器和通用定时器完全独立,不共享任何资源。

高级时钟控制定时器TIM1&TIM8的主要特性:

1、16位向上、向下、双向自动重装载计数器2、16位预分频器,分频值从1打655353、4个独立通道4、带死去输出的互补输出5、控制外部信号的同步电路6、刹车输入7、产生中断和DMA强求8、可外部触发

等等。。

TIM定时器确实很强大。至于怎么用,ST的手册不出奇的难看,完全没有条理可言。昨天看一天,都没明白是在说什么。配套的固件库也是,各种函数的介绍,函数名结构体定义完全没有逻辑可言。于是只能参照网友的介绍,从最基础的部分弄起。

参考资料见:STM32入门篇之通用定时器彻底研究

【实验1、TIM1的计时功能】

【实验描述】

利用TIM1的技术功能,产生2Hz的中断每次中断LED1反转,LED1反转频率为1Hz。

根据时钟配置,系统时钟为168MHz,APB2时钟为84MHz。TIM1挂接在APB2上,所以APB2 时钟为84MHz。

因此预分频系数设置成了10000即0x2710,自动重装载计数器ARR(TIM_Period)设置成了4200即0x1068。每次计数满产生中断。

中断频率f= 84MHz /4200 / 10000 = 2Hz

【代码实现】

1、首先开启TIM1的时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);

2、时基单元的初始化

RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period = 0x1068;
TIM_TimeBaseInitStructure.TIM_Prescaler = 0x2710;
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0x00;

TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStructure);

TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStructure);
TIM_ClearFlag(TIM1,TIM_FLAG_Update);   //必须先清除配置时候产生的更新标志
TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE);   //使能中断,中断事件为定时器工薪事件
TIM_Cmd(TIM1,ENABLE);    //使能定时器

3、中断处理函数

没什么可说的,反转LED灯而已。每次中断反转一次,2Hz的中断产生1Hz的闪烁。

中断名字是库里边定义的,跟TIM10全局中断公用。

void TIM1_UP_TIM10_IRQHandler(void)
{
  TIM_ClearFlag(TIM1,TIM_FLAG_Update);//进入中断先清除更新标志
  LEDTog(LED1);
}

之后我们就可以看到LED以大约1Hz的频率在闪烁了。

【实验2、强制输出模式实验】

百度来的强制输出模式的定义:在程序编程中,IO口一般都可以作为输入输出的。而有些数据要在让其执行时候必须执行,所以让其强制性的输出。这是IO口只能做一件事。

看完之后还是一头雾水。

简单 点说,就是不管当时IO输出的是什么,都能强制将其设为0或者为1.

【实验描述】

为了实验方便,这个实验使用TIM4的强制输出功能,点亮与GPIOD Pin13引脚相连的LED3。对于强制输出功能,高级定时器和通用定时器是完全一样的。

TIM4的CH2被复用在GPIOD 的Pin13。所以可以将这个输出强制为高,将LED点亮。

【代码实现】

1、首先将GPIO初始化为AF复用功能。

CM4的引脚复用功能和CM3的实现方法不同,要特别注意。按照CM3的写法将不会有输出
void TIM4_GPIO_Config(void)
{
  GPIO_InitTypeDef GPIO_initStructure;
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);
  
  GPIO_initStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_initStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_initStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
  GPIO_initStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_initStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_Init(GPIOD,&GPIO_initStructure);
  
  GPIO_PinAFConfig(GPIOD,GPIO_PinSource12,GPIO_AF_TIM4);
  GPIO_PinAFConfig(GPIOD,GPIO_PinSource13,GPIO_AF_TIM4);
  GPIO_PinAFConfig(GPIOD,GPIO_PinSource14,GPIO_AF_TIM4);
  GPIO_PinAFConfig(GPIOD,GPIO_PinSource15,GPIO_AF_TIM4);
}

2、TIM4的初始化

这里的时钟我没有计算,因为这个实验不太关注这个。

void TIM4_Config1(void)
{
  TIM4_GPIO_Config();
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
  
  TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInitStructure.TIM_Period =0x1068;
  TIM_TimeBaseInitStructure.TIM_Prescaler = 0x2710;
  TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0x00;
  TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure);
  TIM_ARRPreloadConfig(TIM4,ENABLE);
  
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Active;;  //设置成什么模式都行。
  TIM_OCInitStructure.TIM_Pulse= 1000;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OC2Init(TIM4,&TIM_OCInitStructure);

  TIM_Cmd(TIM4,ENABLE);
}

3、在主函数中强制输出。

初始化完成之后,在任何时候都能强制引脚电平,只需要一个函数即可:

TIM_ForcedOC2Config(TIM4,TIM_ForcedAction_Active);
这个函数设置TIM的CCMR1的OCxM位为101或者100实现输出的拉高或拉低

【实验三、比较输出】
一直不理解这里的比较是哪两个东西在进行比较。今天翻ST参考手册 reference manual发现这么句话:

当OCxM位为000时:The comparison between the output compare register  TIMx_CCR1 and the counter TIMx_CNT has no effect on the outputs.

即这里的“比较”是TIMx_CCR1和TIMx_CNT的比较。两个相等时,触发事件。这个事件发生时,TIm根据CCMRx寄存器的OCxM位进行输出。

OCxM不同设置的不同功能如下表所示:

OCxM[2..0]值功能
000对输出不影响
001相等时输出强制为1
010相等时输出强制为0
011输出反转
100不管是否相等,强制为0
101不管是否相等,强制为1
110PWM模式1(先正后负)
111PWM模式2(先负后正)

结合库中的定义,可以很方便地改变输出方式:

#define TIM_OCMode_Timing                  ((uint16_t)0x0000)
#define TIM_OCMode_Active                  ((uint16_t)0x0010)
#define TIM_OCMode_Inactive                ((uint16_t)0x0020)
#define TIM_OCMode_Toggle                  ((uint16_t)0x0030)
#define TIM_OCMode_PWM1                    ((uint16_t)0x0060)
#define TIM_OCMode_PWM2                    ((uint16_t)0x0070)

【实验现象】

LED周期闪烁

【代码实现】

只需要将上边的代码中的TIM_OCMode改成PWM即可。

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;

参数TIM_Pulse对这种模式没影响,TIM_OCPolarity只影响先输出的是低电平还是高电平。

【实验4、PWM输出】

这是输出部分的传统了。所有的开发板的TIM例子都是一个PWM输出。

时基单元好了,设置一下输出模式,反转时机(TIM_Pulse)。然后开启哥哥通道的OC即可。对于每个Tim的所有通道,由于时基配置是一样的所以只能改变各个通道的占空比。

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//PWM2也行
TIM_OCInitStructure.TIM_Pulse= 2000;//CCR,设置占空比。反转模式时候无效
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_ClearFlag(TIM4,TIM_FLAG_CC2);
TIM_OC2Init(TIM4,&TIM_OCInitStructure);
当然,引脚初始化不能少的。

【实验5、单脉冲方式】

只需要在上边的代码之后加一句:

TIM_SelectOnePulseMode(TIM4,TIM_OPMode_Single);

这样讲产生一个负脉冲,效果是LED灭一下之后保持常亮。如果要要让LED亮一下,输出正脉冲还需要改下输出的极性:

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;

到这里,TIM控制输出的实验基本就做完了。马上开始TIM控制输入部分,包括输入捕获、PWM输入等。


关键字:STM32F4  定时器  控制输出 引用地址:STM32F4 定时器TIM(1)定时器控制输出

上一篇:STM32F4 TIM输入捕获(测频)
下一篇:STM32F4 RTC

推荐阅读最新更新时间:2024-03-16 15:26

51单片机 定时器2计数示例
1 /*-- 2 名称:定时器0 3 论坛:www.doflye.net 4 编写:shifang 5 内容:通过定时让LED灯闪烁 6 */ 7 #include reg52.h //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 8 9 sbit LED=P1^2; //定义LED端口 10 11 /* 12 定时器初始化子程序 13 */ 14 void Init_Timer0(void) 15 { 16 TMOD = 0x01; //使用模式1,16位定时器,使用 符号可以在使用多个定时器时不受影响 17 TH0=0x00; //给定初值,这里使用定时器最大值从0开始计数
[单片机]
基于STC89C52的定时开关系统设计
定时开关在人们生活中扮演着重要的角色,给人们的生活带来了很大的方便。早在我国的古代采用滴水方式计时,当水滴到一定量时就引发机关报时。随着电子信息的快速发展,如今的电视机,电风扇等电器产品都附带了定时器,但是电子产品附带的定时器只适用于该用电器,并不能扩展使用到其他用电器上。 本文介绍了一种以STC89C52单片机、DS1302,1602液晶显示为核心,具备调节时间,设置开启时间与关闭时间的定时开关,其目的在于控制主电源,从而适用于能瞬间断电的一切电子产品,不仅能在规定的时间准时断开同时能在设定的时间内准时开启,给人们日常生活带来了极大的方便,如能通过应用此定时开关在上班期间定时煮饭,手机充电在适当时间将电源断开 1.系统设
[单片机]
基于STC89C52的定时开关系统设计
STM32之定时器中断控制LED闪烁
上篇博客我们是用延时函数实现了LED的闪烁,今天我们使用STM32的定时器来使LED闪烁。 关于32的定时器的种类,今天我在这先不做过多的说明,有时间我会再另写一篇博客来专门介绍32的定时器。今天我们使用32的定时器3来产生中断,以实现LED的闪烁。 今天我们需要配置的有LED和定时器,首先来配置LED,我们还是使用正点原子精英版开发板上的DS0来进行实验 配置LED的过程还是和上篇博客中点亮LED的方法一样,我就不再过多的说明,只贴下代码 led.c文件如下 #include led.h void led_init(void) { GPIO_InitTypeDef GPIO_InitStructure
[单片机]
STM32之<font color='red'>定时器</font>中断<font color='red'>控制</font>LED闪烁
STM32 Cubemax(六) —— STM32利用定时器编码器模式处理带编码器直流电机
前言 电赛延期了,趁有时间再写点东西吧. 编码器电机配置较为繁琐,本文较长,耐心看下去,一定有收获. 本文适合已经对编码器有所了解的同学观看,如果对编码器原理还不太理解,可以看看CSDN中别人讲编码器的,个人觉得已经讲的十分清楚了,这里主要讲解怎么使用Cubemax去使用编码器 一、硬件准备 本次实验使用的是带增量式AB相霍尔编码器的直流减速电机 简单介绍一下这款电机,减速比为1:30,即输出轴转一圈,电机内部实际转30圈,霍尔编码器为13位编码器,即电机每转,对于编码器有2的13次方的增量.(简单的说,上面那个霍尔编码器检测的圆盘,转一圈,检测13个脉冲) 2.电机所使用的电机驱动为应该大家都十分熟悉的L2
[单片机]
STM32 Cubemax(六) —— STM32利用<font color='red'>定时器</font>编码器模式处理带编码器直流电机
单片机定时器0、1演示程序
//实验例程 大虾(DX-51)学习板 定时器0、1使用例程 #include reg52.h #include intrins.h //MCU51嵌入式专业仿真器占用3个字节程序空间0x003b,0x003c,0c003d, //使用code数组声明防止编译器将函数定位于此三字节所在程序空间上 unsigned char code DX58 _at_ 0x003b; unsigned char count; unsigned char direction; unsigned char delay1; unsigned char delay2; void timer0(void) interrupt 1 using 0 { T
[单片机]
STM32F4CubeMX学习笔记之ADC不带中断
开发板:普中PZ6808L-F4 开发环境:keil5+CnbeMx 硬件资源:1个ADC 1个串口 功能说明:ADC采集电压通过串口打印输出 配置为: extern ADC_HandleTypeDef hadc1; void SystemClock_Config(void); int fputc(int ch,FILE *f) { uint8_t temp ={ch}; HAL_UART_Transmit(&huart1,temp,1,2); return(ch); } int main(void) { float ADC_Value; uint16_t adcx; HAL_Init
[单片机]
<font color='red'>STM32F4</font>CubeMX学习笔记之ADC不带中断
STM32F429 如何使用LCD
(1)硬件接口 ①要明白RGB888控制LCD 和8080控制方式的区别: TFT液晶显示器使用的是RGB接口,RGB接口包含24根RGB信号线、像素同步信号线、水平同步信号线、垂直同步信号线和数据使能信号线。 性能一般的芯片,通常不会自带液晶控制器,需要使用自带液晶控制器器的液晶屏,这类触摸屏通常使用ILI9341型号的液晶控制芯片。 STM32可以 通过 8080 接口发送命令编码控制 ILI9341 的工作方式,例如复位指令、设置光标指令、睡眠模式指令等等,具体的指令在ILI9341数据手册均有详细说明 ②RGB:https://blog.csdn.net/ctthuangcheng/article/details/
[单片机]
<font color='red'>STM32F4</font>29 如何使用LCD
由与非门构成的555定时器触发锁存电路
当工作在单稳态时,包括NE/SE555在内的商用集成定时器的应用有很多限制。这是因为它们不能在任一种触发脉冲条件下都可正常工作。只要输入脉冲小于设定时间周期,这些定时器就能很好工作并产生准确输出。但当输入脉冲大于定时器周期时,输出脉冲宽度就取决于输入脉冲延迟。因为某些实际应用要求定时器产生与触发输入无关的精确输出脉冲,所以定时器这种输出与输入相关的特性并满足需要。 可采用图中电路保证定时器在所有触发脉冲条件下都能正常工作。它利用逻辑器件固有的建立延迟,为555定时器提供输入触发锁存功能。对任何宽度大于10ns的输入脉冲来说,它确保定时器仅被触发一次。 该电路包括一个由与非门U1a到U1c组成的分立D型触发器。LS系列门的建立延迟
[模拟电子]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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