淮海能源车,绿色出行新潮流,引领未来出行革命
随着全球气候变化和环境问题日益严重,绿色出行成为全球共识。我国政府高度重视新能源汽车产业的发展,将其作为国家战略。淮海能源车作为新...
扫一扫用手机浏览
准时器(Timer)最根本的功效便是准时了,好比准时发送 USART 数据、准时采集 AD数据等等。假如把准时器与 GPIO 联合起来使用的话可以实现异常丰硕的功效,可以丈量输入旌旗灯号的脉冲宽度,可以临盆输出波形。准时器临盆 PWM 节制电机状况是工业节制广泛办法,这方面常识异常有需要深刻相识。STM32F4xx系列节制器有 2 个高档节制准时器、10 个通用准时器和 2 个根本准时器。
这里通用准时器的时钟频率是由APB1的分频系数决议,假如APB1的预分频系数是1,则通用准时器的时钟频率即是APB1的时钟频率,不然为APB1时钟的2倍。
时钟源
准时器要实现计数必需有个时钟源,根本准时器时钟只能来自内部时钟,高档节制准时器和通用准时器还可以选择外部时钟源或者直接来自其他准时器期待模式。我们可以经由过程 RCC 专用时钟设置装备摆设存放器(RCC_DCKCFGR)的 TIMPRE位设置所有准时器的时钟频率,我们一样平常设置该位为默认值 0,使得表中可选的最年夜准时器时钟为 90MHz,即根本准时器的内部时钟(CK_INT)频率为 90MHz。根本准时器只能使用内部时钟,当 TIM6 和 TIM7 节制存放器 1(TIMx_CR1)的 CEN 地位 1时,启动根本准时器,而且预分频器的时钟起源便是 CK_INT。对付高档节制准时器和通用准时器的时钟源可以来找节制器外部时钟、其他准时器等等模式,较为繁杂。
使用SystenInit函数初始化的时刻,各时钟频率如下:SYSCLK = 72MAHB时钟 = 72MAPB1时钟=36M以是APB1的分频系数=AHB/APB1=2由此可得CK_INT的时钟频率为2*36M = 72M.计数器的终极的频率还必要颠末PSC预分频计算能力获得
计数器
根本准时器计数进程主要涉及到三个存放器内容,分离是计数器存放器(TIMx_CNT)、预分频器存放器(TIMx_PSC)、主动重载存放器(TIMx_ARR),这三个存放器都是 16 位有用数字,即可设置值为 0至 65535。
准时器周期计算
准时变乱天生光阴主要由 TIMx_PSC 和 TIMx_ARR两个存放器值决议,这个也便是准时器的周期。好比我们必要一个 1s周期的准时器,详细这两个存放器值该若何设置。假设,我们先设置 TIMx_ARR存放器值为 9999,即当 TIMx_CNT从 0开端计算,刚好即是 9999时天生变乱,统共计数 10000次,那么假如此不时钟源周期为 100us即可获得刚好 1s的准时周期。接下来问题便是设置 TIMx_PSC存放器值使得 CK_CNT 输出为 100us 周期(10000Hz)的时钟。预分频器的输入时钟 CK_PSC为 90MHz,以是设置预分频器值为(9000-1)即可满意。
准时器初始化布局体详解
typedef struct { uint16_t TIM_Prescaler; // 预分频器 uint16_t TIM_CounterMode; // 计数模式 uint32_t TIM_Period; // 准时器周期 uint16_t TIM_ClockDivision; // 时钟分频 uint8_t TIM_RepetitionCounter; // 反复计算器 } TIM_TimeBaseInitTypeDef;
(1) TIM_Prescaler:准时器预分频器设置,时钟源颠末该预分频器才是准时器时钟,它设定TIMx_PSC 存放器的值。可设置规模为 0 至 65535,实现 1至 65536 分频。为啥要搞一个预分频器,那是由于体系时钟频率太快了,90MHZ啊,这一样平常人准时器可顶不住这么快的速率,以是分频一下,让他的给准时器的时钟频率少一点,仅此罢了。(2) TIM_CounterMode:准时器计数方式,可为向上计数、向下计数以及三种中心对齐模式。根本准时器只能是向上计数,即 TIMx_CNT只能从 0开端递增,而且无需初始化。(3) TIM_Period:准时器周期,现实便是设定主动重载存放器的值,在变乱天生时更新到影子存放器。可设置规模为 0至 65535。主动重载存放器的值:举个例子,你要往桶里面放水,水满了之后把它倒失落。那装满必要若干水呢。就给他设定一个值,滴水点100000滴才满,拿去倒失落。倒失落之后,在从新设置滴100000滴,满了再倒失落……(4) TIM_ClockDivision:时钟分频,设置准时器时钟 CK_INT 频率与数字滤波器采样时钟频率分频比,根本准时器没有此功效,不消设置。(5) TIM_RepetitionCounter:反复计数器,属于高档节制存放器专用存放器位,应用它可以异常容易节制输出 PWM 的个数。这里不消设置.
法式设置装备摆设
设置通用准时器,并发生响应中止,主要分为以下几个步调(以TIM3为例)
TIM3时钟使
3年嵌入式物联网进修资本整顿分享:C语言、Linux开发、数据布局;软件开发,STM32单片机、ARM硬件开发、物联网通讯开发、综合项目开发教程材料;笔试口试真题。点击下方插件免费领取↓↓↓
嵌入式物联网进修材料(头条)
设置TIM3_ARR和TIM3_PSC的值
设置TIM3_DIER容许更新中止
容许TIM3事情
TIM3中止分组设置
编写中止服务函数
void TIM3_Int_Init() { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能 TIM_TimeBaseStructure.TIM_Prescaler =7199; //设置用来作为TIMx时钟频率除数的预分频值 10Khz的计数频率 TIM_TimeBaseStructure.TIM_Period = 4999; //设置在下一个更新变乱装入运动的主动重装载存放器周期的值 计数到5000为500ms TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟朋分:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //依据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的光阴基数单元 TIM_ITConfig(TIM3, TIM_IT_Update,ENABLE); NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中止 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能 NVIC_Init(&NVIC_InitStructure); //依据NVIC_InitStruct中指定的参数初始化外设NVIC存放器 TIM_Cmd(TIM3, ENABLE); //使能TIMx外设 }
使用准时器之前都必需开启准时器时钟,根本准时器属于 APB1总线外设。APB1总线外设时钟=72M。我们把准时器设置主动重装载存放器 arr 的值为4999,设置时钟预分频器存放器psc的值为7199,则驱动计数器的时钟:
CK_CNT=APB1_CLK/(7199+1)=72M/7200=10K
则计数器计数一次的光阴即是:
1/CK_CNT=0.0001s=0.1ms=100us,
当计数器从0计数到4999时,发生一次中止,
则中止一次的光阴为:
100usX5000=0.0001sX5000=0.5s=500ms
也便是半秒钟。
void TIM3_IRQHandler(void) //TIM3中止 { if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //反省指定的TIM中止产生与否:TIM 中止源 { TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //肃清TIMx的中止待处置位:TIM 中止源 LED1=!LED1; } }
这个中止服务函数开端用if语句和TIM_GetITStatus()函数断定是否TIM3产生了中止,假如产生了中止就肃清TIM3的中止标记位。让LED1灯反转。
int main(void) { delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中止优先级分组2 LED_Init(); //初始化与LED衔接的硬件接口 TIM3_Int_Init(); //10Khz的计数频率,计数到5000为500ms while(1) { LED0=!LED0; delay_ms(200); } }
主函数起首延时函数初始化、设置中止优先级分组2、初始化与LED衔接的硬件接口、准时器3初始化。至此LED0就会每个0.5秒翻转一下。同时我们为了比拟在while函数中让LED1灯0.2秒翻转一下做对照。如今我们来用keil仿真一下,看看是不是LED0是0.2ms翻转一下,LED1是0.5ms翻转一下。
软件仿真
1.设置装备摆设keil仿真调试对象
2.打开调试, 进入调试界面后 ,打开logic analysis窗口,并设置PWM输出引脚
3.点击全速运行,察看示波器
原文作者:果果小师弟
原文题目:STM32第六章-TIM准时器详解
原文链接:https://mp.weixin.qq.com/s/6rHEp-dYb3iM_aUHjRZvrA