回答

收藏

[评测分享] 【NUCLEO-U083RC试用】- 02-LPUART以及LPTIM的使用

#板卡评测 #板卡评测 2544 人阅读 | 0 人回复 | 2024-06-03

在低功耗的器件中,LPUART以及LPTIM都扮演了重要的角色,我们几天就来说一下LPUART以及LPTIM的使用方法,

我们首先从外设上来看,LPUART以及LPTIM的数量都是三个,我们这里分别一LPTIM1和LPUART1作为案例来使用,关于LPUART,我们可以看看官方怎么说的。

低功耗通用异步接收发射机(LPUART)这些设备嵌入了三个LPUART。外围设备支持具有最小功耗的异步串行通信,以及半双工单线通信和调制解调器操作(CTS/RTS)。他们允许多处理器通信。LPUART具有独立于CPU时钟的时钟域,可以从停止模式唤醒系统使用高达220 Kbaud的波特率。停止模式唤醒事件是可编程的,可以是:

?起始位检测
?任何接收到的数据帧
?特定编程数据帧
只需要32.768 kHz时钟(LSE)就可以实现高达9600波特的LPUART通信。因此,即使在在停止模式下,LPUART可以等待输入帧,同时具有极低的能耗。到达到更高的波特率时,可以使用更高速的时钟。LPUART接口可以由DMA控制器提供服务。

按照官方的说法,LPUART是可以是用LSE的时钟作为参考到的。我们可以在低功耗下使用用LSE,在正常工作模式下使用MSI或者HSI作为主时钟。


我们这里就直接上代码了,大家可以看看

以下是串口的代码

  1. #include "LP_UART.h"


  2. UART_HandleTypeDef LP_UART1;

  3. void LP_UART_Init(void)
  4. {
  5.   __HAL_RCC_LPUART1_CLK_ENABLE();
  6.         __HAL_RCC_GPIOA_CLK_ENABLE();  
  7.        
  8.         //--设置复用---
  9.         GPIO_InitTypeDef  gpio_init_structure;
  10.           /* Configure USART Tx as alternate function */
  11.   gpio_init_structure.Pin       = GPIO_PIN_2;
  12.   gpio_init_structure.Mode      = GPIO_MODE_AF_PP;
  13.   gpio_init_structure.Speed     = GPIO_SPEED_FREQ_HIGH;
  14.   gpio_init_structure.Pull      = GPIO_PULLUP;
  15.   gpio_init_structure.Alternate = GPIO_AF8_LPUART1;
  16.   HAL_GPIO_Init(GPIOA, &gpio_init_structure);

  17.   /* Configure USART Rx as alternate function */
  18.   gpio_init_structure.Pin       = GPIO_PIN_3;
  19.   gpio_init_structure.Mode      = GPIO_MODE_AF_PP;
  20.   gpio_init_structure.Alternate = GPIO_AF8_LPUART1;
  21.   HAL_GPIO_Init(GPIOA, &gpio_init_structure);
  22.        
  23.        
  24.        
  25.   LP_UART1.Instance = LPUART1;
  26.   LP_UART1.Init.BaudRate = 115200;
  27.   LP_UART1.Init.WordLength = UART_WORDLENGTH_8B;
  28.   LP_UART1.Init.StopBits = UART_STOPBITS_1;
  29.   LP_UART1.Init.Parity = UART_PARITY_NONE;
  30.   LP_UART1.Init.Mode = UART_MODE_TX_RX;
  31.   LP_UART1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  32.   LP_UART1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  33.   LP_UART1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  34.   LP_UART1.FifoMode = UART_FIFOMODE_DISABLE;
  35.   if (HAL_UART_Init(&LP_UART1) != HAL_OK)
  36.   {

  37.   }
  38.   if (HAL_UARTEx_SetTxFifoThreshold(&LP_UART1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
  39.   {

  40.   }
  41.   if (HAL_UARTEx_SetRxFifoThreshold(&LP_UART1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
  42.   {

  43.   }
  44.   if (HAL_UARTEx_DisableFifoMode(&LP_UART1) != HAL_OK)
  45.   {

  46.   }
  47. }


  48. void LP_UART_SendData(unsigned char *Data,unsigned int Len)
  49. {
  50.    HAL_UART_Transmit(&LP_UART1,Data,Len,200);
  51. }



  52. void LP_UART_Test(void)
  53. {
  54.    LP_UART_SendData("This is LPUART Demo!\r\n",22);
  55. }
复制代码
下面的是LPUART的代

  1. #include "LP_TIM.h"
  2. #include "LP_UART.h"


  3. LPTIM_HandleTypeDef LPTim1;

  4. unsigned int Enablecount=0;

  5. void LP_TIM_Init(void)
  6. {
  7.   LPTim1.Instance = LPTIM1;//--56M 选择时钟
  8.   LPTim1.Init.Clock.Source = LPTIM_CLOCKSOURCE_APBCLOCK_LPOSC;  //--时钟选择--
  9.   LPTim1.Init.Clock.Prescaler = LPTIM_PRESCALER_DIV1;           //--
  10.   LPTim1.Init.Trigger.Source = LPTIM_TRIGSOURCE_SOFTWARE;       //--
  11.   LPTim1.Init.Trigger.ActiveEdge = LPTIM_ACTIVEEDGE_RISING;     //--
  12.   LPTim1.Init.Trigger.SampleTime = LPTIM_TRIGSAMPLETIME_DIRECTTRANSITION;
  13.   LPTim1.Init.Period = 32767;
  14.   LPTim1.Init.UpdateMode = LPTIM_UPDATE_IMMEDIATE;
  15.   LPTim1.Init.CounterSource = LPTIM_COUNTERSOURCE_INTERNAL;
  16.   LPTim1.Init.Input1Source = LPTIM_INPUT1SOURCE_GPIO;
  17.   LPTim1.Init.RepetitionCounter = 999;
  18. //        HAL_LPTIM_TimeOut_Start_IT(&LPTim1, 32768);
  19. //        HAL_TIM_MspPostInit(&LPTim1);
  20.   if (HAL_LPTIM_Init(&LPTim1) != HAL_OK)
  21.   {
  22.                 Enablecount=1;
  23.   }
  24.         else{ Enablecount=2;}
  25.         HAL_LPTIM_TimeOut_Start_IT(&LPTim1, 32767);
  26. }
  27. unsigned int LP_TimCount=0;


  28. void TIM6_DAC_LPTIM1_IRQHandler(void)
  29. {
  30.   if (__HAL_LPTIM_GET_FLAG(&LPTim1, LPTIM_FLAG_UPDATE) != RESET)
  31.   {
  32.                 __HAL_LPTIM_CLEAR_FLAG(&LPTim1, LPTIM_FLAG_UPDATE);
  33.                 LP_TimCount++;
  34.                 if(LP_TimCount==500 )
  35.                 {
  36.                                 LP_TimCount=0;
  37.                                 HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
  38.                                 LP_UART_Test();
  39.                 }
  40.         }
  41. }

复制代码
大家感兴趣的话可以自己做一下尝试。


分享到:
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

职员
8299 积分
58 主题
+ 关注
热门推荐
关闭

站长推荐上一条 /3 下一条