本帖最后由 YangTwo 于 2024-11-11 13:49 编辑
STM32WBO的TIM2介绍
通用定时器(TIM2)由一个16位自动重新加载计数器,配有一个可编程预分频器。
它可用于多种用途,包括测量输入的脉冲长度信号(输入捕获)或产生输出波形(输出比较,PWM,带死区插入的互补PWM)。
脉冲长度和波形周期可以从几微秒到几微秒调制,在32 MHz的定时器输入时钟上使用定时器预分频器。
TIM2主要特性
TIM2定时器功能包括:
•16位向上,向下,向上/向下自动加载计数器。
•16位可编程的预分频器允许划分(也“在飞行中”)计数器
频率是1到65536之间的任意因子。
•多达4个独立通道:
-输入捕获
-输出比较
- PWM生成(边缘和中心对齐模式)
—单脉冲输出
•重复计数器,仅在给定次数的循环后更新计时器寄存器
柜台。
•中断/DMA产生以下事件:
-更新:计数器溢出/下溢,计数器初始化(通过软件或
内部/外部触发)
-触发事件(计数器启动、停止、初始化或由内部/外部触发计数)
(只有中断)
-输入捕获
-输出比较
•支持增量(正交)编码器的定位目的
•触发输入外部时钟或周期逐周期电流管理
本次体验使用Tim2生成周期为1Hz的时钟,在中断ISR内部,翻转LED1蓝色小灯的状态。
首先在STM32CubeIDE内置的CubeMX图形化外设配置工具内部,设置Tim2的分频,中断等参数。
其中TIM2模块的时钟来源为:
更新频率:64MHz/64/(TIM2 ARR 9999 + 1) = 1Hz
点击保存,自动生成TIM2初始化代码,
static void MX_TIM2_Init(void)
{
/* USER CODE BEGIN TIM2_Init 0 */
/* USER CODE END TIM2_Init 0 */
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
/* USER CODE BEGIN TIM2_Init 1 */
/* USER CODE END TIM2_Init 1 */
htim2.Instance = TIM2;
htim2.Init.Prescaler = 6400;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 9999;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
{
Error_Handler();
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN TIM2_Init 2 */
/* USER CODE END TIM2_Init 2 */
}
注意在main.c里面要启动TIM2模块。
if (HAL_TIM_Base_Start_IT(&htim2) != HAL_OK)
{
/* Starting Error */
Error_Handler();
}
printf("** Tim2 Started ** \n\r");
在TIM2的ISR中加入LED控制:
/**
* [url=home.php?mod=space&uid=247401]@brief[/url] This function handles TIM2 global interrupt.
*/
void TIM2_IRQHandler(void)
{
/* USER CODE BEGIN TIM2_IRQn 0 */
/* USER CODE END TIM2_IRQn 0 */
HAL_TIM_IRQHandler(&htim2);
/* USER CODE BEGIN TIM2_IRQn 1 */
HAL_GPIO_TogglePin(PB1_LD1_BLUE_GPIO_Port, PB1_LD1_BLUE_Pin);
UTIL_SEQ_SetTask(1U << CFG_TASK_SIMPLEBLEAUTONOTIFY, CFG_SEQ_PRIO_0);
/* USER CODE END TIM2_IRQn 1 */
}
编译,烧录,验证效果:
|