你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32定时器时钟源时钟选择

[复制链接]
STMCU-管管 发布时间:2021-6-4 10:11
基础了解
时钟选择计数器时钟可由下列时钟源提供:


● 内部时钟(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)的操作。
1.png

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


外部时钟源1
2.png

来自定时器自身输入通道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之间


代码示例
时钟源对频率进行计数
  1. #include "timer.h"
  2. #include "led.h"
  3. //     
  4. //将PB5与tim2-ch1的pa0短接
  5. pb5为时钟源对频率进行计数

  6. void TIM2_Int_Init( u16 arr,u16 psc ){

  7.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  8.     NVIC_InitTypeDef NVIC_InitStructure;
  9.    GPIO_InitTypeDef  GPIO_InitStructure;
  10. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  11.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;               
  12.     GPIO_InitStructure.GPIO_Mode =     
  13.      GPIO_Mode_IN_FLOATING;            
  14.     GPIO_Init(GPIOA, &GPIO_InitStructure);   

  15.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
  16.         TIM_DeInit(TIM2);
  17.     TIM_TimeBaseStructure.TIM_Period = arr;     
  18.     TIM_TimeBaseStructure.TIM_Prescaler =psc;
  19.     TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  20.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
  21.     TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

  22.     TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE );
  23.   /*重点*/  
  24. TIM_TIxExternalClockConfig(TIM2,TIM_TIxExternalCLK1Source_TI1,TIM_ICPolarity_Falling,15);//设置输入滤波和边沿检测
  25.     TIM_Cmd(TIM2, ENABLE);  
  26. //
  27. }

  28. void TIM3_Int_Init(u16 arr,u16 psc){

  29.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

  30.     NVIC_InitTypeDef NVIC_InitStructure;

  31.                   


  32.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
  33.     TIM_TimeBaseStructure.TIM_Period = arr;
  34.     TIM_TimeBaseStructure.TIM_Prescaler = psc;
  35.     TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  36.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
  37.     TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);


  38.     TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE );
  39.     NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  
  40.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  
  41.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  
  42.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  43.     NVIC_Init(&NVIC_InitStructure);  

  44.     TIM_Cmd(TIM3, ENABLE);               
  45. }

  46. void TIM3_IRQHandler(void){

  47.     if (TIM_GetITStatus(TIM3, TIM_IT_Update)!=RESET){
  48.                         LED0=!LED0;
  49.     }
  50.     TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
  51. }
  52. #include "led.h"
  53. #include "delay.h"
  54. #include "key.h"
  55. #include "sys.h"
  56. #include "usart.h"
  57. #include "timer.h"

  58. int main(void)
  59. {

  60. delay_init(); //延时函数初始化
  61. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  62. uart_init(115200); //串口初始化为115200
  63. LED_Init(); //LED端口初始化
  64. TIM3_Int_Init(4999,7199);//10Khz的计数频率,计数到5000为500ms
  65. TIM2_Int_Init(10,0);


  66. while(1)
  67. {
  68. //LED0=!LED0;
  69. delay_ms(400);
  70. printf("Count=%d\n",TIM_GetCounter(TIM2));
  71. }


  72. }
复制代码
//TIM_TIxExternalCLK1Source_TI1: 滤波后的Timer Input 1
//TIM_TIxExternalCLK1Source_TI2: 滤波后Timer Input 2


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


大概是这个异或的原因
3.png

外部时钟源模式2
4.png

来自于 外部触发脚[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
5.png

6.png

TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_DIV2,TIM_ExtTRGPolarity_NonInverted, 0x0);
//外部时钟模式1.需要设置预分频,以及外部触发极性:滤波
//TIM_ExtTRGPolarity_Inverted TIM外部触发极性翻转: 低电平或下降沿有效 //TIM_ExtTRGPolarity_NonInverted TIM外部触发极性非翻转:高电平或上升沿有效


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

  1. void TIM2_Int_Init( u16 arr,u16 psc ){

  2.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  3.     NVIC_InitTypeDef NVIC_InitStructure;
  4.         GPIO_InitTypeDef  GPIO_InitStructure;
  5.      RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
  6.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  7.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;               
  8.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;            
  9.     GPIO_Init(GPIOA, &GPIO_InitStructure);     
  10.    
  11.         TIM_DeInit(TIM2);
  12.     TIM_TimeBaseStructure.TIM_Period = arr;     
  13.     TIM_TimeBaseStructure.TIM_Prescaler =psc;
  14.     TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  15.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
  16.     TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

  17.     TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE );

  18. /*重点*/
  19.         TIM_ITRxExternalClockConfig(TIM2,TIM_TS_ITR3);//高级定时器开启
  20.     TIM_ETRClockMode2Config(TIM2,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted,0)//配置外部时钟2的模式;
  21.     TIM_SetCounter( TIM2,0 );
  22. /

  23.     TIM_Cmd(TIM2, ENABLE);  

  24. }
  25. void TIM2_IRQHandler(void){   

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

  27.     }
  28.     TIM_ClearITPendingBit(TIM2,TIM_IT_Update);   
  29. }
复制代码


收藏 评论0 发布时间:2021-6-4 10:11

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版