TIM_基本定时器

定时器分类
基本定时器:两个,TIM6和TIM7,是只能向上计数的16位的计数器,智能定时,没有外部IO。
通用计数器:四个,TIM2\3\4\5,能够向上和向下计数的16位计数器,可以定时,输出比较,输入捕捉,每个定时器都有四个外部IO。
高级定时器:两个,TIM1\8,能够向上和向下计数的16位计数器,可以定时,输出比较,输入捕捉,还可以有三相电机互补输出吸纳后,每个定时器都有八个外部IO。

时钟源
在这里插入图片描述如图知,基本和通用定时器时钟由内部时钟(72M)经APB1预分频提供,由图知经过预分频器得到的时钟为36Mhz,则分频系数为2.又因为APB1 预分频系数等于 1,则频率不变,否则频率乘以 2,库函数中 APB1 预分频的系数是 2,即 PCLK1=36M。所以定时器时钟为72M
计数器时钟
PSC 是一个 16 位的预分频器,可以对定时器时钟 进行 1~65536 之间的任何一个数进行分频,即计数器时钟 = 定时器时钟 / (PSC+1)
计数器
计数器CNT是一个16位的计时器,只能向上计数,最大值是65535。当计数值达到重装载寄存器里的值时产生中断事件,计数器并清零。
自动重装载寄存器ARR
16位寄存器,装着计数器能计数的最大数值。当计数器计数到这个值时,当使能了计数器中断的话,定时器就产生溢出中断。
定时时间的计算
定时时间 = ARR里的值 * 1 / 计数器时钟

定时器初始化结构体

1 typedef struct { 
2 uint16_t TIM_Prescaler; // 预分频器
3 uint16_t TIM_CounterMode; // 计数模式
4 uint32_t TIM_Period; // 定时器周期
5 uint16_t TIM_ClockDivision; // 时钟分频
6 uint8_t TIM_RepetitionCounter; // 重复计算器
7 } TIM_TimeBaseInitTypeDef;

(1) TIM_Prescaler:定时器预分频器设置,时钟源经该预分频器才是定时器时钟。可设置范围为 0 至 65535,实现 1 至 65536 分频。
(2) TIM_CounterMode:定时器计数方式,可以是向上计数、向下计数以及三种中心对齐模式。基本定时器只能是向上计数,即 定时器 只能从 0 开始递增,并且无需初始化。
(3) TIM_Period:定时器周期,实际就是设定自动重载寄存器ARR的值,在事件生成时更新到影子寄存器。可设置范围为 0 至 65535。(影子寄存器,起到缓冲作用,实质是自动重装载寄存器。如果不使用影子寄存器,当往控制寄存器写数据时,将会直接起作用;使用影子寄存器后,当往控制寄存器写数据时,这些数据会装载到影子寄存器里,然后由影子寄存器发送数据。

解释这段代码static void AdvancedTim_Config(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; TIM_OCInitTypeDef TIM_OCInitStruct; TIM_BDTRInitTypeDef TIM_BDTRInitStruct; /*开时钟*/ RCC_APB2PeriphClockCmd(ADVANCED_TIM_CLK, ENABLE); /*配置时基参数*/ TIM_TimeBaseInitStruct.TIM_Prescaler=ADVANCED_TIM_PSC;/*预分频因子*/ TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;/*向上计数*/ TIM_TimeBaseInitStruct.TIM_Period=ADVANCED_TIM_ARR;/*周期*/ TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;/*Tdts:这里会与死区时间有关*/ TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;/*不使用重复计数器*/ /*写参数*/ TIM_TimeBaseInit(ADVANCED_TIM, &TIM_TimeBaseInitStruct); /*配置输出比较的参数*/ TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;/*PWM模式一*/ TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;/*主通道使能*/ TIM_OCInitStruct.TIM_OutputNState=TIM_OutputNState_Enable;/*互补通道使能*/ TIM_OCInitStruct.TIM_Pulse=ADVANCED_TIM_CCR;/*占空比*/ TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;/*主通道高电平为有效*/ TIM_OCInitStruct.TIM_OCNPolarity=TIM_OCNPolarity_High;/*互补通道高电平为有效*/ TIM_OCInitStruct.TIM_OCIdleState=TIM_OCIdleState_Reset;/*刹车后的输出状态*/ TIM_OCInitStruct.TIM_OCNIdleState=TIM_OCNIdleState_Reset; /*写参数*/ TIM_OC1Init(ADVANCED_TIM, &TIM_OCInitStruct); TIM_OC1PreloadConfig(ADVANCED_TIM, TIM_OCPreload_Enable); /*配置死区刹车寄存器*/ TIM_BDTRInitStruct.TIM_OSSRState=TIM_OSSRState_Enable; TIM_BDTRInitStruct.TIM_OSSIState=TIM_OSSIState_Enable; TIM_BDTRInitStruct.TIM_LOCKLevel=TIM_LOCKLevel_OFF; TIM_BDTRInitStruct.TIM_DeadTime=7; /*死区时间97ns*/ TIM_BDTRInitStruct.TIM_Break=TIM_Break_Enable;/*使能刹车功能*/ TIM_BDTRInitStruct.TIM_BreakPolarity=TIM_BreakPolarity_High;/*当刹车通道为高电平时停止输出*/ TIM_BDTRInitStruct.TIM_AutomaticOutput=TIM_AutomaticOutput_Enable; TIM_BDTRConfig(ADVANCED_TIM, &TIM_BDTRInitStruct); TIM_Cmd(ADVANCED_TIM, ENABLE); TIM_CtrlPWMOutputs(ADVANCED_TIM, ENABLE); }
07-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值