STM32F103如何初始化四个定时器,输入时钟设为1MHz,初始周期为4999?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32F103如何初始化四个定时器,输入时钟设为1MHz,初始周期为4999?相关的知识,希望对你有一定的参考价值。

想使用TIM1,2,3,4分别控制4个步进电机。

参考技术A 您好,你的问题,我之前好像也遇到过,以下是我原来的解决思路和方法,希望能帮助到你,若有错误,还望见谅!看一个软件工程的时候,首先要从这个工程的启动文件开始看起,建议你看看STM32工程中的startup_stm32f10x_hd.s文件,在其中除了stm32内存堆栈的设置和中断向量入口之外,还包含了stm32启动的整个过程,在3.5的库中,你会发现这个启动文件中包含了SystemInit这个函数,也就是说库中已经帮你做了stm32时钟的初始化这个工作,所以你在之后的编程中可以省掉clock的一些设置,至于pll的设置你看看不完全手册中的rcc寄存器。非常感谢您的耐心观看,如有帮助请采纳,祝生活愉快!谢谢!

[STM32F103]PWM输入捕获配置

l 初始化定时器和通道对应IO的时钟。

l 初始化IO口,模式为输入:

  GPIO_Init();

      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0 输入

l 初始化定时器ARR,PSC

  TIM_TimeBaseInit();

l 初始化输入捕获通道

  TIM_ICInit();

l 如果要开启捕获中断,

  TIM_ITConfig();

  NVIC_Init();

l 使能定时器:

  TIM_Cmd();

l 编写中断服务函数:

  TIMx_IRQHandler();

l 源码:

u8 TIM5CH1_CAPTURE_STA;
u16 TIM5CH1_CAPTURE_VAL;
void TIM5_Cap_Init(u16 arr, u16 psc)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef    TIM_TimeBaseStructure;
    NVIC_InitTypeDef    NVIC_InitStructure;
    TIM_ICInitTypeDef    TIM_ICInitStructure;
    
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    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(TIM5, &TIM_TimeBaseStructure);
    
    //捕获通道设置
    TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
    TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
    TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
    TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
    TIM_ICInitStructure.TIM_ICFilter = 0x00;
    TIM_ICInit(TIM5, &TIM_ICInitStructure);
    
    NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_Init(&NVIC_InitStructure);
    
    TIM_ITConfig(TIM5, TIM_IT_Update|TIM_IT_CC1,ENABLE);
    TIM_Cmd(TIM5, ENABLE);
}

void TIM5_IRQHandler()
{
    if((TIM5CH1_CAPTURE_STA & 0x80) == 0)
    {
        if(TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET)
        {
            if(TIM5CH1_CAPTURE_STA & 0x40)
            {
                if((TIM5CH1_CAPTURE_STA & 0x3F) == 0x3F)
                {
                    TIM5CH1_CAPTURE_STA |= 0x80;
                    TIM5CH1_CAPTURE_VAL = 0xffff;
                }
                else
                {
                    TIM5CH1_CAPTURE_STA++;
                }
            }    
        }
        
        if(TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)
        {
            if(TIM5CH1_CAPTURE_STA & 0x40)
            {
                TIM5CH1_CAPTURE_STA |= 0x80;
                TIM5CH1_CAPTURE_VAL = TIM_GetCapture1(TIM5);
                TIM_OC1PolarityConfig(TIM5, TIM_ICPolarity_Rising);
            }
            else
            {
                TIM5CH1_CAPTURE_STA = 0;
                TIM5CH1_CAPTURE_VAL = 0;
                TIM_SetCounter(TIM5, 0);
                TIM5CH1_CAPTURE_STA |= 0x40;
                TIM_OC1PreloadConfig(TIM5, TIM_ICPolarity_Falling);
            }
        }
    }
    TIM_ClearITPendingBit(TIM5, TIM_IT_CC1 | TIM_IT_Update);
}
//main.c
u32 temp = 0;
    delay_init();
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    TIM5_Cap_Init(0xffff,72-1);
    uart_init(115200);
    while(1)
    {
        delay_ms(10);
        if(TIM5CH1_CAPTURE_STA & 0x80)
        {
            temp = TIM5CH1_CAPTURE_STA & 0x3f;
            temp *= 65536;
            temp += TIM5CH1_CAPTURE_VAL;
            printf("High:%d us
",temp);
            TIM5CH1_CAPTURE_STA = 0;
        }
    }

 

以上是关于STM32F103如何初始化四个定时器,输入时钟设为1MHz,初始周期为4999?的主要内容,如果未能解决你的问题,请参考以下文章

基于实时时钟RTC实现STM32F103C8的日历读取设置和输出

STM32F103操作DS1302时钟芯片串口显示(标准库和HAL库)

STM32F103操作DS1302时钟芯片串口显示(标准库和HAL库)

STM32F103想用内部时钟HSI做为系统时钟,怎么配置成36M

STM32F103R8T6系统移植到STM32F103RCT6

STM32F103VET6基于STM32CubeMX创建定时器中断控制LED闪烁