1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > stm32产生100k时钟信号_stm32定时器时钟源时钟选择

stm32产生100k时钟信号_stm32定时器时钟源时钟选择

时间:2022-07-02 01:57:10

相关推荐

stm32产生100k时钟信号_stm32定时器时钟源时钟选择

stm32定时器时钟源时钟选择

有意义的参考

基础了解

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

● 内部时钟(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为时钟源对频率进行计数

voidTIM2_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);

//

}voidTIM3_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=%d\n",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不变

voidTIM2_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);

}

如有错误,敬请赐教。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。