stm32定时器时钟源时钟选择,重点是外部时钟源1模式的理解

发布者:科技思想家最新更新时间:2022-06-01 来源: eefocus关键字:stm32  定时器  时钟源  外部时钟 手机看文章 扫描二维码
随时随地手机看文章

有意义的参考

TI与ITRX的区别参考:https://blog.csdn.net/gtkknd/article/details/39292517


解析参考:https://blog.csdn.net/qq_33559992/article/details/103728903?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2


基础了解

时钟选择计数器时钟可由下列时钟源提供:


● 内部时钟(CK_INT)


● 外部时钟模式1:外部输入脚(TIx)


● 外部时钟模式2:外部触发输入(ETR)


● 内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器


在平常使用中我们系统复位 000 默认使用内部时钟源


内部时钟源

从时钟选择框图中可以看到,内部时钟源(CK_INT)来自RCC的TIMx_CLK,即定时器本身的驱动时钟。


当禁止从模式控制器(TIMx_SMCR寄存器的SMS=000),则预分频的时钟源CK_PSC由内部时钟源(CK_INT)驱动。定时器的实际控制位为CEN位、DIR位和UG位,并且只能被软件修改(UG位仍被自动清除)。只要CEN位被置1,预分频器的时钟CK_PSC就由内部时钟CK_INT提供。  


通用定时器的内部时钟来源于APB1总线时钟,但是通用定时器的内部时钟是根据APB1总线时钟是否分频来决定的,如果APB1总线时钟预分频系数为1,则通用定时器的内部时钟就是APB1总线时钟;但是如果APB1总线时钟的分频系数为2,则通用定时器的内部时钟就是APB1总线时钟的2倍。


下图显示了控制电路和向上计数器在一般模式下,不带预分频器时(分频系数为0)的操作。

如图所示,只有当CEN位被置位高电平的时候,预分频器的时钟CK_PSC和计数器的时钟CK_CNT才开始工作。


外部时钟源1

来自定时器自身输入通道1或通道2的输入信号,经过极性选择和滤波以后生成的触发信号,连接到从模式控制器,进而控制计数器的工作;


来自通道1的输入信号经过上升沿、下降沿双沿检测而生成的脉冲信号进行逻辑相或以后的信号就是TI1F_ED信号,即TI1F_ED双沿脉冲信号。


相关函数

TIM_TIxExternalClockConfig(TIM2, TIM_TS_TI1FP1,TIM_ICPolarity_Rising, 0);

//设置 TIMx 触发为外部时钟(从四个通道引脚引入)

//触发源选择:

//TIM_TIxExternalCLK1Source_TI1ED: 双边沿的Timer Input 1

//TIM_TIxExternalCLK1Source_TI1: 滤波后的Timer Input 1

//TIM_TIxExternalCLK1Source_TI2: 滤波后Timer Input 2

//设置输入捕获的边沿:

//TIM_ICPolarity_Rising

//TIM_ICPolarity_Falling


//TIM_ICPolarity_BothEdge


//设置滤波设置:

//必须在0x0与0xF之间


代码示例

时钟源对频率进行计数


#include "timer.h"

#include "led.h"

//     

//将PB5与tim2-ch1的pa0短接

pb5为时钟源对频率进行计数


void TIM2_Int_Init( u16 arr,u16 psc ){


    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

    NVIC_InitTypeDef NVIC_InitStructure;

   GPIO_InitTypeDef  GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;               

    GPIO_InitStructure.GPIO_Mode =     

     GPIO_Mode_IN_FLOATING;            

    GPIO_Init(GPIOA, &GPIO_InitStructure);   


    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); 

        TIM_DeInit(TIM2);

    TIM_TimeBaseStructure.TIM_Period = arr;     

    TIM_TimeBaseStructure.TIM_Prescaler =psc; 

    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; 

    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  

    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); 


    TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); 

  /*重点*/  

 TIM_TIxExternalClockConfig(TIM2,TIM_TIxExternalCLK1Source_TI1,TIM_ICPolarity_Falling,15);//设置输入滤波和边沿检测

    TIM_Cmd(TIM2, ENABLE);  

//

}


void TIM3_Int_Init(u16 arr,u16 psc){


    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;


    NVIC_InitTypeDef NVIC_InitStructure;


    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); 

    TIM_TimeBaseStructure.TIM_Period = arr; 

    TIM_TimeBaseStructure.TIM_Prescaler = psc; 

    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; 

    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  

    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); 



    TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); 

    NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 

    NVIC_Init(&NVIC_InitStructure);  


    TIM_Cmd(TIM3, ENABLE);               

}


void TIM3_IRQHandler(void){


    if (TIM_GetITStatus(TIM3, TIM_IT_Update)!=RESET){

                        LED0=!LED0;

    }

    TIM_ClearITPendingBit(TIM3,TIM_IT_Update); 

}


#include "led.h"

#include "delay.h"

#include "key.h"

#include "sys.h"

#include "usart.h"

#include "timer.h"


int main(void)

{


delay_init(); //延时函数初始化

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级

uart_init(115200); //串口初始化为115200

LED_Init(); //LED端口初始化

TIM3_Int_Init(4999,7199);//10Khz的计数频率,计数到5000为500ms

TIM2_Int_Init(10,0);


while(1)

{

//LED0=!LED0;

delay_ms(400);

printf("Count=%dn",TIM_GetCounter(TIM2));

}


 

}


//TIM_TIxExternalCLK1Source_TI1: 滤波后的Timer Input 1

//TIM_TIxExternalCLK1Source_TI2: 滤波后Timer Input 2


这两个选项T1是CH1通道   T2经测试CH1与CH2通用


大概是这个异或的原因

外部时钟源模式2

来自于 外部触发脚[ETR脚] 经过极性选择、分频、滤波以后的信号,经过触发输入选择器,连接到从模式控制器。当然分频和滤波不是必需的,可以根据外来信号频率高低及信号干净度来决定。


ETR功能较全可以完成T1的工作但仅限于CH1通道,可以经行分频


相关函数

TIM_ITRxExternalClockConfig(TIM2, TIM_TS_ITR3);

//设置定时器工作于从模式,时钟源为其他定时器的输出分频.此时钟源无滤波

//TIM_TS_ITR0 TIM内部触发0 TIM1

//TIM_TS_ITR1 TIM内部触发1 TIM2

//TIM_TS_ITR2 TIM内部触发2 TIM3

//TIM_TS_ITR3 TIM内部触发3 TIM4


 TIM_TS_TI1F_ED

TIM_TS_TI1FP1

 TIM_TS_TI2FP2

 TIM_TS_ETRF

 

TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_DIV2,TIM_ExtTRGPolarity_NonInverted, 0x0);

//外部时钟模式1.需要设置预分频,以及外部触发极性:滤波

//TIM_ExtTRGPolarity_Inverted TIM外部触发极性翻转: 低电平或下降沿有效 //TIM_ExtTRGPolarity_NonInverted TIM外部触发极性非翻转:高电平或上升沿有效


代码示例

由第一个示例更改,功能一致main不变


void TIM2_Int_Init( u16 arr,u16 psc ){


    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

    NVIC_InitTypeDef NVIC_InitStructure;

        GPIO_InitTypeDef  GPIO_InitStructure;

     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); 

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;               

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;            

    GPIO_Init(GPIOA, &GPIO_InitStructure);     

    

        TIM_DeInit(TIM2);

    TIM_TimeBaseStructure.TIM_Period = arr;     

    TIM_TimeBaseStructure.TIM_Prescaler =psc; 

    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; 

    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  

    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); 


    TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); 


/*重点*/

        TIM_ITRxExternalClockConfig(TIM2,TIM_TS_ITR3);//高级定时器开启

    TIM_ETRClockMode2Config(TIM2,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted,0)//配置外部时钟2的模式;

    TIM_SetCounter( TIM2,0 );

/

 

    TIM_Cmd(TIM2, ENABLE);  


}


void TIM2_IRQHandler(void){    


    if (TIM_GetITStatus(TIM2, TIM_IT_Update)!= RESET){


    }

    TIM_ClearITPendingBit(TIM2,TIM_IT_Update);    

}


关键字:stm32  定时器  时钟源  外部时钟 引用地址:stm32定时器时钟源时钟选择,重点是外部时钟源1模式的理解

上一篇:STM32通定时器时间设置步骤和计算公式方法寄存器值
下一篇:STM32F10x_RTC日历STM32F1系列芯片的RTC功能

推荐阅读最新更新时间:2024-11-20 17:29

STM8与汇编语言(7)--8位定时器应用之二
上次写的是用STM8单片机中的8位定时器作为软件延时,采用的是查询方式。在实际系统中,定时器的应用,更多的是采用中断方式,下面的代码就给出8位定时器在中断方式下的应用。 实验程序首先初始化驱动LED的端口,然后初始化8位的定时器4,最后启动中断允许,要记住,一定要将中断服务程序的入口地址填写到中断向量表中,并且要根据中断向量号在正确的位置上填写。 同样还是利用ST的开发工具,生成一个汇编程序的框架,然后修改其中的main.asm,修改后的代码如下。 编译通过后,下载到开发板,运行程序,可以看到LED在闪烁,或者用示波器可以在LED引脚上看到方波。 stm8/ #include mapping.inc
[单片机]
使用DFU方案实现STM32单片机的高级开发
什么是 DFU DFU全称为Device Firmware update,是ST官方推出的一个通过USB接口进行IAP升级的方案,同串口ISP一样,他们都集成在了芯片内部的Bootloader区段,可以通过配置boot引脚来启动。(具体可参照ST文档:AN2606)。不过内置DFU的芯片大部分型号都比较新,如果你用的型号没有内置DFU程序,没关系我们也可以通过CubeMX来快速生成和移植一个DFU功能程序到你的Flash中来使用。 DFU方案完整的组件包括单片机DFU Demo代码、PC端升级程序、PC端Demo代码以及相关资料手册等。通过使用DFU方案,我们可以快速的集成升级功能到开发的产品中,同时还能够快速的开发与之配套的
[单片机]
使用DFU方案实现<font color='red'>STM32</font>单片机的高级开发
stm32 ssD1306 OLED驱动架构
#include oled.h #include stdlib.h #include oledfont.h #include delay.h //OLED的显存 //存放格式如下. // 0 1 2 3 ... 127 // 0 1 2 3 ... 127 // 0 1 2 3 ... 127 // 0 1 2 3 ... 127 // 0 1 2 3 ... 127 // 0 1 2 3 ... 127 // 0 1 2 3 ... 127 // 0 1 2 3 ... 127 u8 OLED_GRAM ; //更新显存到LCD void OLED_Re
[单片机]
STM32驱动超声波模块测距
HC-SR04超声波测距模块可提供2cm到400cm的非接触式距离感测功能,测距精度可达3mm。 一、基本工作原理 (1)给TRIG引脚至少10us的高电平信号触发测距。 (2)模块自动发送8个40KHz的方波,自动检测是否有信号返回 (3)有信号返回,通过Echo引脚输出一个高电平,高电平的持续时间就是超声波从发射到返回的时间。 (4)测量距离 = (高电平的持续时间 * 声速(340m/s))/ 2。 二、接线 三、模块时序图 四、驱动程序 在了解了上述内容后,我们便可以根据上述知识便可以编写驱动程序了。触发信号Trig很简单直接通过IO输出和延时给一个大于10us的高电平即可触发。Echo引脚需
[单片机]
<font color='red'>STM32</font>驱动超声波模块测距
Keil MDK STM32系列(七) STM32F4基于HAL的PWM和定时器
配置 PWM 输出 选择芯片 System Core - SYS- Debug: Serial Wire 防止下次无法烧录 System Core - RCC- High Speed Clock (HSE): Crystal/Ceramic Resonator 启用外接高速晶振 Clock Configuration: (配置为最高84MHz)选择外部晶振, 把HSE和PLLCLK连上, 在HCLK上输入84回车, 软件会自动调节各节点倍数 Timers - TIM2 Clock Source: Internel Clock, 使用系统的时钟源 Channelx: PWM Generation CHx PWM输出 Counter
[单片机]
16课:单片机定时器与计数器
一、计数概念的引入 从选票的统计谈起:画“正”。这就是计数,生活中计数的例程处处可见。例:录音机上的计数器、家里面用的电度表、汽车上的里程表等等,再举一个工业生产中的例程,线缆行业在电线生产出来之后要计米,也就是测量长度,怎么测法呢?用尺量?不现实,太长不说,要一边做一边量呢,怎么办呢?行业中有很巧妙的办法,用一个周长是1米的轮子,将电缆绕在上面一周,由线带轮转,这样轮转一周不就是线长1米嘛,所以只要记下轮转了多少圈,就能知道走过的线有多长了。 二、计数器的容量 从一个生活中的例程看起:一个水盆在水龙头下,水龙没关紧,水一滴滴地滴入盆中。水滴持续落下,盆的容量是有限的,过一段时间之后,水就会逐渐变满。录音机上的计数器最多只计
[单片机]
ARM、ST与MATHWORKS携手实现支持STM32 MCU代码生成等功能
ARM与意法半导体(STMicroelectronics)携手宣布首款配合MATLAB和 Simulink支持ARM® Cortex™-M系统的Embedded Coder已上市。 意法半导体与ARM的合作项目获得MathWorks的全面支持,使软件开发人员能够在MATLAB和Simulink环境中开发算法,然后在处理器在环(PIL)仿真中编译目标,集成、调试和测试这些模型。Embedded Coder生成的C代码运行于STM32评估板上,Keil™微控制器开发套件(MDK-ARM™)的调试器与Simulink直接交互,进一步简化了代码集成过程。 意法半导体微控制器产品部总经理Michel Buffa表示:“基于消费者对MATL
[单片机]
ST 最新STM32 Primer开发工具可玩Maze和Breakout
完整、独立、预编程的评估工具套件,既有充满趣味性的功能介绍,又有严肃的开发工具,可以链接到在线开发社区 中国,2007年10月15日 — 意法半导体(纽约证券交易所代码:STM)今天推出了一套价格低廉的开发工具,这款代号为STM32 Primer开发工具是一套完整的学习与娱乐相结合的趣味性应用开发工具,用于ST的STM32系列基于具有突破性的ARM Cortex-M3内核的闪存微控制器。这套工具包含一个创新的用户界面、多个游戏和向新用户介绍该系列产品的产品入门功能,以及用于高级开发和编程的Raisonance软件工具。 STM32 Primer是一个手持评估开发工具,力图通过简单和有趣的介绍,让用户了解STM32的强大功能。紧
[新品]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多每日新闻

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved