如何采用STM32中的控制定时器Tim1实现计数器功能

发布者:勾剑寒最新更新时间:2023-10-08 来源: elecfans关键字:STM32  Tim1  计数器功能 手机看文章 扫描二维码
随时随地手机看文章

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  Tim1  计数器功能 引用地址:如何采用STM32中的控制定时器Tim1实现计数器功能

上一篇:如何将STM32单片机中的函数调用到入口参数
下一篇:STM32F103F103与TFT液晶屏模块控制器的接口电路

推荐阅读最新更新时间:2024-11-04 21:02

如何开发功能齐全的QSPI驱动
1. 摘要 本篇笔记主要介绍,如何开发稳定可靠,功能齐全的QSPI驱动。 2. 准备工作 1, IAR 8.32.1 2, STM32Cube_FW_H7_V1.6.0 3. QSPI简介 4. QSPI驱动 在项目的开发中,我们经常会使用外挂Flash在做一些应用,而STM32H743带QSPI接口,可以用来外挂QSPI Flash,在之前的推送中我们以winbond华邦的W25Q256为例给大家说明了下QSPI的操作,借助ST的HAL库例程可以快速验证,不同型号的QSPI Flash会有一些参数和命令区别,大家应用时候要注意,例如美光和华邦的有的命令码就不同。ST的驱动里STM32H743的评估板是以美光的MT25T_QL
[单片机]
如何开发<font color='red'>功能</font>齐全的QSPI驱动
STM32控制3路超声波传感器
使用STM32定时器输入捕获模块控制3路超声波传感器 本次使用的超声波传感器是常见HC-SR04,该传感器常常使用在小型机器人和智能小车的避障系统中。 在上图中,5v和GND为模块提供电能,Trig用于触发模块测距,Echo用于接受返回电平信号。 其操作时序图如下: 如上图所示,STM32给Trig引脚一个超过10us的高电平,就可以使能模块内部的测距电路,模块会循环发出8个40kHz脉冲,发射出超声波,然后通过检测Echo引脚的高电平时间就可以测量出模块与障碍物之间的距离。其计算公式可表示如下: distance=340∗Echo高电平时间2distance=340∗Echo高电平时间2 模块驱动程序如下: void
[单片机]
STM32——硬件和软件I2C协议
I2C协议 I2C 通讯协议(Inter-Integrated Circuit)是由 Phiilps 公司开发的,由于它引脚少,硬件实现简单,可扩展性强,不需要 USART、CAN 等通讯协议的外部收发设备,现在被广泛地使用在系统内多个集成电路(IC)间的通讯。 对于通讯协议,我们以分层的方式来理解,最基本的是把它分为物理层和协议层。物理层规定通讯系统中具有机械、电子功能部分的特性,确保原始数据在物理媒体的传输。协议层主要规定通讯逻辑,统一收发双方的数据打包、解包标准。 I2C 物理层 物理层的特点 支持多个通讯主机和多个通信从机。 使用两条线 时钟线(SCL)和数据线(SDA)。 每个连接到总线的设备都有独立
[单片机]
<font color='red'>STM32</font>——硬件和软件I2C协议
STM8S系列单片机TIM1的PWM配置与TIM2的区别
为什么STM8的PWM用TIM1不能输出,TIM2可以,下面针对TIM1的PWM输出做了下列程序代码的编写。 STM8S系列单片机 PC1管脚来控制PWM的输出,即TIM1_CH1通道 PC2管脚来控制PWM的输出,即TIM1_CH2通道 PC3管脚来控制PWM的输出,即TIM1_CH3通道 //PWM初始化 void Driver_PWMON(u8 ch,u8 Num) { //开TIM1时钟 CLK- PCKENR1 |= CLK_PCKENR1_TIM1; //设置PWM频率,Fpwm=Fmaster/TIM2_ARR //这里Fpwm = 2000000/100 = 20K
[单片机]
STM32获取当前系统时钟
代码如下: RCC_ClocksTypeDef get_rcc_clock; //获取系统时钟状态 RCC_GetClocksFreq(&get_rcc_clock); //仿真的时候就可以在结构体get_rcc_clock中看见各个外设的时钟了 注意: 上述代码中的结构体RCC_ClocksTypeDef原型,可以在库文件stm32f10x_rcc.h中找到,如下: typedef struct { uint32_t SYSCLK_Frequency; /*! returns SYSCLK clock frequency expressed in Hz */ uint32_t HCLK_Frequen
[单片机]
STM32:STM32学习记录5: 外部中断
配置流程: 1:系统时钟初始化,包括系统时钟和要开放的IO口或者功能的时钟配置。 2:IO口初始化,包括引脚,速率,输入输出模式等。 3:NVIC 中断向量配置 ,中断向量基地址和优先级的配置。 4:EXTI 中断/事件控制器,使能或失能外部线路,使能的模式(事件请求和中断请求),边沿触发模式,状态等。 说明: 1:主函数写在main.c中,中断函数写在stm32f10x_it.c 中,找到相应的中断函数(一般都是空白),加入自己的中断代码即可。 2:中断函数名在startup_stm32f10x_xx.s中查阅 3:清除 EXT13 线路的挂起位 注意此处一定要清除!!!!!!!!在EXTI_PR
[单片机]
STM32—cubeMX+HAL库的SPI接口使用
摘要: 本文主要介绍STM32的SPI接口、cubeMX软件配置SPI接口和分析SPI相关代码。 STM32之SPI简介: (1)SPI协议【Serial Peripheral Interface】 串行外围设备接口,是一种高速全双工的通信总线。主要用在MCU与FLASH\ADC\LCD等模块之间的通信。 (2)SPI信号线 SPI 共包含 4 条总线。 SS(Slave Select):片选信号线,当有多个SPI 设备与 MCU 相连时,每个设备的这个片选信号线是与 MCU 单独的引脚相连的,而其他的 SCK、MOSI、MISO 线则为多个设备并联到相同的 SPI 总线上,低电平有效。 SCK (S
[单片机]
<font color='red'>STM32</font>—cubeMX+HAL库的SPI接口使用
STM32中断优先级实例
本例示范了如何使用嵌套向量中断控制器(Nested Vectored Interrupt Controller)来设置各个中断的优先级(Preemption Priority和SubPriority)。 设置2条外部中断线路(线路3和线路4)在每一个输入信号下降沿产生中断,开启SysTick中断。 这3个中断的优先级设置如下: EXTI Line3: PreemptionPriority = PreemptionPriorityValue SubPriority = 0 EXTI Line4: PreemptionPriority = 0 SubPriority = 1 Sys
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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