用stm32f103标准库写一个TIM2定时器初始化程序,Channel1和Channel2都是TIM_OCMode_Timing,且都是一秒触发一次中断。
时间: 2024-09-29 08:12:42 浏览: 50
STM32F103C8T6配套程序源码-TIM2定时(1ms).zip_C8T6TIM4定时1ms_STM32F103定时1ms
5星 · 资源好评率100%
在STM32F103系列微控制器上,使用HAL库(Hardware Abstraction Layer)可以简化TIM2定时器的初始化过程。以下是一个基本的例子,展示如何设置TIM2 Channel 1和2为TIM_OCMode_Timing模式,每秒钟产生一次中断:
```c
#include "stm32f1xx_hal.h"
void TIM2_IRQHandler(void)
{
// 中断处理代码
}
int main(void)
{
HAL_Init();
__HAL_RCC_TIM2_CLK_ENABLE(); // 启动TIM2时钟
// 定义TIM2寄存器配置
TIM_HandleTypeDef htim2;
htim2.Instance = TIM2;
htim2.Init.Prescaler = 8399; // 计算出周期大约等于1s,考虑到系统频率(72MHz),减去计数器的最大值
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 0xFFFF - htim2.Init.Prescaler;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.OscillatorOutputState = TIM_OSCILLATORTYPE_DISABLE;
htim2.Init.OCMode = TIM_OCMODE_TIMING; // 设置通道模式为TIMING
htim2.Init.OCIdleState = TIM_OCIDLESTATE_RESET; // 触发前状态为低电平
htim2.Init.OCSelection = TIM_OCSingle; // 仅单通道触发
// 对于Channel 1
htim2 nIndex = 0;
htim2.Init.OTMode &= ~TIM_OT_MODE_TIMING; // 清除Channel 1的触发模式
htim2.Init.OTMode |= TIM_OT_MODE_TIMING_1; // 设置为Channel 1的定时触发模式
// 对于Channel 2
htim2 nIndex = 1;
htim2.Init.OTMode &= ~TIM_OT_MODE_TIMING; // 清除Channel 2的触发模式
htim2.Init.OTMode |= TIM_OT_MODE_TIMING_2; // 设置为Channel 2的定时触发模式
if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
{
while (1); // 初始化失败,无限循环
}
// 配置TIM2中断
HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM2_IRQn);
// 开始定时器
HAL_TIM_Base_Start_IT(&htim2);
while (1)
{
// 主循环,这里你可以添加其他任务
}
}
```
注意:这个例子假设你的STM32F103系统的主频是72MHz,并且你需要通过计算调整Prescaler的值以得到大约1秒的周期。实际应用时,需要考虑具体的系统频率。
阅读全文