STM32之定时器

标签: STM32 定时
5人阅读 评论(0) 收藏 举报
分类:
一·定时器功能简介
区别于SYSTick一般只用于系统时钟的计时,STM32的定时器外设功能强大的超出了想象,STM32一共有8个都为16位的定时器,其中TIM6,TIM7是基本定时器;TIM2,TIM3,TIM4,TIM5是通用定时器;TIM1和TIM8为高级定时器。这些定时器使STM32具有定时,信号的频率测量,信号的PWM测量,PWM输出,三相6步电机控制及编码器接口等功能,都是专门为工控领域量身定做的。

1.。基本定时器TIM6/7是16位的只能向上计数的定时器,只能用于定时。就是累加的时钟脉冲数超过预定值时能触发中断或触发DMA请求,由于在芯片内部与DAC外设相连,可以通过触发输出驱动DAC,也可以作为其他通用定时器的其他基准。
2.通用定时器
相比之下,通用定时器TIM2 ~ TIM5 就比基本定时器复杂多了,除了基本的定时,它主要用来测量输入脉冲的频率,脉冲宽与输出PWM脉冲的场合,还具有编码器的接口,如下图:
3.高级定时器
TIM1和TIM8是两个高级定时器,它们具有基本,通用定时器的所有功能,还具有三相6步电机的接口,刹车功能及用于PWM驱动电路的死区时间控制,使得它非常适合于电机的控制。如图:

好的,说了介么多,下面我们用一个PWM 输出实例分析

本定时器PWM输出实验中我们用到了 GPIO,RCC,TIM外设,没有使用中断,下面来看main函数

/* 
* 函数名:main
* 描述  :主函数
* 输入  :无
* 输出  :无
*/


int main()
{
	
	/*TIM3 PWM波输出初始化,并使能TIM3 PWM输出*/
	   TIM3_PWM_Init();
	
	   while(1)
		 {}
			 
}   

主函数非常简单,调用用户函数TIM3_PWM_Init( ) 把TIM 初始化为PWM输出模式后,内核就把所有工作都交给了TIM外设,完全由TIM来控制GPIO引脚输出PWM波。

/* 
* 函数名:TIM3_PWM_Init
* 描述  :TIM3 输出PWM信号初始化,只要调用这个函数TIM3的四个通道就会有PWM信号输出
* 输入  :无
* 输出  :
* 调用  :外部调用
*/

void TIM3_PWM_Init(void)
{
	  TIM3_GPIO_Config();
	  TIM3_Mode_Config();
}

首先调用了TIM3_GPIO_Config() 对作为TIM外设通道复用的GPIO引脚进行初始化,再调用TIM3_Mode_Config( ) 对TIM外设进行初始化。

/*
* 函数名:TIM3_GPIO_Config
* 描述  :配置TIM3 复用输出PWM时用到的I/O
* 输入  :无
* 输出  :
* 调用  :内部调用
*
*/

static void  TIM3_GPIO_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	/* TIM3 clock enable*/
	// PCLK1经过2倍频作为TIM3的时钟等于72MHZ
	
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
	
	/* GPIOA and GPIOB clock enable*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB,ENABLE);
	
	/* GPIOA Configuration: TIM3 channel 1 and 2 as alternate function push-pull */
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 |GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	/* GPIOB Configuration : TIM3 channel 3and 4 as alternate function push-pull */
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
	
	GPIO_Init(GPIOB,&GPIO_InitStructure);
}

TIM3_GPIO_Config( )函数中,我们使能TIM3外设的时钟,并对TIM3通道相应的GPIO引脚做出相应的配置,使能GPIO时钟,分别是PA6,PA7,PB0,PB1 。它们被配置为复用输出,翻转频率为50MHZ

/*
* 函数名:TIM3_Mode_Config
* 描述  :配置TIM3 输出的PWM信号的模式,如周期,极性,占空比
* 输入  :无
* 输出  :无
* 调用  :内部调用
*
*/


static void TIM3_Mode_Config(void)
{
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef        TIM_OCInitStructure;
	
	/* pwm 信号电平跳变值*/
	
	u16 CCR1_Val = 500;
	u16 CCR2_Val = 375;
	u16 CCR3_Val = 250;
	u16 CCR4_Val = 125;


/*Time base comfiguration */
	TIM_TimeBaseStructure.TIM_Period = 999;
	//当定时器从0数到999,即为1000次,为一个周期
	TIM_TimeBaseStructure.TIM_Prescaler = 0;
	//设置预分频:不预分频,即为72MHZ
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	//设置时钟分频系数:不分频
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
	// 向上计数模式
	
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
	
	/* PWM1 Mode configuration:channel1 */
	
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
	//配置为PWM模式1
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse = CCR1_Val;
	//设置跳变值,当计数器计数到这个值时,电平发生跳变
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
	//当定时器计数值小于CCR1_Val时为高电平
	TIM_OC1Init(TIM3,&TIM_OCInitStructure); //使能通道1
	TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);
	
	/* PWM1 Mode configuration:channel2 */
	
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse = CCR2_Val;
	//设置通道二的电平跳变值,输出另一个占空比的PWM
	
	TIM_OC2Init(TIM3,&TIM_OCInitStructure); //使能通道2
	TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);
	
	/* PWM1 Mode configuration:channel3 */
	
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse = CCR3_Val;
	//设置通道3的电平跳变值,输出另一个占空比的PWM
	
	TIM_OC3Init(TIM3,&TIM_OCInitStructure); //使能通道3
	TIM_OC3PreloadConfig(TIM3,TIM_OCPreload_Enable);
	
	
	/* PWM1 Mode configuration:channel4 */
	
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse = CCR4_Val;
	//设置通道4的电平跳变值,输出另一个占空比的PWM
	
	TIM_OC4Init(TIM3,&TIM_OCInitStructure); //使能通道4
	TIM_OC4PreloadConfig(TIM3,TIM_OCPreload_Enable);
	
	TIM_ARRPreloadConfig(TIM3,ENABLE);
	//使能TIM 重载寄存器ARR
	
	/* TIM3 enable counter */
	TIM_Cmd(TIM3,ENABLE);
}
实验现象

以前我们都是通过J_LINK直接将我们的代码烧到开发板的Flash中去调试,现在要换成软件仿真,首先要设置一下我们的开发环境。
1.Target()Options 选项

2.选中Debug选项卡
3.选中Use Simulator选项卡,然后点击OK按钮

查看评论

微软 .NET

作者:阿新摘要:.NET计划是微软继推出DOS、Windows之后的又一个革命性的开发平台。在整个.NET框架中提出了大量的新概念和新技术。本文从软件开发的角度对.NET框架进行阐述,同时对.NET和...
  • laza
  • laza
  • 2001-02-28 14:31:00
  • 1019

STM32 通用定时器的一些概念解析

STM32一共有8个定时器,其中定TIM1和TIM8为高级控制定时器,除了具有通用定时器的功能外,还兼具控制功能,不仅能够输出PWM还可以采集编码器,驱动各种电机的功能。而基本定时器TIM6和TIM7...
  • u012351051
  • u012351051
  • 2016-05-24 17:17:02
  • 1178

STM32 学习笔记:TIME定时器详解

STM32 单片机的定时器的确很强大,参考说明书中就占了一百多页,占参考手册1/4 有多了。 STM32的定时器分了好几个类别,各个类别针对功能作用都不大相同。 分有: 一、高级定时器     ...
  • Cheatscat
  • Cheatscat
  • 2017-09-07 11:20:40
  • 797

stm32中定时器中断的套路

首先要提到的是,在stm32中,定时器相关的库函数主要集中在固件库文件 stm32f10x_tim.h 和 stm32f10x_tim.c 文件中,所以在进行定时器方面的处理时,需要加载这两个文件进来...
  • Drturner
  • Drturner
  • 2017-05-04 22:42:11
  • 1358

stm32 基本定时器最简单定时配置

stm32 定时器 配置
  • alfredseng
  • alfredseng
  • 2016-11-30 17:04:10
  • 3952

STM32之定时器的一般应用

STM32系列芯片拥有最少3个、最多8个16位的定时器,这是定时器通过可编程预分频器驱动的16位自动装载计数器构成。 定时器的主要功能有如下几个大点: 1.16位向上、向下、向上/向下自动装载计数器。...
  • Cherish511842885
  • Cherish511842885
  • 2016-11-02 10:09:16
  • 2432

STM32定时器同步模式 四种

typedef struct { uint32_t MasterOutputTrigger; //主模式选择。选择具体模式发送到TRG0上。 uint32_t MasterSlaveMo...
  • qq_30567891
  • qq_30567891
  • 2018-01-06 16:51:32
  • 739

STM32入门篇之通用定时器彻底研究

STM32的定时器功能很强大,学习起来也很费劲儿,本人在这卡了5天才算看明白。写下下面的文字送给后来者,希望能带给你点启发。在此声明,本人也是刚入门,接触STM32不足10天,所以有失误的地方请以手册...
  • zzm260270267
  • zzm260270267
  • 2015-10-10 21:46:33
  • 7993

STM32学习笔记之定时器的配置

转载于http://blog.csdn.net/u010661782/article/details/50281443 实验目的: 让蜂鸣器每隔一秒响一次; 实验步骤: ...
  • sinat_23338865
  • sinat_23338865
  • 2016-07-15 22:08:51
  • 2549

stm32 PWM & 定时器总结

介绍对stm32 time 的理解
  • ge23456789
  • ge23456789
  • 2015-05-22 08:54:08
  • 1802
    个人资料
    等级:
    访问量: 239
    积分: 94
    排名: 142万+
    文章分类
    文章存档