STM32U0 有10个定时器、RTC和2个看门狗•1x 16位高级电机控制,1x 32位和3x 16位通用,2x 16位基本,3x低功耗
16位定时器(在停止模式下可用),2个看门狗,SysTick定时器
•带硬件日历、警报和校准的RTC
低功耗定时器(LPTIM1、LPTIM2和LPTIM3)这些计时器有一个独立的时钟。当输入LSE、LSI或外部时钟时,它们在Stop中保持运行模式,他们可以从中唤醒系统。
LPTIM1、LPTIM2和LPTIM3的功能:
•带16位自动读取寄存器的16位递增计数器
•16位比较寄存器
•可配置输出(脉冲、PWM)
•连续/一次性模式
•可选择的软件/硬件输入触发器
•可选时钟源:
–内部:LSE、LSI、HSI16或APB时钟
–外部:通过LPTIM输入(即使没有内部时钟源运行也能工作,由脉冲使用
计数器应用程序)
•可编程数字毛刺滤波器
•编码器模式
STM32U0 LPTIM 如何产生 PWM 主要涉及使用具有超低功耗(Ultra-Low Power, ULP)特性的定时器来生成脉冲宽度调制(Pulse Width Modulation, PWM)信号。ULP 定时器因其低能耗特性适用于电池供电设备或需要严格控制功耗的嵌入式系统。以下是 ULPTime 产生 PWM 的一般步骤和原理:
选择 ULP 定时器: - 确定系统中支持 ULP 模式的定时器资源。这类定时器通常设计成在低电压、低频率条件下运行时消耗极小的电流。
配置定时器工作模式: - 设置定时器为 PWM 工作模式。这通常包括配置定时器的计数器、比较寄存器以及相关的控制位,以使其能够按照预定的时钟源频率进行递增计数,并在特定计数值处触发状态切换。
设定 PWM 周期: - 根据应用需求,通过设置定时器的预分频系数和计数上限(或者称为周期寄存器值)来确定 PWM 波形的周期。周期 T = (预分频系数 × 时钟周期) / 计数上限。选择合适的预分频和计数值以获得所需的 PWM 周期。
设置占空比: - 占空比定义了 PWM 波形的“高电平”时间相对于整个周期的比例。通过配置比较寄存器的值,当计数器达到该值时触发 PWM 输出状态翻转。占空比 D = (比较值 / 计数上限) × 100%。调整比较值即可改变占空比,从而控制输出功率。
配置 PWM 输出通道: - 将 ULP 定时器的 PWM 输出通道映射到相应的 GPIO 引脚。确保这些引脚被配置为复用功能模式,以允许定时器直接控制其电平。
启用 PWM 生成: - 启动 ULP 定时器并使能 PWM 输出。此时,定时器开始按照设定的参数进行计数,并在达到比较值时切换 PWM 输出状态,形成所需占空比的 PWM 波形。
动态调整(可选): - 若硬件和软件支持,可以在运行时动态修改预分频系数、计数上限和比较值,实现对 PWM 周期和占空比的实时调整,以适应变化的控制需求。
节能管理: - 利用 ULP 定时器的省电特性,可能还需要配置相关的睡眠模式和唤醒逻辑,确保在不牺牲 PWM 功能的前提下,系统能在无操作或待机期间最大限度地降低功耗。
ULPTime 产生 PWM 的过程主要包括正确配置 ULP 定时器的工作模式、周期、占空比以及输出通道,并在必要时进行动态调整和节能管理,以确保在低功耗条件下稳定、准确地生成满足应用需求的 PWM 信号。具体的配置方**依赖于所使用的微控制器或 SoC 的数据手册及配套软件开发工具提供的 API 或寄存器访问接口。 配置MX ,,使用的LPTIM实例为LPTIM1,低功耗模式为Stop 2模式。 定时器配置: static void MX_LPTIM1_Init(void)
{
/* USER CODE BEGIN LPTIM1_Init 0 */
/* USER CODE END LPTIM1_Init 0 */
LPTIM_OC_ConfigTypeDef sConfig1 = {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 = 99;
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();
}
sConfig1.Pulse = 49;
sConfig1.OCPolarity = LPTIM_OCPOLARITY_HIGH;
if (HAL_LPTIM_OC_ConfigChannel(&hlptim1, &sConfig1, LPTIM_CHANNEL_3) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN LPTIM1_Init 2 */
/* USER CODE END LPTIM1_Init 2 */
HAL_LPTIM_MspPostInit(&hlptim1);
}
int main(void)
{
HAL_Init();
SystemClock_Config();
BSP_LED_Init(LED4);
MX_GPIO_Init();
MX_LPTIM1_Init();
/* User push-button (EXTI_Line13) will be used to wakeup the system from Stop 2 mode */
BSP_PB_Init(BUTTON_USER, BUTTON_MODE_EXTI);
/* ### Start counting in interrupt mode ############################# */
/*
* Period = 99
* Pulse = 49
* According to LPTIM configuration, the duty cycle will be equal to 50%
*/
if (HAL_LPTIM_PWM_Start(&hlptim1, LPTIM_CHANNEL_3) != HAL_OK)
{
Error_Handler();
}
/* Suspend Tick */
HAL_SuspendTick();
/* Enter in Stop mode */
__HAL_RCC_PWR_CLK_ENABLE();
HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI);
/* Resume Tick interrupt if disabled prior to sleep mode entry*/
HAL_ResumeTick();
/* ### Stop counting when leaving Stop mode ########################## */
if (HAL_LPTIM_PWM_Stop(&hlptim1, LPTIM_CHANNEL_3) != HAL_OK)
{
Error_Handler();
}
/* Turn LED4 ON */
BSP_LED_On(LED4);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
在主程序开始时,调用HAL_Init()函数以重置所有外围设备,初始化Flash接口和系统。SystemClock_Config()函数用于配置STM32U883RCTx设备的系统时钟: 48 MHz的CPU.计数器时钟为LSE(32.768 KHz),Autoreload等于99,因此输出频率(FrequencyOutput)将等于327.680。用户按钮引脚(PC.13)被配置为具有外部中断(EXTI_Line13)的输入,下降边缘。当按下用户按钮时,将生成唤醒事件,PWM信号生成停止,LED4点亮。 计算公式: FrequencyOutput=计数器时钟频率/(自动重新加载+1) =32768 / 100=327.680赫兹 测试:开机电流355.2UA
进入MCU进入停止2模式:4637UA 此时:ULPTime PWM还在产生只有46UA,这是我见过做最低功耗的PWM单片机 波形参数跟理论值一致。
sConfig1.Pulse = 49;脉冲值等于49,占空比(DutyCycle)计算如下: DutyCycle=1-((脉冲值+1)/(自动重新加载+1)) DutyCycle=50%
如果改成sConfig1.Pulse = 19;理论低电平占空比20%.高电平80% 非常精确。
|