邢台做网站推广报价,eclipes网站建设教程,firework做网站教程,在哪个网站做注册资本变更定时器概述
1、软件定时原理
使⽤纯软件的⽅式实现定时功能。
存在的问题#xff1a;定时不太精准。CPU死等。
1#xff09;压栈出栈需要花费时间
2#xff09;ARM流⽔线体系架构的原因
2、定时器定时原理
使用精准的时基#xff0c;通过硬件方式#xff0c;实现定…定时器概述
1、软件定时原理
使⽤纯软件的⽅式实现定时功能。
存在的问题定时不太精准。CPU死等。
1压栈出栈需要花费时间
2ARM流⽔线体系架构的原因
2、定时器定时原理
使用精准的时基通过硬件方式实现定时功能
时基单元
分频模块(PSC)对外来的时钟进⾏分频。
计数模块(CNT)对来⾃分频模块输出的时钟脉冲进⾏计数。
⾃动重装载模块(ARR)它存储的是计数器的⽬标值计数器每次累加就⽐较⼆者⼆者相等计数器溢
出当计数器溢出时然后清零计数器寄存器。
核心计时器
特性表
常规定时器个数TIM1 ~ TIM14 ⼗四个定时器
基本定时器TIM6 TIM7
通⽤定时器TIM2-TIM5 TIM9-TIM14
⾼级定时器TIM1 TIM8
定时器类型定时器计数模式预分频系数产生DMA请求捕获/比较通道互补输出基本定时器TIM6,TIM7161-65536可以0无通用定时器TIM2,TIM3,TIM4,TIM5161-65536可以4无高级定时器TIM1,TIM8161-65536可以4有 3、定时器分类 计数模式和溢出条件 基本定时器
1、概念
STM32F407 基本定时器由时钟源、控制器、时基单元组成。 有两个基本定时器 TIM6 和 TIM7它们
的功能完全相同资源是完全独⽴的可以同时使⽤。
2、特性
16位的递增计数器。计数值0-65535
16位的预分频器。分频系数1-65536
可以发出⼀个触发信号触发DAC进⾏数模转换
在事件更新时计数器溢出可以产⽣中断 和 DMA请求
框图
溢出条件CNT ARR
时钟源
定时器的核⼼是计算器要实现计数功能⾸先要给它⼀个时钟源。基本定时器时钟挂
载在 APB1 总线所以它的时钟来⾃于 APB1 总线但是基本定时器时钟不是直接由 APB1总线直
接提供⽽是先经过⼀个倍频器。
当 APB1 的预分频器系数为 1 时这个倍频器系数为 1当 APB1 的预分频器系数≥2
分频时这个倍频器系数就为 2 。
我们知道APB的分频系数为≥所以倍频系数为基本定时器的时钟源为 42
84MHZ
控制器控制定时器复位、使能、计数等功能之外还可以⽤于触发 DAC 转换。
时基单元
fCK_CNT的时钟计算 fCK_PSC / (PSC[15:0]1)
预分频器寄存器(TIMx_PSC)可以在运⾏过程中修改它的数值新的预分频数值将在下
⼀个更新事件时起作⽤。
影⼦寄存器实际起作⽤的寄存器不可直接访问。当更新事件发⽣时值才写⼊影⼦
寄存器可配置。
定时器中断配置 1开启TIM时钟 RCC_APB1PeriphClockCmd();//根据不同定时器选择对应时钟函数 2配置NVIC NVIC_Init(); 3配置TIMTIM_TimeBaseInit(); 4开启中断。TIM_ITConfig(); 5使能定时器TIM_ITCmd(); 6重写中断函数TIM6_DAC_IRQHandler 7清除中断标志位。void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG); 时间 Tout溢出时间即定时多长时间 TIMxCLK定时器时钟频率
//定时器时钟源 TIMxCLK 2 * PCLK1 25 // PCLK1 HCLK / 4 26 // TIMxCLKHCLK/2SystemCoreClock/284MHz
ARR定时器周期初始化结构体时用 TIM_Period 表示 PSC预分频大小初始化结构体时用 TIM_Prescaler 表示 比如我们需要一个 1s 周期的定时器具体这两个寄存器值该如何设置。
假设我们先设置 TIMx_ARR寄存器值为 9999 即当 TIMx_CNT 从 0 开始计算刚好等于 9999 时生成事件总共计数 10000 次那么如果此时时钟源周期 为 100us 即可得到刚好 1s 的定时周期。
接下来问题就是设置 TIMx_PSC 寄存器值使得 CK_CNT 输出为 100us 周期 (10000Hz) 的时钟。预分频器的输入时钟 CK_PSC 为 84MHz所以设置预分频器值为 (8400-1) 即可满 足。
实验
使⽤基本定时器实现定时中断的功能当计数事件溢出时点亮LED。
void Tim_Init()
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);NVIC_InitTypeDef NVIC_InitStruct1;NVIC_InitStruct1.NVIC_IRQChannelTIM6_DAC_IRQn;NVIC_InitStruct1.NVIC_IRQChannelCmdENABLE;NVIC_InitStruct1.NVIC_IRQChannelPreemptionPriority0;NVIC_InitStruct1.NVIC_IRQChannelSubPriority1;NVIC_Init(NVIC_InitStruct1);TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct1;TIM_TimeBaseInitStruct1.TIM_Period4999;TIM_TimeBaseInitStruct1.TIM_Prescaler8399;TIM_TimeBaseInit(TIM6,TIM_TimeBaseInitStruct1);TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE); //定时中断配置TIM_Cmd(TIM6,ENABLE); //使能定时器
}
void TIM6_DAC_IRQHandler(void) //重写定时器中断函数
{if(TIM_GetITStatus(TIM6,TIM_IT_Update) SET){GPIO_ToggleBits(GPIOF,GPIO_Pin_9); //翻转电平GPIO_ToggleBits(GPIOF,GPIO_Pin_10);TIM_ClearITPendingBit(TIM6,TIM_IT_Update);}
}
int main()
{Tim_Init();Led_Init();Led1_Close();Led2_Close();while(1){TIM6_DAC_IRQHandler();}
}