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