那你帮我写一个stm32f103c8t6定时器1每100ms的中断配置
时间: 2024-09-24 08:02:11 浏览: 20
对于STM32F103C8T6,使用定时器1(Timer 1)来实现每100毫秒的中断,可以按照以下步骤配置:
1. **时钟配置**:
确保`RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);`已启用定时器1的APB2时钟。
2. **内部时钟配置**:
```c
TIM_InternalClockConfig(TIM1);
```
3. **定时器基础结构体配置**:
设置分频因子、计数模式和周期:
```c
TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct = {
.TIM_ClockDivision = TIM_CKD_DIV1, // 分频系数为1(无分频)
.TIM_CounterMode = TIM_CounterMode_Up, // 计数方向向上
.TIM_Period = (uint16_t)(100 * 1000 / SystemCoreClock), // 100ms周期(注意要将主频换算成系统时钟频率)
.TIM_Prescaler = (SystemCoreClock / 1000 - 1), // 根据实际主频计算预分频值
.TIM_RepetitionCounter = 0 // 无重复计数
};
```
4. **初始化定时器**:
```c
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStruct);
```
5. **清除中断标志** 和 **启用中断**:
```c
TIM_ClearFlag(TIM1, TIM_FLAG_Update); // 清除可能存在的更新标志
TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE); // 开启更新中断
```
6. **设置中断优先级**:
```c
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 设置抢占权级别为2
```
7. **配置中断向量**:
```c
NVIC_InitTypeDef NVIC_InitStructure = {
.NVIC_IRQChannel = TIM1_UP_IRQn, // TIM1 Update中断
.NVIC_IRQChannelCmd = ENABLE,
.NVIC_IRQChannelPreemptionPriority = 1, // 低优先级
.NVIC_IRQChannelSubPriority = 1 // 低子优先级
};
NVIC_Init(&NVIC_InitStructure);
```
8. **启动定时器**:
```c
TIM_Cmd(TIM1, ENABLE);
```
以下是完整的函数示例:
```c
void configure_TIM1 interrupt_100ms(void) {
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
TIM_InternalClockConfig(TIM1);
TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct = {
... // 使用上述配置
};
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStruct);
TIM_ClearFlag(TIM1, TIM_FLAG_Update);
TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM1, ENABLE);
}
```