stm32对系统滴答计时器进行计数的c代码
时间: 2024-10-16 21:08:12 浏览: 18
STM32F103系统滴答定时器精确延时1us
5星 · 资源好评率100%
STM32微控制器通常使用Timer2或Timer3等内置定时器作为系统滴答计时器来进行计数。以下是一个基本的例子,展示如何初始化并配置TIM2定时器作为系统时钟周期计数器:
```c
#include "stm32f10x_tim.h" // 包含STM32定时器库文件
// 定义全局变量存储TIM2寄存器地址
TIM_TimeBaseInitTypeDef.TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM_ICInit;
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;
// 初始化时钟源
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; // 使用HSE时钟
RCC_OscInitStruct.HSEState = RCC_HSE_ON; // 开启HSI外部时钟
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
while(1); // 错误处理
}
// 选择SYSCLK、AHB和APB时钟源
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE; // 设置SYSCLK为HSE频率
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // AHB时钟分频1
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; // APB1时钟分频4
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; // APB2时钟分频2
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
{
while(1); // 错误处理
}
// 配置TIM2为系统时钟计数器
TIM_TimeBaseStructure.Prescaler = RCC_HCLK_DIV1; // 分频系数为1(等于系统的时钟频率)
TIM_TimeBaseStructure.CounterMode = TIM_COUNTERMODE_UP; // 计数模式为递增
TIM_TimeBaseStructure.ClockDivision = TIM_CLOCKDIVISION_DIV1; // 不做分频
TIM_TimeBaseStructure.RepetitionCounter = 0; // 清零复位计数器
HAL_TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
HAL_TIM_Cmd(TIM2, ENABLE); // 启动TIM2计时器
// 如果需要中断,可以配置TIM2的溢出中断
TIM_ICInit.TIM_Channel = TIM_CHANNEL_1; // 例如,选择通道1
TIM_ICInit.TIM_ICPolarity = TIM_ICPOLARITY_RISING; // 上升沿触发
TIM_ICInit.TIM_ICSelection = TIM_ICSELECT_DIRECTTI; // 直接触发
TIM_ICInit.TIM_ICPrescaler = TIM_ICPSC_DIV4; // 分频4
HAL_TIM_IC_Init(TIM2, &TIM_ICInit);
}
阅读全文