入门外设系统LPBAM(入门外设系统应用程序模式)「外设教程及目录」

LPBAM入门本文介绍了 LPBAM 功能、何时以及如何使用它,并提供了代码示例
内容↑[隐藏]1LPBAM简介1.1定义1.2好处1.3智能运行域 (SRD)1.4支持LPBAM的外设2如何使用LPBAM驱动LPGPIO2.1方框图2.2目标2.3STM32CubeMX LPBAM配置2.3.1LPBAM 方案和配置2.3.2场景队列构建2.4代码配置2.4.1编译和烧录2.5功耗测量3如何使用 LPBAM 进行 I2C 或 SPI 传输4如何使用LPBAM进行ADC或DAC转换5如何使用LPBAM进行LPTIM PWM比率更改,输入捕获,脉冲计数器6引用1LPBAM简介↑1.1定义↑LPBAM代表低功耗背景自主模式
它是 STM32U5 产品系列中提供的一种操作模式,允许外围设备在停止 2 模式下独立于器件电源模式运行和自主运行,而无需运行任何软件
LPBAM 子系统可以通过 DMA 链表传输链接不同的操作
DMA 操作可能与以下方面相关:外设数据传输外设重新配置1.2好处↑使用LPBAM子系统机制有两个主要优点:功耗优化:总线时钟和内核时钟仅在需要时分发
大部分产品部件都可以关闭
模拟外设或振荡器仅在必要时才上电
CPU 带宽被卸载:外设配置由 DMA 而不是 CPU 完成
数据传输由 DMA 而不是 CPU 完成
1.3智能运行域(SRD)↑STM32U5分为两个域:CPU 域 (CD) 和 SmartRun 域 (SRD)SRD 架构依赖于 DMA,允许在低功耗模式下自主运行,直至停止 2
该架构还具有一个 32 位 AHB 总线矩阵,可互连:两位大师:AHB主总线矩阵LPDMA1(具有一个主端口的低功耗 DMA)两个奴隶:AHB3 外设,包括连接到 APB3 的 AHB 到 APB 桥接器内部SRAM4信息SRAM4 是唯一可由 LPDMA1 访问的 SRAM
1.4支持LPBAM的外设↑有 2 种类型的外围设备:自主外设:具有时钟请求功能,支持STOP模式下的DMA传输
无源外设:只能重新配置或用作触发器,不支持DMA或时钟请求
LPBAM是一种操作模式,允许外设独立于电源模式自主运行,无需运行任何软件
LPBAM 在 Stop 2 模式下受支持
因此,自主外设可以请求其时钟(内核或总线时钟),然后可以在停止模式下保持功能,默认情况下禁用时钟以减少功耗(LSE 和 LSI 低功耗低速振荡器除外)
下表列出了支持 LPBAM 的所有外设
低功耗模式第 2 站自主外设ADC4、ADF1、DAC1、LPDMA1、LPTIM1、LPTIM3、LPUART1、I2C3、SPI3无源外设LPTIM4、LPGPIO、VREFBUF、COMP 和 OPAMP、RTC/TAMP信息请参阅 AN5652[1]了解有关支持 LPBAM 的外围设备的更多信息
2如何使用LPBAM驱动LPGPIO↑要按照此示例进行操作,您需要一个 NUCLEO-U575 板
在开始动手操作之前,请确保您已安装以下软件:STM32CubeMX 6.5.0(或更高版本)STM32CubeIDE 1.9.0(或更高版本)STM32CubeU5固件包2.1框图↑此示例的目的是在低功耗域中驱动 GPIO 引脚 (PA1),该引脚由具有两个不同频率的低功耗定时器 LPTIM 触发,该链表由 DMA 控制
周期为 50 ms 的 LPTIMLPTIM 周期为 100 ms2.2目标↑此示例的目的是演示如何:配置 LPBAM 方案测量 STOP2 模式下的功耗2.3STM32CubeMX LPBAM配置↑要使用 STM32CubeMX 工具创建 LPBAM 应用程序,您需要:STM32CubeMX 标准视图
这将设置主应用程序和代码生成
用于构建 LPBAM 应用程序的 LPBAM 视图
信息检查 AN5816[2]和这个视频[3]因为它逐步解释了如何在 STM32CubeMX 中配置 LPBAM 应用程序
打开STM32CubeMX,在电路板选择器菜单中选择您的电路板:然后通过按下“否”按钮选择“启动没有外设初始化的项目”
为了避免生成无用的项目代码,稍后会初始化所需的外设
要在停用 TrustZone® 时构建 LPBAM 应用程序,请执行以下操作:选择“未激活 TrustZone”
单击“确定”
STM32CubeMX工具入口点始终是标准视图
建议打开项目管理器并保存主项目
对于此应用程序:单击“项目管理器”面板
将项目命名为LPGPIO_drive对于“项目位置”,请将项目与固件包中的其他示例一起保存
此时,项目已配置完毕,IOC 文件将保存在所选路径下
为了提高系统性能,建议在单向配置中启用 ICACHE 外设
为此,请单击“系统核心”菜单,然后单击“ICACHE”外围设备,并将“模式”更改为“1 路(直接映射缓存)”
在此应用中,我们使用 LED(PC7 为 LED 蓝色,PG2 为 LED 红色,PB7 为 LED 绿色)来观察项目运行时状态,并使用用户按钮引脚 (PC13) 作为带有外部中断的输入
选择具有上升沿触发检测的外部中断模式作为用户按钮 (PC13) 的 GPIO 模式启用 NVIC将 USB OTG 引脚(PA9 到 PA12)的状态设置为 GPIO 模拟以降低功耗
选择 Systick 作为时基要达到最高性能,请在“时钟配置”中,将系统时钟配置为最高值
PLL 1 配置如下:PLLM = 1PLLN = 80PLLP = 2锁相率 = 2PLLR = 22.3.1LPBAM场景和配置↑此时,主项目系统已配置完成
在下一步中,我们将构建“LPGPIO driving”应用程序
点击“LPBAM场景和配置”面板单击“+ 添加应用程序”选项以添加 LPBAM 应用程序 添加 LPBAM 应用程序时,STM32CubeMX 工具会显示 LBPAM 视图
至于标准视图,它包含“LPBAM场景和配置”,“引脚排列和配置”和“时钟配置”面板
信息项目中选择的命名应在代码生成的 API 和变量中重用
这确保了STM32CubeMX LPBAM工具视图和LPBAM生成的应用程序代码之间的一致性
警告建议仔细选择应用程序命名,以获得清晰易读的生成代码
为此,请执行以下操作:将应用程序的名称从 LpbamAp1 更改为“LPGPIO_drive”
将方案的名称更改为“TrigGPIO”
将队列的名称更改为“GPIOstate”
在引脚排列和配置中,在系统内核RCC下,启用低速时钟LSE
要达到硬件目标的最低功耗,您需要通过 PWR 外围设备关闭所有未使用的资源
为此,请执行以下操作:单击“引脚排列和配置”,然后单击“电源和热”,然后单击“PWR”
使能除SRAM4和ICACHE之外的所有SRAM的关断
现在在引脚排列和配置中配置LPBAM外设:单击“System Core”,然后单击“GPIO”并将 PA1 配置为 LPGPIO 输出下一步是配置 DMA 通道,以确保传输 LPTIM 信号以触发 LPGPIO
在 LPBAM 模式下,DMA 通道必须配置为链表模式
当 DMA 传输在无限循环中完成时,DMA 通道执行模式应配置为循环模式:左键单击“系统核心”,然后单击“LPDMA1”
启用“CH0”的“链接列表模式”
点击“CH0”
然后将“执行模式”更改为“循环”,以便PWM示例在无限循环中运行
在“传输事件生成”中,选择在最后一个链接列表项的(分别为半)端生成的 TC(和 HT)事件
接下来,转到“NVIC 设置”并启用“LPDMA1 SmartRun Channel 0 global interrupt”
所有 LPBAM 外设(LPGPIO、LPDMA1、LPTIM)现在都已配置完毕,可用于场景队列构建
信息请注意,之所以选择 LPDMA,是因为它在 Stop2 模式下仍能正常工作
单击计时器,然后单击“LPTIM1”
出现“LPTIM1 Mode and Configuration”(LPTIM1 模式和配置)窗口
配置以下更改:要修改 Period and Repetition 计数器的值,如下图所示,请单击此图标并选择 No check
在“用户常量”面板中,单击“添加”并创建三个“常量”:信息检查 AN5816[2]了解如何计算用户常量此时,LPTIM只需要LPTIM时钟配置,就可以生成PWM信号
在时钟配置中,选择 LSE 作为 LPTIM1 时钟源:2.3.2场景队列构建↑STEP1:第一个节点的 LPTIM1 配置顺序如下:1. 转到 LPTIM1 并单击“开始”前面的“+”
2. 将函数名称更改为“Start_1”
3. 将启动模式更改为“连续模式”
5. 在“触发器配置”下,将“函数执行是”保留为“不受触发器限制”
STEP2:为第二个节点配置LPTIM1配置序列,如下所示: 1. 进入LPTIM1,点击PWM前面的“+”
2. 将函数名称更改为“PWM_1”
3. 启用周期更新状态并插入 3270 作为周期值
4. 启用脉冲更新状态并插入 1630 作为脉冲值
5. 在“触发器配置”下,将“函数执行是”保留为“不受触发器限制”
STEP3:我们配置由前一个LPTIM信号触发的LPGPIO,周期为100毫秒,我们创建两个节点;一个用于设置,另一个用于重置
1. 转到LPGPIO1,然后单击“Write Pin”前面的“+”
2. 将函数名称更改为“Write_Pin_1”
3. 选择 PA1 作为引脚名称
4. 选择 Set as the pin State(设置为引脚状态)
5. 在“触发配置”下,将“功能执行是”从“不受触发器调节”更改为“在硬件信号的上升沿触发”
6. 将“触发硬件信号是”从“EXTI line 0”更改为“LPTIM CH1”
第 4 步:对于第二个节点,仅执行以下更改:1. 将函数名称更改为“Write_Pin_2”
2. 选择 Reset (重置) 作为引脚状态
3. 将函数执行更改为“在硬件信号的下降沿触发”
4. 将“触发硬件信号是”从“EXTI line 0”更改为“LPTIM CH1”
现在,我们将 LPTIM1 配置为 50 毫秒周期来触发 LPGPIO,我们选择将 LPTIM 配置为 2 个不同的频率以显示队列的独立性
为此,请重复步骤 2、3 和 4,并仅更改步骤 2 中的周期和脉冲值,如下所示:启用期间更新状态并插入 1630 作为期间值
启用脉冲更新状态并插入 815 作为脉冲值
现在,单击队列“GPIOstate”并选中循环模式,因此将队列置于一段时间 (1) 循环中,然后将箭头拖动到 LPTIM1: PWM_1 节点
按照这些步骤,您的队列应如下所示:信息检查UM1718[4]用于队列和节点管理
警告遵守函数执行顺序:配置队列参数必须先函数,先执行
此时,“LPGPIO 驱动器”应用程序内置于 STM32CubeMX LPBAM 工具中
然后建议通过“检查LPBAM设计”按钮检查LPBAM设计
STM32CubeMX工具在后台检查所构建应用程序的一致性
它会返回 LPBAM 日志中检测到的问题
注意:以下警告不会影响代码的生成
现在,所有 LPBAM 应用程序依赖项都已配置
2.4代码配置↑主应用程序和 LPBAM 应用程序已准备就绪,可以生成
单击“生成代码”或 CTRL+ S对于 LPBAM 应用程序,生成的文件是:• lpbam_lpgpio_drive.h• lpbam_lpgpio_drive_config.c • lpbam_lpgpio_drive_build.c • lpbam_lpgpio_drive_config.c它们包含主应用程序正确管理任何 LPBAM 应用程序所需的所有 API
转到 main.h 文件,在“USER CODE BEGIN INCLUDES”用户部分添加 «#include < stdint.h>»
并在 USER CODE BEGIN ET 中添加:/ USER CODE BEGIN Includes /#include <stdint.h>/ USER CODE END Includes // USER CODE BEGIN ET /typedef enum{ PB_NOT_PRESSED = 0, PB_PRESSED = 1,} PB_State_t;/ USER CODE END ET /在 main.c 文件中,在 “USER CODE BEGIN INCLUDES” 用户部分添加 «#include “lpbam_lpgpio_drive.h”»
/ USER CODE BEGIN Includes / #include "lpbam_lpgpio_drive.h"/ USER CODE END Includes /在主 () API 的核心中,我们使用的 LED 必须在“USER CODE BEGIN PD”用户部分中初始化
USER CODE BEGIN PD /#define LED_GREEN ((uint32_t) (0X0U))#define LED_BLUE ((uint32_t) (0X1U))#define LED_RED ((uint32_t) (0X2U))#define ERROR_NONE ((int32_t) (0x0))/ USER CODE END PD /将按钮声明添加到 main.c 中的 “USER CODE BEGIN PV” 用户部分
USER CODE BEGIN PV // Push Button State /__IO uint32_t PushButtonState = PB_NOT_PRESSED;/ USER CODE END PV /现在,在 main.c 中名为“USER CODE BEGIN PFP”的用户部分下添加函数声明
/ USER CODE BEGIN PFP /static void Enter_Stop2_Mode(void);static int32_t LED_On(uint32_t Led);static int32_t LED_Off(uint32_t Led);/ USER CODE END PFP /为了达到最低功耗,LPBAM方案中未使用的所有引脚都配置为模拟模式,包括调试引脚
初始化 LED 和按钮后,您需要调用 LPBAM 生成的 API 来初始化、构建、链接和启动 “USER CODE BEGIN 2” 用户部分中的 LPBAM 应用程序
警告必须遵循以下调用顺序才能运行任何 LPBAM 应用程序
/ LPBAM_LPGPIO_drive application init / MX_LPGPIO_drive_Init(); / LPBAM_LPGPIO_drive application TrigGPIO init / MX_LPGPIO_drive_TrigGPIO_Init(); / LPBAM_LPGPIO_drive application TrigGPIO build / MX_LPGPIO_drive_TrigGPIO_Build(); / LPBAM_LPGPIO_drive application TrigGPIO link / MX_LPGPIO_drive_TrigGPIO_Link(&handle_LPDMA1_Channel0); / LPBAM_LPGPIO_drive application TrigGPIOstart / MX_LPGPIO_drive_TrigGPIO_Start(&handle_LPDMA1_Channel0);此时,LPBAM应用程序正在运行
必须进入 Stop2 模式: / Enter Stop2 mode / Enter_Stop2_Mode ();用户按钮引脚 (PC13) 配置为具有外部中断 (EXTI_Line13) 下降沿的输入
按下时,系统将从 Stop2 模式唤醒
电路板 LED 用于监控传输状态:LED_GREEN:在应用程序结束时打开从 Stop2 模式唤醒后和按下用户按钮之前LED_BLUE开启
/ Reset push button state / PushButtonState = PB_NOT_PRESSED; / Turn LED_BLUE on / LED_On(LED_BLUE); / Wait for the next push button press to stop the LPBAM LPGPIO_drive application TrigGPIO scenario / while (PushButtonState == PB_NOT_PRESSED); / Turn LED_BLUE off / LED_Off(LED_BLUE);对于此应用程序,您还需要在“USER CODE BEGIN 2”用户部分调用以下 API
这将停止、取消链接并取消初始化 LPBAM 应用程序,并且绿色 LED 亮起
/LPBAM_LPGPIO_drive application TrigGPIO scenario stop / MX_LPGPIO_drive_TrigGPIO_Stop(&handle_LPDMA1_Channel0); / LPBAM_LPGPIO_driveapplication TrigGPIO scenario unlink / MX_LPGPIO_drive_TrigGPIO_UnLink(&handle_LPDMA1_Channel0); / LPBAM_LPGPIO_drive application TrigGPIO scenario de-init / MX_LPGPIO_drive_TrigGPIO_DeInit(); LED_On(LED_GREEN);任何其他服务都可以在 main.c 文件的用户代码下添加
对于此应用程序,需要一个应用程序 API,该 API:进入 Stop2 模式并检查系统是否处于停止模式这些功能被添加到“USER CODE BEGIN 4”用户部分
/ USER CODE BEGIN 4 /static void Enter_Stop2_Mode(void){ / Enter the system to STOP2 mode / __HAL_RCC_PWR_CLK_ENABLE (); HAL_PWREx_EnterSTOP2Mode (PWR_STOPENTRY_WFI); / Check that the system was resumed from stop 2 / if (__HAL_PWR_GET_FLAG (PWR_FLAG_STOPF) == 0U) { Error_Handler(); } / Clear stop flag / __HAL_PWR_CLEAR_FLAG(PWR_FLAG_STOPF); / Check that the stop flag is cleared / if (__HAL_PWR_GET_FLAG(PWR_FLAG_STOPF) != 0U) { Error_Handler(); }}现在,添加 GPIO_EXTI Callback 函数以及 LED_On 和 LED_Off 函数
void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin){ / Prevent unused argument(s) compilation warning / UNUSED(GPIO_Pin); PushButtonState = PB_PRESSED;}static int32_t LED_On(uint32_t led){ int32_t ret = ERROR_NONE; if(LED_GREEN == led) { HAL_GPIO_WritePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin, GPIO_PIN_SET); } else if (LED_BLUE == led) { HAL_GPIO_WritePin(LED_BLUE_GPIO_Port, LED_BLUE_Pin, GPIO_PIN_SET); } else if (LED_RED == led) { HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, GPIO_PIN_SET); } else { // Do nothing } return ret;}static int32_t LED_Off(uint32_t led){ int32_t ret = ERROR_NONE; if(LED_GREEN == led) { HAL_GPIO_WritePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin, GPIO_PIN_RESET); } else if (LED_BLUE == led) { HAL_GPIO_WritePin(LED_BLUE_GPIO_Port, LED_BLUE_Pin, GPIO_PIN_RESET); } else if (LED_RED == led) { HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, GPIO_PIN_RESET); } else { // Do nothing } return ret;}/ USER CODE END 4 /警告对于此应用,使用的DMA通道只能访问同一电源域中的SRAM4
因此,将 RAM 的起始地址更改为可由 DMA 通道访问为此,在STM32CubeIDE的Project Explorer>Debug中,转到STM32U575ZITXQ_FLASH.ld并配置RAM ORIGIN = 0x28000000和LENGTH = 16 KB2.4.1编译和烧录↑根据应用程序阶段,可以启用或禁用调试配置
在开发阶段,最好在低功耗模式下启用调试以进行调试为此,请执行以下操作:1. 单击“调试配置”图标2. 点击STM32 C/C++应用程序3. 点击“新启动配置图标”4. 在低功耗模式下启用调试开发应用程序后,为了达到最佳功耗,请确保在低功耗模式下禁用调试
单击“生成”按钮单击“运行”按钮执行下载代码后,LPBAM 场景以无限循环重复
使用逻辑分析仪,我们可视化了LPTIM和LPGPIO信号
如上图所示,LPGPIO0_PA1在 50 和 100 ms 周期的LPTIM_PC1信号之后设置或复位
2.5功耗测量↑为了测量应用的功耗,STM32 Power Shield应用用于为Nucleo板供电
为此,您可以使用 X-NUCLEO-LPM01A[5]用于功耗测量的扩展板及其用户手册[6]信息关于使用LPBAM的功耗,请检查AN5845[7]了解更多详情
Power Shield 是一种即插即用的解决方案,旨在简化功耗测量
在stop2模式下使用带有STM32U575 Nucleo板的电源扩展板,我们测量了4.06μA,与数据表一致[8].3如何使用LPBAM进行I2C或SPI传输↑这种情况适用于与外部组件(如MEM传感器)连接时,例如通过I2C或SPI连接
LPBAM和LPDMA可用于将数据从外设传输到存储器中,MCU内核仅在传输完成时唤醒:完成时唤醒
有关 SPI 或 I2C 传输的示例,请按照以下路径查看 STM32U5 Cube 固件中的示例:1) STM32Cube\Repository\STM32Cube_FW_U5\Projects\NUCLEO-U575ZI-Q\Applications\LPBAM\LPBAM_I2C_TransmitReceive2) STM32Cube\Repository\STM32Cube_FW_U5\Projects\NUCLEO-U575ZI-Q\Applications\LPBAM\LPBAM_SPI_TransmitReceive4如何使用LPBAM进行ADC或DAC转换↑我们还可以使用周期性定时器触发ADC,并在设备其余部分处于休眠状态时将数据存储在内存中
For examples of ADC or DAC, check the example in the STM32U5 Cube Firmware following this path:STM32Cube\Repository\STM32Cube_FW_U5\Projects\NUCLEO-U575ZI-Q\Applications\LPBAM\LPBAM_ADC_TempSenseSTM32Cube\Repository\STM32Cube_FW_U5\Projects\NUCLEO-U575ZI-Q\Applications\LPBAM\LPBAM_DAC_OPAMP_SigAmpliInformationCheck AN5816 [2] for the STM32CubeMX LPBAM TempSense application description and building.5How to use LPBAM for LPTIM PWM ratio change, Input Capture, Pulse Counter↑The LPTIM can be used for timing and output generation while the STM32 device is in low-power mode. it provides the basic functions of the STM32 general-purpose timers with the advantage of very low-power consumption. Additionally, when configured in Asynchronous counting mode, the LPTIM keeps running even when no internal clock source is active.有关 LPTIM PWM 配比更改的示例,请按照以下路径检查 STM32U5 Cube 固件中的示例:STM32Cube\Repository\STM32Cube_FW_U5\Projects\NUCLEO-U575ZI-Q\Applications\LPBAM\LPBAM_LPTIM_PWMGen信息检查 AN4865[9]适用于STM32 MCU和MPU上的低功耗定时器(LPTIM)应用用例
更复杂的应用可以使用多个DMA通道或来自同一通道上不同外设的链式操作来构建,如AN5834中的情况[10]描述了 STM32U5 Nucleo 板中包含的 LC 传感器计量功能 NUCLEO-U575ZI-Q[11].6参考资料↑MOOC培训STM32U5在线培训Jump up↑ AN5652 STM32U5系列功耗优化↑Jump up to:2.0 2.1 2.2 AN5816 如何使用STM32CubeMX构建STM32 LPBAM应用程序Jump up↑ 视频:使用STM32CubeMX在STM32U5上配置LPBAM应用Jump up↑ UM1718 用户手册Jump up↑ X-核-LPM01AJump up↑ STM32 Nucleo 扩展板用户手册
Jump up↑ AN5845 STM32U5 系列使用 LPBAM 进行功耗优化Jump up↑ 数据表 STM32U575xxJump up↑ AN4865 STM32 MCU和MPU上的低功耗定时器(LPTIM)应用案例Jump up↑ AN5834 LC 传感器计量在具有 LPBAM 的 STM32U5 系列上实现Jump up↑ 核-U575ZI-Q
入门外设系统LPBAM(入门外设系统应用程序模式)
(图片来源网络,侵删)

联系我们

在线咨询:点击这里给我发消息