在低功耗的器件中,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作为主时钟。
我们这里就直接上代码了,大家可以看看
以下是串口的代码
- #include "LP_UART.h"
- UART_HandleTypeDef LP_UART1;
-
- void LP_UART_Init(void)
- {
- __HAL_RCC_LPUART1_CLK_ENABLE();
- __HAL_RCC_GPIOA_CLK_ENABLE();
-
- //--设置复用---
- GPIO_InitTypeDef gpio_init_structure;
- /* Configure USART Tx as alternate function */
- gpio_init_structure.Pin = GPIO_PIN_2;
- gpio_init_structure.Mode = GPIO_MODE_AF_PP;
- gpio_init_structure.Speed = GPIO_SPEED_FREQ_HIGH;
- gpio_init_structure.Pull = GPIO_PULLUP;
- gpio_init_structure.Alternate = GPIO_AF8_LPUART1;
- HAL_GPIO_Init(GPIOA, &gpio_init_structure);
- /* Configure USART Rx as alternate function */
- gpio_init_structure.Pin = GPIO_PIN_3;
- gpio_init_structure.Mode = GPIO_MODE_AF_PP;
- gpio_init_structure.Alternate = GPIO_AF8_LPUART1;
- HAL_GPIO_Init(GPIOA, &gpio_init_structure);
-
-
-
- LP_UART1.Instance = LPUART1;
- LP_UART1.Init.BaudRate = 115200;
- LP_UART1.Init.WordLength = UART_WORDLENGTH_8B;
- LP_UART1.Init.StopBits = UART_STOPBITS_1;
- LP_UART1.Init.Parity = UART_PARITY_NONE;
- LP_UART1.Init.Mode = UART_MODE_TX_RX;
- LP_UART1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
- LP_UART1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
- LP_UART1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
- LP_UART1.FifoMode = UART_FIFOMODE_DISABLE;
- if (HAL_UART_Init(&LP_UART1) != HAL_OK)
- {
- }
- if (HAL_UARTEx_SetTxFifoThreshold(&LP_UART1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
- {
- }
- if (HAL_UARTEx_SetRxFifoThreshold(&LP_UART1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
- {
- }
- if (HAL_UARTEx_DisableFifoMode(&LP_UART1) != HAL_OK)
- {
- }
- }
- void LP_UART_SendData(unsigned char *Data,unsigned int Len)
- {
- HAL_UART_Transmit(&LP_UART1,Data,Len,200);
- }
- void LP_UART_Test(void)
- {
- LP_UART_SendData("This is LPUART Demo!\r\n",22);
- }
复制代码下面的是LPUART的代
- #include "LP_TIM.h"
- #include "LP_UART.h"
- LPTIM_HandleTypeDef LPTim1;
- unsigned int Enablecount=0;
- void LP_TIM_Init(void)
- {
- LPTim1.Instance = LPTIM1;//--56M 选择时钟
- LPTim1.Init.Clock.Source = LPTIM_CLOCKSOURCE_APBCLOCK_LPOSC; //--时钟选择--
- LPTim1.Init.Clock.Prescaler = LPTIM_PRESCALER_DIV1; //--
- LPTim1.Init.Trigger.Source = LPTIM_TRIGSOURCE_SOFTWARE; //--
- LPTim1.Init.Trigger.ActiveEdge = LPTIM_ACTIVEEDGE_RISING; //--
- LPTim1.Init.Trigger.SampleTime = LPTIM_TRIGSAMPLETIME_DIRECTTRANSITION;
- LPTim1.Init.Period = 32767;
- LPTim1.Init.UpdateMode = LPTIM_UPDATE_IMMEDIATE;
- LPTim1.Init.CounterSource = LPTIM_COUNTERSOURCE_INTERNAL;
- LPTim1.Init.Input1Source = LPTIM_INPUT1SOURCE_GPIO;
- LPTim1.Init.RepetitionCounter = 999;
- // HAL_LPTIM_TimeOut_Start_IT(&LPTim1, 32768);
- // HAL_TIM_MspPostInit(&LPTim1);
- if (HAL_LPTIM_Init(&LPTim1) != HAL_OK)
- {
- Enablecount=1;
- }
- else{ Enablecount=2;}
- HAL_LPTIM_TimeOut_Start_IT(&LPTim1, 32767);
- }
- unsigned int LP_TimCount=0;
- void TIM6_DAC_LPTIM1_IRQHandler(void)
- {
- if (__HAL_LPTIM_GET_FLAG(&LPTim1, LPTIM_FLAG_UPDATE) != RESET)
- {
- __HAL_LPTIM_CLEAR_FLAG(&LPTim1, LPTIM_FLAG_UPDATE);
- LP_TimCount++;
- if(LP_TimCount==500 )
- {
- LP_TimCount=0;
- HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
- LP_UART_Test();
- }
- }
- }
复制代码大家感兴趣的话可以自己做一下尝试。
|