打印
[应用相关]

STM32U585 LPBAM 模式

[复制链接]
557|28
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
LEDyyds|  楼主 | 2022-4-30 22:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1. 引言
LPBAM 全称为 low-power background autonomous mode,系统时钟可以在进入低功
耗模式之后打开和关闭, 可以触发
DMA 请求,其可以在 stop0stop1stop2 模式下使
用。 在
stop 模式下除了 LSI LSE 以外其他时钟都会关闭,但 MSIK HSI16 可以被临
时使能, 以支持
DMA 传输,这就是 LPBAM 的特点。
另外,
LPBAM 需要 DMA 来进行配合, U5 系列的 DMA Linked List 功能,也就是说
DMA 可以完成链表设计好的任务。在初始化的时候,以链表模式设置好 DMA 相关寄存
器,可以以链表模式完成内存到内存,或者内存和外设寄存器之间的数据传输。
由于
LBAM 的特性,在进行低功耗应用设计时,可以使用 LPBAM 大大减少功耗,提
升产品的低功耗性能。比如,可以在
stop2 模式下进行串口收发, ADC 采集任务等等。
本文将介绍如何使用
CubeMX, 配置 DMA Linked List, 在低功耗模式下,使用
LPBAM 进行 GPIO Toggle  

使用特权

评论回复
沙发
LEDyyds|  楼主 | 2022-4-30 22:26 | 只看该作者
2. 准备工作
2.1. 环境准备
测试硬件: B-U585I-IOT02A 开发板
图1. B-U585I-IOT02A



测试开发环境: IAR 8.50.1
CubeMX 版本: 6.30.0


使用特权

评论回复
板凳
LEDyyds|  楼主 | 2022-4-30 22:26 | 只看该作者
2.2. 设计思路
图2. 设计框图

如图所示,我们先在内存中定义好需要写入 GPIO 寄存器的数值,其中 Set GPIO 就将
数据写入 BSRR 寄存器, Reset GPIO 就将数据写入 BRR 寄存器。 LPDMA 设置两个节
点,一个去 Set GPIO,另一个 Reset GPIO,然后由软件触发,由 LPTIM1 CH1 的上升沿
触发 LPDMA 第一个节点进行动作, LPTIM1 CH1 的下降沿触发 LPDMA 第二个节点进行
动作。
LPTIM1 设置使用 LSI 32KHz 为时钟,频率为 32KHz,占空比为 50%的 PWM 波输
出,也就是说 GPIO 会以 500ms 的频率进行 toggle。



使用特权

评论回复
地板
LEDyyds|  楼主 | 2022-4-30 22:29 | 只看该作者
本帖最后由 LEDyyds 于 2022-4-30 22:30 编辑

3. Step By Step
图3. STEP 1: 选择芯片  


图4. STEP2:配置 RCC

图5. STEP3:配置时钟树

图6. STEP4-1:配置板载 LED

图7. STEP4-2:配置 USER BUTTON

图8. STEP4-3:配置 LPGPIO

图9. STEP5:配置 DMA

图10. STEP6-1:配置 LPTIM

图11. STEP6-2:配置 LPTIM

使用特权

评论回复
5
LEDyyds|  楼主 | 2022-4-30 22:30 | 只看该作者
图12. STEP7:打开 ICACHE



使用特权

评论回复
6
LEDyyds|  楼主 | 2022-4-30 22:31 | 只看该作者
图13. STEP8-1: Linked List Queue 配置  


使用特权

评论回复
7
LEDyyds|  楼主 | 2022-4-30 22:31 | 只看该作者
图14. STEP8-2: Linked List 节点配置

使用特权

评论回复
8
LEDyyds|  楼主 | 2022-4-30 22:32 | 只看该作者
图15. STEP8-3: Linked List 节点配置

使用特权

评论回复
9
LEDyyds|  楼主 | 2022-4-30 22:33 | 只看该作者
图16. STEP9-1:项目配置




使用特权

评论回复
10
LEDyyds|  楼主 | 2022-4-30 22:34 | 只看该作者
图17. STEP9-2:项目配置




使用特权

评论回复
11
LEDyyds|  楼主 | 2022-4-30 22:35 | 只看该作者
STEP10-1:代码修改 main.c
/* USER CODE BEGIN Includes */
#include "linked_list.h"
/* USER CODE END Includes */
/* USER CODE BEGIN PV */
__IO uint32_t UserButtonStatus = 0U;
/* USER CODE END PV */
int main(void)
{
……
/* USER CODE BEGIN 2 */
while (UserButtonStatus == 0U)
{
HAL_Delay(200);
HAL_GPIO_WritePin(GPIOH, LED_RED_Pin|LED_GREEN_Pin, GPIO_PIN_RESET);
HAL_Delay(200);
HAL_GPIO_WritePin(GPIOH, LED_RED_Pin|LED_GREEN_Pin, GPIO_PIN_SET);
}
__HAL_RCC_PWR_CLK_ENABLE();
HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI);
/* USER CODE END 2 */
}
static void MX_LPDMA1_Init(void)
{
……
/* USER CODE BEGIN LPDMA1_Init 2 */
MX_GPIO_Q_Config();
/* Link queue to DMA channel */
if (HAL_DMAEx_List_LinkQ(&handle_LPDMA1_Channel0, &GPIO_Q) != HAL_OK)
{
Error_Handler();
}
/* Start linked list */
if (HAL_DMAEx_List_Start(&handle_LPDMA1_Channel0) != HAL_OK)
{
Error_Handler();
}
/* USER CODE END LPDMA1_Init 2 */
}
static void MX_LPTIM1_Init(void)
{
……
/* USER CODE BEGIN LPTIM1_Init 2 */
HAL_LPTIM_PWM_Start(&hlptim1, LPTIM_CHANNEL_1);
/* USER CODE END LPTIM1_Init 2 */
}




使用特权

评论回复
12
LEDyyds|  楼主 | 2022-4-30 22:36 | 只看该作者
STEP10-2:代码修改 main.h
/* USER CODE BEGIN EFP */
extern __IO uint32_t UserButtonStatus;
/* USER CODE END EFP */




使用特权

评论回复
13
LEDyyds|  楼主 | 2022-4-30 22:36 | 只看该作者
STEP10-3:代码修改 stm32u5xx_it.c
/* USER CODE BEGIN EFP */
extern __IO uint32_t UserButtonStatus;
/* USER CODE END EFP */
void EXTI13_IRQHandler(void)
{
……
/* USER CODE BEGIN EXTI13_IRQn 1 */
UserButtonStatus = 1;
/* USER CODE END EXTI13_IRQn 1 */
}




使用特权

评论回复
14
LEDyyds|  楼主 | 2022-4-30 22:37 | 只看该作者
STEP10-4:代码修改 linked_list.c
/* USER CODE BEGIN PD */
uint32_t gpio_value [url=home.php?mod=space&uid=72445]@[/url] 0x28000000 = 0x00000200;
/* USER CODE END PD */




使用特权

评论回复
15
LEDyyds|  楼主 | 2022-4-30 22:38 | 只看该作者
STEP10-5: stm32u5xx_hal_msp.c
void HAL_MspInit(void)
{
……
/* USER CODE BEGIN MspInit 1 */
/* Enable LPGPIO1 autonomous mode clock */
__HAL_RCC_LPGPIO1_CLKAM_ENABLE();
__HAL_RCC_LPGPIO1_CLK_SLEEP_ENABLE();
/* Enable LPDMA1 autonomous mode clock */
__HAL_RCC_LPDMA1_CLK_SLEEP_ENABLE();
__HAL_RCC_LPDMA1_CLKAM_ENABLE();
/* Enable LPTIM1 autonomous mode clock */
__HAL_RCC_LPTIM1_CLK_SLEEP_ENABLE();
__HAL_RCC_LPTIM1_CLKAM_ENABLE();
/* Enable SRAM4 autonomous mode clock */
__HAL_RCC_SRAM4_CLK_SLEEP_ENABLE();
__HAL_RCC_SRAM4_CLKAM_ENABLE();
/* USER CODE END MspInit 1 */
}




使用特权

评论回复
16
LEDyyds|  楼主 | 2022-4-30 22:39 | 只看该作者
STEP11: link file 修改 : stm32u585xx_flash.icf
define symbol __ICFEDIT_region_RAM_start__ = 0x28000000;
define symbol __ICFEDIT_region_RAM_end__ = 0x28003FFF;

修改完后,编译工程,在按下 USER BUTTON 后,系统将进入 STOP2 模式, 板载 LED 会停止
toggle,但是 LPGPIO 控制的 LED 仍然会继续 toggle。



使用特权

评论回复
17
LEDyyds|  楼主 | 2022-4-30 22:40 | 只看该作者
4. 总结
本文介绍了 LPBAM 模式,以及如何使用 CubeMX 方便地配置 DMA Linked List,最后
完成了在 CPU 进入 Stop2 模式下的 GPIO toggle 任务。 LPBAM 模式将会在打造超低功耗
的产品中发挥非常重要的作用。

使用特权

评论回复
18
yangjiaxu| | 2022-4-30 22:45 | 只看该作者
还得是cubemx。属实好用啊,这个软件如果能配置其他的MCU的底层驱动就好了,只能配置ST的有点儿浪费了,哈哈哈

使用特权

评论回复
19
Bblythe| | 2022-10-6 07:30 | 只看该作者

128以上的某些地址为特殊寄存器使用,不能给程序用

使用特权

评论回复
20
Pulitzer| | 2022-10-6 10:29 | 只看该作者

对于优秀程序员来说,这不是好代码

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

105

主题

640

帖子

1

粉丝