[STM32U0] 【STM32U083测评】测评之三:ULPuart测评

[复制链接]
2344|11
 楼主| abner_ma 发表于 2024-4-25 16:28 | 显示全部楼层 |阅读模式
  STM32U083多达20个通信接口:•带LPM和BCD的USB 2.0全速无晶体解决方案
•7x USART/LUART(四个USART,三个 LPUART,SPI、ISO 7816、LIN、IrDA、调制解调器)
•4个I2C接口,支持快速模式和快速模式Plus(最高1 Mbit/s)
•3个SPI,外加4个SPI模式下的USART
•IRTIM(红外接口)



    低功耗通用异步接收发射机(LPUART)这些设备嵌入了三个LPUART。外围设备至少支持异步串行通信功率消耗以及半双工单线通信和调制解调器操作(CTS/RTS)。他们允许多处理器通信。LPUART具有独立于CPU时钟的时钟域,可以从停止模式唤醒系统使用高达220 Kbaud的波特率。停止模式唤醒事件是可编程的:
•起始位检测
•任何接收到的数据帧
•特定编程数据帧
只需要32.768 kHz时钟(LSE)就可以实现高达9600波特的LPUART通信。因此,即使在在停止模式下,LPUART可以等待输入帧,同时具有极低的能耗。到
达到更高的波特率时,可以使用更高速的时钟。LPUART接口可以由DMA控制器提供服务。


1.png


    STM32U0系列微控制器中的ULP(Ultra Low Power)UART接口设计用于在低功耗应用中实现串行通信。以下是使用STM32U0 ULP UART的一些关键细节和注意事项:
[color=rgba(0, 0, 0, 0.85)]
  • 硬件特性:

    • 超低功耗模式支持:ULP UART具备在低功耗模式下保持唤醒源的能力,允许在微控制器处于低功耗状态下依然能够接收数据或触发中断,从而快速唤醒并处理通信事件,有助于降低系统平均功耗。
    • 电源管理:ULP UART可能集成电源管理特性,如低电压检测、自动电源关断等,有助于在闲置时减少电流消耗。
    • 专用低功耗引脚:某些型号的STM32U0可能提供专门针对低功耗优化的UART引脚,这些引脚在待机或睡眠模式下具有更低的漏电流,有助于降低整体系统功耗。
  • 软件配置:

    • 波特率设置:根据实际通信需求选择合适的波特率。ULP UART可能支持较低的波特率选项,有利于在低功耗模式下降低通信时的瞬态电流。
    • 数据格式:配置数据位(通常是8位)、停止位(1或2位)、奇偶校验(无、奇校验、偶校验)等参数,确保与通信伙伴的设置一致。
    • 中断与DMA:
      • 中断:启用接收/发送中断,允许微控制器在数据准备好或传输完成时被唤醒,而非持续轮询,有助于节能。确保在中断服务程序中快速处理事件并返回低功耗状态。
      • DMA:如果ULP UART支持,可以使用DMA(Direct Memory Access)进行数据传输,无需CPU干预,进一步降低功耗。尤其在批量数据传输时,DMA可以显著减少CPU唤醒次数。
    • 低功耗模式切换:在进入低功耗模式前,确保正确配置UART的唤醒源(如空闲检测、接收数据可用等),并在唤醒后恢复正常的UART操作。
  • 功耗优化技巧:

    • 禁用未使用的功能:关闭不需要的UART功能(如硬件流控、校验等)以减少不必要的电流消耗。
    • 节电模式:利用ULP UART的节电模式(如果支持),在数据传输间隙降低工作频率或电压,减小功耗。
    • 唤醒阈值调整:某些ULP UART允许设置唤醒阈值,调整阈值可以平衡灵敏度与功耗,避免因噪声引起的误唤醒。
    • 软件定时器:使用精确的软件定时器代替连续轮询,以定期检查UART状态或处理数据,减少CPU活动时间。
  • 使用HAL库配置ULP UART的一般步骤包括:

    • 初始化:调用HAL_UART_Init()函数,设置UART参数(如波特率、数据格式等)。
    • 中断配置:开启相关中断(如接收中断),并编写对应的中断服务程序。
    • DMA配置(如果使用):配置DMA通道,关联到UART,并设置传输参数。
    • 发送/接收:使用HAL_UART_Transmit()、HAL_UART_Receive()或DMA相关函数进行数据传输。
  • 调试与测试:

    • 信号质量检查:使用示波器检查实际通信波形,确保信号完整性,无过冲、欠冲或噪声干扰。
    • 功耗测量:使用电流探头或功耗分析仪监测系统在不同工作状态(如数据传输、待机、睡眠等)下的电流消耗,验证功耗优化效果。
  1. #include "main.h"
  2. /* USER CODE BEGIN Includes */
  3. #include "stdio.h"
  4. /* USER CODE END Includes */

  5. /* Private includes ----------------------------------------------------------*/
  6. /* USER CODE BEGIN Includes */
  7. #include "stm32u0xx_nucleo.h"
  8. /* USER CODE END Includes */

  9. /* Private typedef -----------------------------------------------------------*/
  10. /* USER CODE BEGIN PTD */

  11. /* USER CODE END PTD */

  12. /* Private define ------------------------------------------------------------*/
  13. /* USER CODE BEGIN PD */
  14. //#define TRANSMITTER_BOARD
  15. /* USER CODE END PD */

  16. /* Private macro -------------------------------------------------------------*/
  17. /* USER CODE BEGIN PM */

  18. /* USER CODE END PM */

  19. /* Private variables ---------------------------------------------------------*/

  20. UART_HandleTypeDef hlpuart1;

  21. /* USER CODE BEGIN PV */
  22. /* UART IT status */
  23. __IO ITStatus UartReady = RESET;
  24. __IO ITStatus UartError = RESET;

  25. /* Buffer used for transmission */
  26. uint8_t aTxBuffer[] = " ****LPUART_Demo **** ";

  27. /* Buffer used for reception */
  28. uint8_t aRxBuffer[RXBUFFERSIZE];
  29. /* USER CODE END PV */

  30. /* Private function prototypes -----------------------------------------------*/
  31. void SystemClock_Config(void);
  32. static void MX_GPIO_Init(void);
  33. static void MX_LPUART1_UART_Init(void);
  34. /* USER CODE BEGIN PFP */
  35. static uint16_t Buffercmp(uint8_t* pBuffer1, uint8_t* pBuffer2, uint16_t BufferLength);

  36. int main(void)
  37. {
  38.   HAL_Init();
  39.   SystemClock_Config();
  40.   /* USER CODE BEGIN SysInit */
  41.   /* Configure LED4 */
  42.   BSP_LED_Init(LED4);
  43.   /* USER CODE END SysInit */

  44.   /* Initialize all configured peripherals */
  45.   MX_GPIO_Init();
  46.   MX_LPUART1_UART_Init();
  47.         
  48.   while(1)
  49.   {

  50.    HAL_UART_Transmit_IT(&hlpuart1, (uint8_t*)aTxBuffer, TXBUFFERSIZE);
  51.    HAL_Delay(1000);
  52.      }

  53. }

  54. void SystemClock_Config(void)
  55. {
  56.   RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  57.   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  58.   /** Configure the main internal regulator output voltage
  59.   */
  60.   HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);

  61.   /** Initializes the RCC Oscillators according to the specified parameters
  62.   * in the RCC_OscInitTypeDef structure.
  63.   */
  64.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI;
  65.   RCC_OscInitStruct.MSIState = RCC_MSI_ON;
  66.   RCC_OscInitStruct.MSICalibrationValue = RCC_MSICALIBRATION_DEFAULT;
  67.   RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_11;
  68.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  69.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  70.   {
  71.     Error_Handler();
  72.   }

  73.   /** Initializes the CPU, AHB and APB buses clocks
  74.   */
  75.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  76.                               |RCC_CLOCKTYPE_PCLK1;
  77.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_MSI;
  78.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  79.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;

  80.   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
  81.   {
  82.     Error_Handler();
  83.   }
  84. }

  85. /**
  86.   * [url=home.php?mod=space&uid=247401]@brief[/url] LPUART1 Initialization Function
  87.   * @param None
  88.   * @retval None
  89.   */
  90. static void MX_LPUART1_UART_Init(void)
  91. {

  92.   /* USER CODE BEGIN LPUART1_Init 0 */

  93.   /* USER CODE END LPUART1_Init 0 */

  94.   /* USER CODE BEGIN LPUART1_Init 1 */

  95.   /* USER CODE END LPUART1_Init 1 */
  96.   hlpuart1.Instance = LPUART1;
  97.   hlpuart1.Init.BaudRate = 115200;
  98.   hlpuart1.Init.WordLength = UART_WORDLENGTH_8B;
  99.   hlpuart1.Init.StopBits = UART_STOPBITS_1;
  100.   hlpuart1.Init.Parity = UART_PARITY_NONE;
  101.   hlpuart1.Init.Mode = UART_MODE_TX_RX;
  102.   hlpuart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  103.   hlpuart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  104.   hlpuart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  105.   hlpuart1.FifoMode = UART_FIFOMODE_DISABLE;
  106.   if (HAL_UART_Init(&hlpuart1) != HAL_OK)
  107.   {
  108.     Error_Handler();
  109.   }
  110.   if (HAL_UARTEx_SetTxFifoThreshold(&hlpuart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
  111.   {
  112.     Error_Handler();
  113.   }
  114.   if (HAL_UARTEx_SetRxFifoThreshold(&hlpuart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
  115.   {
  116.     Error_Handler();
  117.   }
  118.   if (HAL_UARTEx_DisableFifoMode(&hlpuart1) != HAL_OK)
  119.   {
  120.     Error_Handler();
  121.   }
  122.   /* USER CODE BEGIN LPUART1_Init 2 */

  123.   /* USER CODE END LPUART1_Init 2 */

  124. }

  125. /**
  126.   * [url=home.php?mod=space&uid=247401]@brief[/url] GPIO Initialization Function
  127.   * @param None
  128.   * @retval None
  129.   */
  130. static void MX_GPIO_Init(void)
  131. {
  132. /* USER CODE BEGIN MX_GPIO_Init_1 */
  133. /* USER CODE END MX_GPIO_Init_1 */

  134.   /* GPIO Ports Clock Enable */
  135.   __HAL_RCC_GPIOC_CLK_ENABLE();

  136. /* USER CODE BEGIN MX_GPIO_Init_2 */
  137. /* USER CODE END MX_GPIO_Init_2 */
  138. }
测试结果:


[color=rgba(0, 0, 0, 0.85)]相关链接



2.png
lvyunhua 发表于 2024-4-28 15:44 | 显示全部楼层
32.768K也能实现9600的波特率,里面是实现倍频了吗?唤醒方式也支持起始位唤醒,为通信低功耗设计提供便捷,支持下。
我想看大海 发表于 2024-4-28 16:31 | 显示全部楼层
这个功耗没测试一下吗
软核硬核 发表于 2024-4-28 16:55 | 显示全部楼层
用这个串口是不是可以非常省电?
鹿鼎计 发表于 2024-4-28 17:35 | 显示全部楼层
我们之前都是用外部中断+UART实现得。
中国龙芯CDX 发表于 2024-4-28 18:10 | 显示全部楼层
STM32U0系列微控制器中的ULP(Ultra Low Power)UART接口设计用于在低功耗应用中实现串行通信。
米多0036 发表于 2024-4-28 21:04 来自手机 | 显示全部楼层
白皮书有代码吗?从哪里获取的?
田舍郎 发表于 2024-4-29 22:11 来自手机 | 显示全部楼层
关注价格,能做到啥价格啊
lishjie 发表于 2024-5-20 15:22 | 显示全部楼层
很厉害的串口。
LOVEEVER 发表于 2024-6-28 17:59 | 显示全部楼层
低功耗通用异步接收发射机(LPUART)与串口有哪些区别?
kepe 发表于 2024-7-31 00:59 | 显示全部楼层
使用电流探头或功耗分析仪监测系统在不同工作状态(如数据传输、待机、睡眠等)下的电流消耗,验证功耗是否符合预期。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:项目经理
简介:资深嵌入式开发工程师

104

主题

191

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部