STM32F103C8T6定时器2,3,4同时初始化程序,标准库版本
时间: 2023-10-08 16:08:00 浏览: 160
以下是STM32F103C8T6定时器2、3、4同时初始化程序的标准库版本。
首先,需要在stm32f10x.h头文件中定义使用的定时器。在本例中,我们使用定时器2、3、4,因此需要添加以下代码:
```
#define USE_TIMER2
#define USE_TIMER3
#define USE_TIMER4
```
接下来,需要在stm32f10x_conf.h头文件中配置定时器的时钟源和分频系数。在本例中,我们使用外部晶体作为时钟源,并将分频系数设置为72,因此需要添加以下代码:
```
/* Uncomment the line below to use external clock source */
/* #define USE_EXTERNAL_CLOCK */
#ifdef USE_EXTERNAL_CLOCK
#define RCC_CLOCK_HZ 8000000 /* External crystal frequency */
#else
#define RCC_CLOCK_HZ 72000000 /* Internal clock frequency */
#endif
/* Timer clock frequency */
#define TIMER_CLOCK_HZ (RCC_CLOCK_HZ / 72)
```
接下来,需要在main.c文件中初始化定时器2、3、4。以下是完整的程序代码:
```
#include "stm32f10x.h"
#define USE_TIMER2
#define USE_TIMER3
#define USE_TIMER4
#ifdef USE_EXTERNAL_CLOCK
#define RCC_CLOCK_HZ 8000000 /* External crystal frequency */
#else
#define RCC_CLOCK_HZ 72000000 /* Internal clock frequency */
#endif
/* Timer clock frequency */
#define TIMER_CLOCK_HZ (RCC_CLOCK_HZ / 72)
void TIM2_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
/* Enable timer clock */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
/* Configure timer */
TIM_TimeBaseInitStruct.TIM_Period = 1000 - 1; /* 1 kHz */
TIM_TimeBaseInitStruct.TIM_Prescaler = TIMER_CLOCK_HZ / 1000 - 1; /* 1 ms */
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);
/* Enable timer interrupt */
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
/* Start timer */
TIM_Cmd(TIM2, ENABLE);
}
void TIM3_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
/* Enable timer clock */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
/* Configure timer */
TIM_TimeBaseInitStruct.TIM_Period = 10000 - 1; /* 100 Hz */
TIM_TimeBaseInitStruct.TIM_Prescaler = TIMER_CLOCK_HZ / 10000 - 1; /* 10 ms */
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct);
/* Enable timer interrupt */
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
/* Start timer */
TIM_Cmd(TIM3, ENABLE);
}
void TIM4_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
/* Enable timer clock */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
/* Configure timer */
TIM_TimeBaseInitStruct.TIM_Period = 50000 - 1; /* 20 Hz */
TIM_TimeBaseInitStruct.TIM_Prescaler = TIMER_CLOCK_HZ / 50000 - 1; /* 20 ms */
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseInitStruct);
/* Enable timer interrupt */
TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
/* Start timer */
TIM_Cmd(TIM4, ENABLE);
}
int main(void)
{
/* Initialize timers */
#ifdef USE_TIMER2
TIM2_Init();
#endif
#ifdef USE_TIMER3
TIM3_Init();
#endif
#ifdef USE_TIMER4
TIM4_Init();
#endif
/* Main loop */
while (1)
{
}
}
```
在该程序中,TIM2_Init()、TIM3_Init()和TIM4_Init()分别初始化定时器2、3和4。每个定时器的配置如下:
- TIM2:1 kHz定时器,用于高频率任务。
- TIM3:100 Hz定时器,用于中频率任务。
- TIM4:20 Hz定时器,用于低频率任务。
在每个定时器的初始化中,我们设置了定时器的周期和分频系数,以便生成所需的时钟信号。我们还启用了定时器中断,并在程序中添加了相应的中断处理程序来执行任务。
请注意,如果您使用外部晶体作为时钟源,请取消注释#define USE_EXTERNAL_CLOCK,并将RCC_CLOCK_HZ设置为外部晶体的频率。如果您使用内部时钟,则无需更改任何配置。
此外,如果您只需要使用其中一个定时器,则可以删除相应的初始化函数,并将USE_TIMER2、USE_TIMER3或USE_TIMER4注释掉。
阅读全文