前言:最近对STM32U083的进行一个系统的学习,今天和大家分享一下低功耗定时器1的学习;
STM32U083存在基本定时器:定时器6,定时器7,高级定时器:定时器1和低功耗的定时器:UPLTime1等等,今天就和大家分享一下低功耗定时器的学习;
首先简单介绍一下低功耗的定时器:
STM32U083共计提供三个低功耗定时器,LPTIM1、LPTIM2和LPTIM3。这些定时器具有独立的时钟源,并可以在系统处于低功耗模式(如Stop模式)时保持运行状态,从而能够将系统从低功耗状态唤醒。
低功耗定时器的主要特性:
1、超低功耗:LPTIM因其设计上的优化,在低电压、低频率条件下运行时能够消耗极小的电流,这对于电池供电的设备尤为重要。
2、独立时钟源:LPTIM支持多种时钟源,包括内部LSE、LSI、HSI16或APB时钟,以及外部通过LPTIM输入的时钟。这种灵活性使得LPTIM能够适应不同的应用场景和需求。
3、丰富的配置选项:LPTIM提供了多种配置选项,如连续/一次性模式、软件/硬件输入触发器、可选的时钟源等。这些配置选项使得LPTIM能够生成满足各种需求的PWM波形。
4、PWM生成能力:通过配置LPTIM的相关寄存器,可以生成具有特定周期和占空比的PWM波形。这对于需要精确控制输出功率的应用场景非常有用。
低功耗定时器产成PWM的基本步骤:
1、选择ULP定时器:确定系统中支持ULP模式的定时器资源,并设置定时器为PWM工作模式。
2、配置定时器参数:配置定时器的计数器、比较寄存器以及相关的控制位,以使其能够按照预定的时钟源频率进行递增计数,并在特定计数值处触发状态切换。
3、确定PWM周期和占空比:通过设置定时器的预分频系数和计数上限(周期寄存器值)来确定PWM波形的周期。通过配置比较寄存器的值来确定占空比。
4、映射PWM输出通道:将ULP定时器的PWM输出通道映射到相应的GPIO引脚,并确保这些引脚被配置为复用功能模式。
5、启动定时器:启动ULP定时器并使能PWM输出。此时,定时器开始按照设定的参数进行计数,并在达到比较值时切换PWM输出状态,形成所需占空比的PWM波形。
三、STM32cube软件配置截图如下:
使用PB3引脚,作为PWM输出的引脚
四:软件最主要代码如下:
/** * @brief LPTIM1 Initialization Function * @param None * @retval None */ static void MX_LPTIM1_Init(void) { /* USER CODE BEGIN LPTIM1_Init 0 */ LPTIM_OC_ConfigTypeDef sConfig1 = {0}; /* USER CODE END LPTIM1_Init 0 */ /* USER CODE BEGIN LPTIM1_Init 1 */ /* USER CODE END LPTIM1_Init 1 */ hlptim1.Instance = LPTIM1; hlptim1.Init.Clock.Source = LPTIM_CLOCKSOURCE_APBCLOCK_LPOSC; hlptim1.Init.Clock.Prescaler = LPTIM_PRESCALER_DIV1; hlptim1.Init.Trigger.Source = LPTIM_TRIGSOURCE_SOFTWARE; hlptim1.Init.Period = 10000; hlptim1.Init.UpdateMode = LPTIM_UPDATE_IMMEDIATE; hlptim1.Init.CounterSource = LPTIM_COUNTERSOURCE_INTERNAL; hlptim1.Init.Input1Source = LPTIM_INPUT1SOURCE_GPIO; hlptim1.Init.Input2Source = LPTIM_INPUT2SOURCE_GPIO; hlptim1.Init.RepetitionCounter = 0; if (HAL_LPTIM_Init(&hlptim1) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN LPTIM1_Init 2 */ sConfig1.Pulse = 5000; sConfig1.OCPolarity = LPTIM_OCPOLARITY_HIGH; if (HAL_LPTIM_OC_ConfigChannel(&hlptim1, &sConfig1, LPTIM_CHANNEL_3) != HAL_OK) { Error_Handler(); } if (HAL_LPTIM_PWM_Start(&hlptim1, LPTIM_CHANNEL_3) != HAL_OK) { Error_Handler(); } /* USER CODE END LPTIM1_Init 2 */ }
五、测试实物图片如下: