Uart не работает после выхода из режима остановки в stm32f4 - PullRequest
0 голосов
/ 30 мая 2019

Я использую режим STOP для экономии энергии, а также деинициализирую GPIO для достижения максимальной экономии энергии. В этом случае потребление тока становится ниже 1 мА. Я использую вывод UART Rx в качестве внешнего прерывания, чтобы вывести плату из режима STOP. Плата просыпается, но UART или другое периферийное устройство, например DCMI, не работает. Ниже приведен мой код.

void MX_GPIO_Deinit()
{
    GPIO_InitTypeDef GPIO_InitStruct;
    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_GPIOB_CLK_ENABLE();
    __HAL_RCC_GPIOC_CLK_ENABLE();
    __HAL_RCC_GPIOH_CLK_ENABLE();
    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Pin = GPIO_PIN_All;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
    HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
    /* Disable GPIOs clock */
    __HAL_RCC_GPIOA_CLK_DISABLE();
    __HAL_RCC_GPIOB_CLK_DISABLE();
    __HAL_RCC_GPIOC_CLK_DISABLE();
    __HAL_RCC_GPIOH_CLK_DISABLE();
}

void stopMode(void)
{
  HAL_SuspendTick();
  MX_GPIO_Deinit();
  __HAL_RCC_PWR_CLK_ENABLE();
  HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_1);

  GPIO_InitTypeDef GPIO_InitStruct;
  __HAL_RCC_GPIOA_CLK_ENABLE();
  GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  GPIO_InitStruct.Alternate = GPIO_AF8_UART4;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_SLEEPENTRY_WFI);
}

void resumeStopMode(void)
{
    SystemClock_Config();
    HAL_ResumeTick();
    MX_GPIO_Init();

    HAL_UART_MspInit(&huart4);
    HAL_I2C_MspInit(&hi2c2);
    HAL_DCMI_MspInit(&hdma_dcmi);
    HAL_TIM_MspPostInit(&htim1);
    MX_DMA_Init();
    MX_UART4_Init();
    MX_I2C2_Init();
    MX_DCMI_Init();
    MX_TIM1_Init();

    HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
}

int getChar()
{
   uint8_t InputData = 0;
   TimmingDelay = 50000;
   while (TimmingDelay !=0)
   {
       if (__HAL_UART_GET_FLAG(&huart4, UART_FLAG_ORE))
           __HAL_UART_CLEAR_OREFLAG(&huart4);

       if (__HAL_UART_GET_FLAG(&huart4, UART_FLAG_RXNE))
       {
           InputData = huart4.Instance->DR & 0x1FF;
           return InputData;
       }
   }
   return -1;
}

void main(void)
{
    stopMode()
    resumeStopMode() /* woken up by uart interrupt*/
    int receivedByte = 0;
    receivedByte = getChar() /* This line doesn't work after waking it goes into stop mode */
}

Поскольку я деинициализирую все GPIO, я не могу отлаживать. Как я могу заставить UART работать правильно после выхода из режима STOP.

1 Ответ

0 голосов
/ 07 июня 2019

Существует задержка включения, связанная с режимом STOP, чтобы позволить генератору RC HSI проснуться и, возможно, мигнуть и внутреннему регулятору.Если первый байт поврежден, то, скорее всего, он является результатом этой задержки.

...