STM32高级控制定时器1的使用

发布者:幸福之舞最新更新时间:2017-11-02 来源: eefocus关键字:STM32  高级控制  定时器1 手机看文章 扫描二维码
随时随地手机看文章

STM32中的高级控制定时器(Tim1)是由一个16位的自动装载计数器组成,它由一个可编程预分频器驱动。

用途在于:测量输入信号的脉冲宽度(输入捕获),或者产生输出波形(输出比较,PWM,嵌入死区时间的互补PWM等)。

使用定时器预分频器和RCC时钟控制预分频器,可以实现脉冲宽度和波形周期从几个微秒到几个毫秒的调节。

具体如下:

16位上下,自动装载计数器。

16位可编程预分频器,计数器时钟频率的分频率的分频系数为1-65535之间任意数值,4个独立通道:

  • 输入捕获

  • 输出比较

  • PWM生成

  • 单脉冲模式输出

  • 死区时间可编程的互补输出

  • 使用外部信号控制定时器和定时器互连的同步电路

  • 在指定数目的计数器周期之后更新定时器寄存器

  • 刹车输入信号可以将定时器输出信号置于复位状态或者一个已知状态

如下事件发生时产生中断:

  • 更新:计数器向上溢出或者向下溢出,计数器初始化。

  • 触发事件(计数器启动,停止,初始化)

  • 输入捕获

  • 输出比较

  • 刹车信号输入

 

下面介绍一下采用tim1实现计数器的功能:

步骤一:进行定时器时钟启动:

void tim1_on()

{

  //Step1.时钟设置:启动TIM1 

RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);  

}

步骤二:实现对定时器的配置(对其内部寄存器进行配置初始化)

//Step2.TIM1模块设置 

void TIM_Configuration(void) 

{

TIM_TimeBaseInitTypeDef TIM_BaseInitStructure; 

//TIM_OCInitTypeDef TIM_OCInitStructure;  //比较PWM的时候用。

//TIM1 使用内部时钟 

//TIM_InternalClockConfig(TIM1);

//TIM1基本设置 

//设置预分频器分频系数71,即APB2=72M, TIM1_CLK=72/72=1MHz 

//TIM_Period(TIM1_ARR)=1000,计数器向上计数到1000后产生更新事件,计数值归零 

//向上计数模式 

//TIM_RepetitionCounter(TIM1_RCR)=0,每次向上溢出都产生更新事件 

TIM_BaseInitStructure.TIM_Period = 1000; 

TIM_BaseInitStructure.TIM_Prescaler = 71; 

TIM_BaseInitStructure.TIM_ClockDivision = 0; 

TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; 

TIM_BaseInitStructure.TIM_RepetitionCounter = 0; 

TIM_TimeBaseInit(TIM1, &TIM_BaseInitStructure);

//清中断,以免一启用中断后立即产生中断 

TIM_ClearFlag(TIM1, TIM_FLAG_Update); 

//使能TIM1中断源 

TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);

//TIM1总开关:开启 

TIM_Cmd(TIM1, ENABLE); 

}

根据上面的提示,我们可以看到1000*1/1MHz=1ms的时候进入中断一次。

步骤三:对定时器中断进行优先级别设置:

void NVIC_Configuration(void)

{  

#ifdef  VECT_TAB_RAM  

   

  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); 

#else  

   

  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   

#endif

//Step3.中断NVIC设置:允许中断,设置优先级 

NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQChannel;    //更新事件 

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;   //抢占优先级0 

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;          //响应优先级1 

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;             //允许中断 

NVIC_Init(&NVIC_InitStructure);                            //写入设置

}

将这里基本设施都能好了。

我们可以进行中断函数的设置,就是进入中断要干什么。

tim1中断有:

TIM1_BRK_IRQHandler(void) //tim1的暂停中断

TIM1_CC_IRQHandler(void)//tim1的捕获比较中断

TIM1_TRG_COM_IRQHandler(void)//tim1的触发

TIM1_UP_IRQHandler(void)//tim1的刷新中断和通讯中断。

我们使用的是向上计数的模式,所以要进入向上计数的中断:

void TIM1_UP_IRQHandler(void)

{

 GPIO_SetBits(GPIOB, GPIO_Pin_12); 

 delay_nms(100);                       //闪灯 

 GPIO_ResetBits(GPIOC, GPIO_Pin_8); 

 TIM_ClearITPendingBit(TIM1, TIM_FLAG_Update); //清中断

}

 

将所有的准备工作的做好了,我们开始写main函数()

如下:

RCC_Configuration();

 ledGPIO_init();

 //key_init();

 tim1_on();

 TIM_Configuration(); 

 NVIC_Configuration();

  

  while(1)

  { 

  }

这样就完成了定时器1的计数器功能。


关键字:STM32  高级控制  定时器1 引用地址:STM32高级控制定时器1的使用

上一篇:STM32 BKP备份寄存器介绍
下一篇:STM32 TIM1 PWM 输出

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

STM32电机方波】记录2——NVIC中断基本设置
NVIC概念:提供中断控制器,用于总体管理异常,称之为“内嵌向量中断控制器”。简单来说,就是MCU提供、处理内部中断的模块。 NVIC库函数: 中断优先级: 在配置NVIC之前得弄懂一个概念:中断优先级,即中断的执行顺序。中断优先级中,分为抢占式优先级(先占优先级)和响应优先级(从优先级)。抢断优先级,顾名思义,能再别人中断是抢占别人中断,实现中断嵌套。响应优先级则只能排队,不能抢在前面插别人的对,即不能嵌被嵌套。 STM32中指定优先级的寄存器为4位,其定义如下: 第0组:所有4位用于指定响应优先级 NVIC_PriorityGroup_0 = 选择第0组 第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级
[单片机]
【<font color='red'>STM32</font>电机方波】记录2——NVIC中断基本设置
STM32-FSMC机制的NOR Flash存储器扩展技术
引言 STM32是ST(意法半导体)公司推出的基于ARM内核Cortex-M3的32位微控制器系列。Cortex-M3内核是为低功耗和价格敏感的应用而专门设计的,具有突出的能效比和处理速度。通过采用Thumb-2高密度指令集,Cortex-M3内核降低了系统存储要求,同时快速的中断处理能够满足控制领域的高实时性要求,使基于该内核设计的STM32系列微控制器能够以更优越的性价比,面向更广泛的应用领域。 STM32系列微控制器为用户提供了丰富的选择,可适用于工业控制、智能家电、建筑安防、医疗设备以及消费类电子产品等多方位嵌入式系统设计。STM32系列采用一种新型的存储器扩展技术——FSMC,在外部存储器扩展方面具有独特的优
[单片机]
STM32 f407 3ADC 交替 实现 7.2Msps 采样率
想用CUBE配置然后用HAL库实现F407 3ADC交替采样实现7.2MSPS采样率,网上查了很多资料,3adc交替采样的资料很少,有用寄存器配置的,但是用HAL库的基本上没有找到,只能自己摸索。 首先是Pinout,值得注意的是3ADC 交替通常用到一样的通道,我用的是0通道。 然后是时钟的配置ADC最快时钟是36MHz,所以系统最快只能在144MHz,要做相应的更改 然后是ADC设置,这里面要选择模式是Triple interleaved Mode, DMA mode 2, delay设置为5cycle,ADC采样3cycle,Clock 要选择div2,这样能才能达到最快速度。 ADC2,3 配置相类似就略过
[单片机]
<font color='red'>STM32</font> f407 3ADC 交替 实现 7.2Msps 采样率
STM32中断式发送特点和RS485方向控制
STM32的数据发送有两个中断标志,一个是发送数据寄存器空标志,一个是发送完毕标志。两个标志都可以引起中断. 要以中断的方式发送一个数据包,流程是这样的: 1.设置RS485的方向为发送,使能发送寄存器空中断,使能完毕进入串口中断。 2.串口中断里读取串口状态,并填充一个数据到发送数据寄存器,硬件自动清除发送数据寄存器空标志,串口数据发送开始。 3.串口发送完一个数据,发送数据寄存器变空,再进入中断,继续填充下一个数据,直到最后一个数据填充完, 使能串口 发送完毕中断。 4.最后一个数据发送完毕,再次进入中断, 清除发送数据寄存器空标志,清除发送完毕中断标志,清除这两个中断标志 的使能位,设置RS485的方向为接收.
[单片机]
STM32单片机/小谈CAN通信
我认为CAN通信大概是所学通信里比较高级的了,说难也难,说不难也不难。本文只是结合stm32单片机来小谈一下,以此来帮助大家理解CAN通信。对于CAN通信的理论,原子哥的视频或者那本PDF《can入门教程》已经很详细全面了,我不能更好的给大家讲一遍了。如果你看了不懂,只能说看的遍数不够多。 CAN通信基本介绍 在当前的汽车产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求,各种各样的电子控制系统被开发了出来。由于这些系统之间通信所用的数据类型及对可靠性的要求不尽相同,由多条总线构成的情况很多,线束的数量也随之增加。为适应“减少线束的数量”、“通过多个 LAN,进行大量数据的高速通信”的需要, 1986 年德国电气商博世
[单片机]
STM32的IIC应用详解1
概要 IIC(IIC,inter-Integrated circuit),两线式串行总线,用于MCU和外设间的通信。 IIC只需两根线:数据线SDA和时钟线SCL。以半双工方式实现MCU和外设之间数据传输,速度可达400kbps。 多主机I2C总线结构 注意SDA和SCL两根总线需要上拉,使总线处于空闲状态。 IIC协议 空闲状态 协议规定,SDA和SCL同时为高电平时,总线处于空闲状态。上拉电阻保证电平处于高电平。 起始信号和停止信号 起始信号:SCL为高电平时,SDA电平发生高到低的跳变 停止信号:SCL为高电平时,SDA电平发生低到高的跳变 应答信号 发送器每发送完一个字节(8个脉冲),在第9个脉
[单片机]
STM32学习笔记(1):GPIO口的使用
摸索了很久之后终于把ARM开发板上的LED灯点亮了,虽然是很简单的一个IO口操作,但是由于以前从来都没有什么经验,所以浪费了很多时间,也查找了很多资料。现在可以操作IO口了,证明迈出了学习ARM的第一步。 实验平台清单如下: 开发板: 奋斗STRIVE V3 核心芯片: STM32F103VET6 开发环境: RealView MDK-ARM Version:3.50 PC操作系统: Windows 7 家庭普通版 仿真器: SEGGER J-Link 其中,STM32F103VET6芯片是基于ARM Cortex-M3内核的,具体技术参数请参考ST公司给出的芯片资料(http
[单片机]
使用C++封装库在MDK上建STM32开发工程
直接上一些片上硬件、一些常用器件的封装库GitHub链接: STM32F4:https://github.com/InfiniteYuan1/STM32F407DriverLib STM32F1:https://github.com/InfiniteYuan1/STM32f103DriverLib 用C++进行嵌入式程序开发,甚至是裸系统程序。开发起来比C语言更方便架构搭建与程序管理。 简单的一个例子使用USART #include USART.h USART com(1,115200); void main() { com test stringrn ; while(1) { } } 使用
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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