TIM1的配置

STM32学习笔记 & 高级定时器TIM1&TIM8 14 阅读详情

首先有一点需要注意:FWLib固件库目前的最新版应该是V2.0.x,V1.0.x版本固件库中,TIM1模块被独立出来,调用的函数与其他定时器不同;在V2.0系列版本中,取消了TIM1.h,所有的TIM模块统一调用TIM.h即可。网络上流传的各种代码有许多是基于v1版本的固件库,在移植到v2版本固件库时,需要做些修改。本文的所有程序都是基于V2.0固件库。

以下是定时器向上溢出示例代码:

//Step1.时钟设置:启动TIM1
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);

//Step2.中断NVIC设置:允许中断,设置优先级
NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQChannel;        //更新事件
NVIC_InitStructure.NVIC_IRQChannelPreemptionPrio rity =  0;      //抢占优先级0
NVIC_InitStructure.NVIC_IRQChannelSubPriority =  1;                    //响应优先级1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                          //允许中断
NVIC_Init(&NVIC_InitStructure);                                                          //写入设置

//Step3.TIM1模块设置
void TIM_Configuration( void)
{
TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;


//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);
}

//Step4.中断服务子程序:
void TIM1_UP_IRQHandler( void)
{
GPIOC->ODR ^= ( 1<< 4);                                                  //闪灯
TIM_ClearITPendingBit(TIM1, TIM_FLAG_Update);  //清中断
}


下面是输出比较功能实现TIM1_CH1管脚输出指定频率的脉冲:

//Step1.启动TIM1,同时还要注意给相应功能管脚启动时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

//Step2. PA.8口设置为TIM1的OC1输出口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

//Step3.使能TIM1的输出比较匹配中断
NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPrio rity =  1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority =  1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

//Step4. TIM模块设置
void TIM_Configuration( void)
{
TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;


//TIM1基本计数器设置
TIM_BaseInitStructure.TIM_Period =  0xffff;                                            //这里必须是65535 
TIM_BaseInitStructure.TIM_Prescaler =  71;                                              //预分频71,即72分频,得1M
TIM_BaseInitStructure.TIM_ClockDivision =  0;
TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_BaseInitStructure.TIM_RepetitionCounter =  0;
TIM_TimeBaseInit(TIM1, &TIM_BaseInitStructure);

//TIM1_OC1模块设置
TIM_OCStructInit(& TIM_OCInitStructure); 
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;                          //管脚输出模式:翻转
TIM_OCInitStructure.TIM_Pulse =  2000;                                                      //翻转周期:2000个脉冲
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;      //使能TIM1_CH1通道
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;              //输出为正逻辑
TIM_OC1Init(TIM1, &TIM_OCInitStructure);                                                //写入配置

//清中断
TIM_ClearFlag(TIM1, TIM_FLAG_CC1);

//TIM1中断源设置,开启相应通道的捕捉比较中断
TIM_ITConfig(TIM1, TIM_IT_CC1, ENABLE);

//TIM1开启
TIM_Cmd(TIM1, ENABLE);
//通道输出使能
TIM_CtrlPWMOutputs(TIM1, ENABLE);
}

Step5. 中断服务子程序
void TIM1_CC_IRQHandler( void)
{
u16 capture;
if(TIM_GetITStatus(TIM1, TIM_IT_CC1) == SET)
{
TIM_ClearITPendingBit(TIM1, TIM_IT_CC1 );
capture = TIM_GetCapture1(TIM1);
TIM_SetCompare1(TIM1, capture +  2000);
//这里解释下:
//将TIM1_CCR1的值增加2000,使得下一个TIM事件也需要2000个脉冲,
//另一种方式是清零脉冲计数器
//TIM_SetCounter(TIM2,0x0000);
}
}


关于TIM的操作,要注意的是STM32处理器因为低功耗的需要,各模块需要分别独立开启时钟,所以,一定不要忘记给用到的模块和管脚使能时钟,因为这个原因,浪费了我好多时间阿~~!转载于http://blog.sina.com.cn/s/blog_760ac6a90100w8yl.html

JScope采样问题 JScope RTT 模式下时间轴的处理 阅读详情

相关推荐

STM32F407 高级定时器TIM1 定时配置

因为在网上很难找到高级定时器TIM1 的配置,而且高级定时器的配置跟普通定时器不太一样,所以记录一下。 实验板子:正点原子探索者STM32F407ZGT6 TIM1、TIM8TIM11的时钟为APB2时钟的两倍即168M,TIM2TIM7、TIM12~TIM14的时钟为APB1的时钟的两倍即84M。 //初始化配置 void Timer1_Init(u16 arr,u16 psc) { TIM_T...

猴毛与叫喊 1万+

基于正点原子stm32的mini板的PWM输出的实验学习

本章将讲述PWM输出实验,小白总结,如有错误,请大神指教。 一、PWM的简介 PWM:脉冲宽度调制,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制,PWM 原理如下图所示: 我们假定定时器工作在向上计数PWM 模式,且当 CNT<CCRx 时,输出 0,当 CNT>=CCRx 时输出 1。那么就可以得到如上的PWM 示意图:当 CNT 值小于 CCRx 的时候,IO 输出低电平(0),当 CNT 值大于等于 CCRx 的.

m0_63737690的博客 1301

STM32高级定时器TIM1中断的细节配置

STM32高级定时器TIM1中断的细节配置

qq_60845288的博客 7403

TIM输入捕获-STM32

输入捕获模式下,当通道输入引脚出现指定电平跳变时,当前CNT的值将被锁存到CCR中,可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数。比如分辨率,1%就足够了,那ARR给100-1,这样PSC决定频率,CCR决定占空比。输入捕获,是接收到输入信号,执行CNT锁存到CCR的动作。当我们需要读取最新一个周期的频率时,直接读取CCR寄存器,然后按照fc/N,计算一下就行了。第二步,GPIO初始化,把GPIO配置成输入模式,一般选择上拉输入或者浮空输入模式。输入捕获,引脚是输入端口。

小柚子的博客 1632

F103高级定时器TIM_1 互补PWM配置过程--整理

第一步:确定所要输出PWM的GPIO 因为使用的是TIM1,那么TIM1所对应的GPIO可以从手册中找到,如下: 从上表中可以得到TIM1所能输出的端口,这里使用 " TIM1_CH1 -> PA8 "及其互补端口 “TIM1_CH1N -> PB13”。 第二步:GPIO的初始化 学过STM32的同学应该很明白,任何GPIO操作都必须对GPIO初始化。 GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClo

weixin_28883645的博客 2938

STM32高级定时器TIM1相关功能配置

TIM1_CHx:PWM的主通道 TIM1_CHxN:PWM互补输出通道 配置TIM1_CH3N-----PB1引脚,需要开启重映射,查阅《STM32中文参考手册》P119,PB1对应着TIM1_CH3N的部分重映射,综上:若要使PB1输出PWM波,需要配置TIM1开启重映射和PWM互补输出功能。代码如下: void TIM1_init(u16 arr, u16 psc) { GPIO_Ini...

qq_32076825的博客 5039

STM32定时器配置(TIM1、TIM2、TIM3、TIM4、TIM5、TIM8)高级定时器+普通定时器,定时计数模式下总结

STM32定时器配置(TIM1、TIM2、TIM3、TIM4、TIM5、TIM8)高级定时器+普通定时器,定时计数模式下总结 文章结构: ——>  一、定时器基本介绍 ——>  二、普通定时器详细介绍TIM2-TIM5 ——>  三、定时器代码实例 一、定时器基本介绍 之前有用过野火的学习板上面讲解很详细,所以直接上野火官方的资料吧,作为学习参考笔记发出来 二、普通定时器详细介绍TIM2-TIM5...

qq_20312079的博客 8624

STM32定时器(TIM1、TIM2、TIM3、TIM4、TIM5、TIM8)高级定时器+普通定时器,配置使用

假如APB1预分频为2(变成36MHZ),则定时器TIM2-5的时钟倍频器起作用,将变成2倍的APB1(2x36MHZ)将为72MHZ给定时器提供时钟脉冲。则这里:APB2的时钟为1分频故出来的APB2时钟还是72MHZ,TIM1对系统时钟APB2(72MHZ)再进行7200分频,然后计数重载初值设置为100,则一个定时周期Tout=(100-1+1)*(7200-1+1)/72,000,000=1/10=0.1s,即100ms为一个计数周期。8分频:CKINT=72MHZ/8x2=18MHZ;

FLYMCU的博客 1万+

STM32 TIM1输入捕获配置

最近做一个IRIG-B码对时的项目用到STM32的TIM1输入捕获功能,配置TIM1的输入捕获遇到很多坑,在这里总结下,希望对大家有帮助。 项目中用到的输入引脚为PE13,为TIM1_H3即TIM1的第3通道,这里提醒大家在使用引脚功能时最好查看引脚的重映象表,看是否要开启重映象,功能为捕获高电平脉宽,具体配置如下: 1.首先配置GPIO /* GPIO引...

发呆健将的博客 1万+

STM32高级定时器时基核心:ARR预装载与RCR周期倍增原理

自动重装载寄存器(ARR)和重复计数器(RCR)是嵌入式系统中实现高精度、确定性时序控制的基础硬件机制。ARR通过预装载机制(ARPE)分离软件写入与硬件生效时机,保障计数周期一致性;RCR则在高级控制定时器中引入可编程的更新事件节拍,将基础计数周期扩展为(ARR+1)×(RCR+1)倍,显著提升事件触发的时序确定性与CPU效率。这类机制广泛应用于电机驱动SVPWM同步、数字电源多相交错、高保真音频PWM调制等对实时性与相位精度要求严苛的工业场景。本文深入解析STM32高级定时器中ARR与RCR的协同工作原

weixin_29155599的博客 64

stm32 TIM1的CH1N~CH3N、CH1~CH4基本配置

TIM1的CH1、CH1N、CH2、CH2N、CH3、CH3N、CH4基本配置输出PWM tim.h #ifndef __TIM_H #define __TIM_H #include "stm32f4xx_hal.h" #include "led.h" #include "sys.h" /* * *TIM1 * */ extern u8 TIM1_flag1; //定时器标志位 void TIM1_Init(u16 arr,u16 psc); void TIM1_PWM_Init(u16 ar

sam的博客 1万+

STM32F4 TIM1输出PWM配置

芯片使用的是STM32F407VET6,在项目中使用PWM控制LCD背光亮度,硬件设计使用PB0--TIM1-CH2N,使用时出现PWM的输出受LCD显示内容相关函数影响 原因: 使用硬件PB0--TIM1-CH2N输出pwm 配置时配置了CH2、CH2N 解决方法: 单独使用CHxN不使用CHx时应将CHx设为禁用 否则可能出现问题 为确保安全 需单独使用CHx时 也应将CHxN设置为禁用 单独使用CHxN时配置代码: void TIM1_CH2N_PWM_Init(u32 arr.

zuoxi4621的博客 5180

STM8S003F3 使用TIM1_CH1与TIM1_CH2配置PWM输出

最近一个项目,用的是STM8S003F3这款小型的MCU,使用TIM1_CH1 TIM_CH2作为PWM输出时,遇到了问题,代码下载后,PWM是没有任何输出的。用示波器看,应该是PWM没有任何输出。 首先在网上找了下资料,又看了官方的例程,感觉代码没有问题。后来仔细查看问题,终于找到解决的方案。 原来根据STM8S003F3的数据手册,需要配置一个选项字节才能使能TIM...

坚韧与专注 1万+

【STM32】高级定时器TIM1计数中断配置

蜂鸣器模块接在GPIOF的PIN0上,100ms电平反转一次,0.2s一个周期,鸣叫一次,50%的占空比。之前Delay初始化的时候,晶振被8分频了,变成9MHz的频率了吗,why?这里可以用逻辑分析仪抓取一下PF0引脚的波形……给蜂鸣器新建一个Beep.c和Beep.h。有源蜂鸣器:内部自带震荡体,通电就响。记录高级定时器TIM1的配置过程。通过蜂鸣器鸣叫展示代码。

weixin_63135906的博客 6979

小程序强制更新避坑指南:手把手教你实现无缝升级

本文详细解析小程序强制更新的实现方法,重点介绍wx.getUpdateManager API的使用技巧,帮助开发者规避冷热启动机制下的版本管理陷阱。通过实战案例展示如何设计多级更新提示策略,确保用户无缝升级,提升小程序版本更新率。

star的博客 281

STM32N6570-DK ISP调试

将下载线接入STLINK V3EC接口,将BOOT1拨码拨至右边,即将其置为H,上电或已经上电的按复位,打开STM32CubeProgrammer,设置start address:0x70000000。板子消耗电流较大,即使缩短数据线接了USB供电依然不能正常点亮显示屏,最终通过板上CN2端子加了外部5V供电,仍然需要560mA的外部电流。3.烧录bin文件:STM32N6_ISP_IQTune_App_revC01-v1.1.0-trusted.bin。

liu的博客 1065

高级定时器 tim1 tim8 一般中断配置,以防以后忘记

void Timer8_Init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE); //时钟使能 TIM_TimeBase...

qq_21489487的博客 5386

centos+apache+subversion+LDAP

yum install subversion 报错:[Errno 14] HTTP Error 416 - Requested Range Not Satisfiable 正在尝试其它镜像。 zaici

qq_41566366的博客 1546

STM32高级定时器TIM1的PWM配置避坑指南

本文详细解析STM32高级定时器TIM1的PWM配置要点,重点指出其与通用定时器的关键差异,特别是必须使能主输出(MOE)位才能产生PWM信号。内容涵盖时钟配置、输出模式初始化、互补输出设置及死区时间配置等避坑指南,并提供完整代码示例和调试技巧。

z5a6b的博客 1070

嵌入式工程师成长之路(1)——元件基础(试读版)

上拉电阻阻值选错导致MCU反复重启?0欧电阻竟然能“背锅”信号干扰?高精密采样电阻的温漂毁了整个控制系统?——这些问题,都是基础不牢!优快云硬件领域头部博主十年经验汇总,涵盖电阻分类、封装、实战选型、避坑指南,附带职业进阶路径,助你从小白进阶为“电路医生”!

云轩阁 34万+

基于STM32设计的指纹考勤机_348

随着信息化管理需求的日益增长,传统的人工考勤方式已难以满足现代社会对高效、精准和安全的考勤管理要求。为解决这一问题,本项目设计并实现了一款基于STM32的指纹考勤机系统。该系统采用AS608指纹识别模块进行人员身份识别,ESP8266无线模块实现与上位机APP的通信,支持人员信息录入、考勤时间段设置、考勤记录保存与查询等功能。系统通过SQLite数据库存储考勤数据,并提供导出EXCEL表格功能,方便数据管理与统计分析。该系统具有高效的考勤管理能力和良好的用户交互体验,能够广泛应用于企业、学校等机构的考勤管理

525

STM8S207 TIM1、TIM2的PWM模式配置

TIM1配置: void TIM1_TimeBaseInit(uint16_t TIM1_Prescaler, TIM1_CounterMode_TypeDef TIM1_CounterMode, uint16_t TIM1_Period, uint8_t TI...

zhai17863966493的博客 2981

5、模型预测控制与分布式MPC控制结构解析

本文深入解析了模型预测控制(MPC)中的双模式预测控制及其稳定性理论,并探讨了分布式MPC的不同控制结构。内容涵盖MPC的基本公式化、性能指标、优化问题以及相关算法步骤,同时比较了集中式MPC、单层分布式MPC和分层分布式MPC的优缺点和适用场景。最后通过流程图和表格形式总结了双模式MPC的算法步骤和控制结构选择思路,并提供了操作建议,以帮助在实际工业系统中更好地应用MPC技术。

tea88的博客 170
上一篇: RC电路(积分电路,微分电路)
下一篇: STM32学习笔记6(TIM模块定时器)
小白study
博客等级 码龄12年 659粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值