stm32定时器接力

cortex-M3的定时器只有16位,有时候计数大于16位时,用两个定时器组成32位就非常有用了,甚至可用4个接到64位的计数。

下面这代码,是在编码器2模式下,对编码器进行计数,TIM4为低16位计数器,TIM4溢出一次TIM3就加1,TIM3设置2次就溢出了。keil这东西对中文的支持太差了,注释复制过来全不能看了,不过也简单,这只是给出定时器的配置,想要中断的,还要配下中断。

void TIM4_External_Clock_CountingMode(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
/*配置接编码器的引脚*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
TIM_DeInit(TIM4);
TIM_TimeBaseStructure.TIM_Period = 65535;
TIM_TimeBaseStructure.TIM_Prescaler = 0x00;
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit( TIM4, &TIM_TimeBaseStructure); // Time base configuration
TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12,TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//编码器模式配置
TIM_SelectMasterSlaveMode(TIM4, TIM_MasterSlaveMode_Enable);//TIM4设置成主模式,这个不能少
TIM_SelectOutputTrigger(TIM4,TIM_TRGOSource_Update);//这个很重要,设置TIM4溢出时,产生更新事件,下面的TIM3就是用这个更新事件作为时钟源的
TIM_ClearFlag(TIM4, TIM_FLAG_Update);//
TIM4->DIER|=1<<0; //允许中断
TIM4->DIER|=1<<6; //使能中断
TIM4->CNT=0;
TIM_Cmd(TIM4,DISABLE);
}

void TIM4_to_TIM3(void)//
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_DeInit(TIM3);//
TIM_ITRxExternalClockConfig(TIM3, TIM_TS_ITR3);//选择TIM4作为触发源
TIM_TimeBaseStructure.TIM_Prescaler =0;//
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//
TIM_TimeBaseStructure.TIM_Period =2-1;//
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);

TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Gated);//作为从模式,被动触发嘛
TIM_SetCounter(TIM3,0);

TIM_ClearFlag(TIM3,TIM_FLAG_Update);//
TIM_ARRPreloadConfig(TIM3,DISABLE);//
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//

TIM_Cmd(TIM3,ENABLE);
}

时间: 2024-08-07 16:42:02

stm32定时器接力的相关文章

STM32定时器的预装载寄存器与影子寄存器之间的关系【转】

首先转载:   STM32定时器的预装载寄存器与影子寄存器之间的关系 本文的说明依据STM32参考手册(RM0008)第10版:英文:http://www.st.com/stonline/products/literature/rm/13902.pdf中译文:http://www.stmicroelectronics.com.cn/stonline/mcu/images/STM32_RM_CH_V10_1.pdf 在STM32参考手册的第13.14章中,都有一张定时器的框图,下面是第14章中定时

STM32 定时器用于外部脉冲计数(转)

源:STM32 定时器用于外部脉冲计数 STM32 定时器(一)——定时器时间的计算 STM32的定时器是灰常NB的,也是灰常让人头晕的(当然是对于白菜来说的). STM32中的定时器有很多用法: (一)系统时钟(SysTick) 设置非常简单,以下是产生1ms中断的设置,和产生10ms延时的函数: void RCC_Configuration(void) { RCC_ClocksTypeDef RCC_ClockFreq; SystemInit();//源自system_stm32f10x.c

第八章:STM32定时器

时间:2014年8月15日 一.定时器种类:      1.四个可同步运行的通用定时器(TIM2~TIM5),每个均有一个16位的自动加载递增/递减计数器.一个16位预分频器和4个独立的通道.       2.两个16位高级控制定时器(TIM1和TIM8)         特点:由一个可编程预分频器驱动的16为自动装载 计数器组成,与通用定时器有共同处,但功能更强大.       3.两个基本定时器(TIM6和TIM7)        特点:主要用于产生DAC触发信号,也可以当作通用的16为时基

[原创] STM32 定时器TIMx 编码器应用 函数 TIM_EncoderInterfaceConfig 分析

今天把STM32 定时器输入作为 编码器接口相关的 函数   TIM_EncoderInterfaceConfig ,好好分析了一遍 因为网上不少人对这个函数有问题 1 void TIM_EncoderInterfaceConfig(TIM_TypeDef* TIMx, uint16_t TIM_EncoderMode, 2 uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity) 3 { 4 uint16_t tmpsmcr = 0; 5 uint

STM32 定时器级联

根据参考手册给出的主/ 从定时器的例子 其实就是主定时器产生一个触发信号,让从定时器去接收这个触发信号,通过这个触发信号来让从定时器工作. 下面我们来看看我设置的从定时器 只需要配置 TIMx->SMCR 的TS[2:0] (Trigger selection)   选择是哪一个触发信号来触发从定时器工作 和位 SMS[2:0](Slave mode Selection)  选择外部时钟模式1-选中(TRGI)的上升沿驱动计数器 下面是STM32规定的内部触发连接的表格,如果某个产品中没有 相应

关于Stm32定时器+ADC+DMA进行AD采样的实现

Stm32的ADC有DMA功能这都毋庸置疑,也是我们用的最多的!然而,如果我们要对一个信号(比如脉搏信号)进行定时采样(也就是隔一段时间,比如说2ms),有三种方法: 1.使用定时器中断每隔一定时间进行ADC转换,这样每次都必须读ADC的数据寄存器,非常浪费时间! 2.把ADC设置成连续转换模式,同时对应的DMA通道开启循环模式,这样ADC就一直在进行数据采集然后通过DMA把数据搬运至内存.但是这样做的话还得加一个定时中断,用来定时读取内存中的数据! 3.使用ADC的定时器触发ADC转换的功能,

STM32定时器输出多路可调频率方波实现细节记录

最近有个项目要用到多达16路的可调频率的方波,于是想到用stm32的定时器输出比较翻转模式(TIM_OCMode_Toggle),一个定时器可以产生4路的信号输出.仔细阅读手册,并且参考了官方的例程,大体过程实现过程是:打开一个TIMx计数器,再打开TIMx的一路或几路输出比较器(共4路),都配置好以后,计数器开始计数,当计数器里的值和比较寄存器里的值相等时,产生输出比较中断,在中断中将计数器中的值读出,与翻转周期相加再写道比较寄存器中. 先以timer3为例,上代码: TIM3配置部分: 1

关于STM32 定时器 PWM 实时调节占空比时,预装载特性

最近在调试项目的时候遇到一个奇怪的现象:在调试状态下,给定时器捕获比较寄存器赋不同值,能产生不同占空比的波形(图1).反映到器件上也有不同的电压显示,但是在设备运行的时候,就不行了(图2). 图1 图2 纠结了N天后,也没有办法解决,只好乖乖的看STM32 控制器手册找找看了,结果还真找到了. 从图中可以看到,如果使能预装载特性,则数据会立即写入寄存器中,如果没有使能,那就得等到有事件(?)发生了.这我就明白了,在调试状态下,给寄存器赋值,不会产生什么影响,因为人的反应速度很慢,但是在运行的时候

stm32定时器计数功能

stm32的外部时钟源模式2和外部时钟源模式1都可以用来实现计数功能,他们的区别是什么呢? 以上2种模式对应不同的管脚输入: 外部时钟源模式2 <-->TIMx_ETR 外部时钟源模式1 <-->TIMx_CHx 从功能框图可以看到,ETR模式下多了一个分频器ETPS,搜索该分频器的寄存器,有如下解释:外部触发信号ETRP的频率必须最多是TIMxCLK频率的1/4.当输入较快的外部时钟时,可以使用预分频降低ETRP的频率. 每个定时器只能对一路信号计数,但每个定时器可同时捕捉4路信