STM3 USART + DMA не получает - PullRequest
       111

STM3 USART + DMA не получает

0 голосов
/ 03 сентября 2018

Я учился программировать на stm32 и столкнулся с проблемой, которую не могу отладить самостоятельно. По сути, я хочу получить 3 байта через UART и сохранить их в памяти, используя DMA. Любая помощь будет принята с благодарностью. Точный режим на Nucleo-F401RE

  #include "main.h"
#include "stm32f4xx_hal.h"
#include <string.h>
#include <stdlib.h>


UART_HandleTypeDef huart2;
DMA_HandleTypeDef hdma_usart2_tx;

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
uint8_t dataArrived =0;

int main(void)
{

HAL_Init();


  SystemClock_Config();

  MX_GPIO_Init();

  HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_SET);
  HAL_Delay(500);
  HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);
  HAL_Delay(500);

  __HAL_RCC_DMA1_CLK_ENABLE();  //enable clock to dma

  huart2.Instance = USART2;
  huart2.Init.BaudRate = 9600;
  huart2.Init.WordLength = UART_WORDLENGTH_8B;
  huart2.Init.StopBits = UART_STOPBITS_1;
  huart2.Init.Parity = UART_PARITY_NONE;
  huart2.Init.Mode = UART_MODE_TX_RX;
  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  HAL_UART_Init(&huart2);


  hdma_usart2_tx.Instance  = DMA1_Stream5;
  hdma_usart2_tx.Init.Channel = DMA_CHANNEL_4;
  hdma_usart2_tx.Init.Direction = DMA_PERIPH_TO_MEMORY;
  hdma_usart2_tx.Init.PeriphInc = DMA_PINC_DISABLE;
  hdma_usart2_tx.Init.MemInc = DMA_MINC_ENABLE;
  hdma_usart2_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
  hdma_usart2_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
  hdma_usart2_tx.Init.Mode = DMA_NORMAL;
  hdma_usart2_tx.Init.Priority = DMA_PRIORITY_LOW;
  HAL_DMA_Init(&hdma_usart2_tx);

  __HAL_LINKDMA(&huart2,hdmarx,hdma_usart2_tx);

  HAL_NVIC_SetPriority(DMA1_Stream5_IRQn,0,0);
  HAL_NVIC_EnableIRQ(DMA1_Stream5_IRQn);

  HAL_NVIC_SetPriority(USART2_IRQn,0,0);
  HAL_NVIC_EnableIRQ(USART2_IRQn);

  uint8_t data[3];
  HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);
  HAL_UART_Receive_DMA(&huart2, &data, 3);

  while(!dataArrived); //Wait for the arrival of data from UART
  /* Infinite loop */
  HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_SET);
  while(1);

}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
    dataArrived = 1;
}

void DMA1_Stream5_IRQHandler(void){
    HAL_DMA_IRQHandler(&hdma_usart2_tx);
}

Обычно код должен ждать получения трех байтов и включать светодиод. Часы для USART включены в hal_msp, а также в конфигурации контактов, которые являются правильными, так как я использовал CubeMX для генерации этого кода.

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Оказывается, у меня был неправильный поток dma. Я использовал stream6 для Tx, а не stream5 для Rx ... Ошибка noob: /

0 голосов
/ 04 сентября 2018

dataArrived должно быть volatile, иначе компилятор не увидит никакого нормального пути потока программы, приводящего к изменению переменной, и оптимизирует его.

Всегда, если вы используете переменные, которые изменяются вне обычного потока программы, они должны быть нестабильными, чтобы компилятор знал, что они подвержены побочным эффектам.

Конечно, важно, если используется оптимизация любого уровня.

...