2016-04-22 02:07 AM
Hello community
I am having troubles when doing DMA with USART on an STM32F030. Thanks in advance to anybody will help.Not sure if i did the homework correctly so I need someboody to check thisTMy application aims to receive one character at a time (DMA xfer size =1) @19200 baud/8b/no parity/1 start bit from a COBS coded stream. The ISR will add to a buffer asn soon as it synchronize with the SOH character.I generated a Cube MX project and am doing as following with the HAL drivers HAL_Init(); /* Configure the system clock */ SystemClock_Config(); /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_DMA_Init(); // used by operating and maint and userInterface MX_ADC_Init(); MX_TIM1_Init(); MX_USART1_UART_Init();uint8_t rxBuff; HAL_UART_Receive_DMA(&huart1, &rxBuff, sizeof(rxBuff)) ;and in the xfer complete callbackvoid HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){ __HAL_UART_SEND_REQ(&huart1, UART_RXDATA_FLUSH_REQUEST); // Clear the buffer to prevent overrun// userInterface.interProcCommMgr();// HAL_UART_Transmit_DMA(&huart1, (uint8_t *)&rxBuffer, 1);}The USART in Rx only and I am transmitting @19200/ 8b / no parity (checked with the scope) from another boardHere they are the MX_* function which initialize the peripheralsvoid MX_USART1_UART_Init(void){ huart1.Instance = USART1; huart1.Init.BaudRate = 19200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; huart1.Init.OneBitSampling = UART_ONEBIT_SAMPLING_DISABLED ; huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; HAL_UART_Init(&huart1);}void HAL_UART_MspInit(UART_HandleTypeDef* huart){ GPIO_InitTypeDef GPIO_InitStruct; if(huart->Instance==USART1) { /* USER CODE BEGIN USART1_MspInit 0 */ /* USER CODE END USART1_MspInit 0 */ /* Peripheral clock enable */ __USART1_CLK_ENABLE(); /**USART1 GPIO Configuration PA1 ------> USART1_DE PA2 ------> USART1_TX PA3 ------> USART1_RX */ GPIO_InitStruct.Pin = RS485_DE_Pin; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; GPIO_InitStruct.Alternate = GPIO_AF1_USART1; HAL_GPIO_Init(RS485_DE_GPIO_Port, &GPIO_InitStruct); GPIO_InitStruct.Pin = USART_TX_Pin|USART_RX_Pin; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; GPIO_InitStruct.Alternate = GPIO_AF1_USART1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* Peripheral DMA init*/ hdma_usart1_rx.Instance = DMA1_Channel3; hdma_usart1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY; hdma_usart1_rx.Init.PeriphInc = DMA_PINC_DISABLE; hdma_usart1_rx.Init.MemInc = DMA_MINC_DISABLE; hdma_usart1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; hdma_usart1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; hdma_usart1_rx.Init.Mode = DMA_CIRCULAR; hdma_usart1_rx.Init.Priority = DMA_PRIORITY_LOW; HAL_DMA_Init(&hdma_usart1_rx); __HAL_LINKDMA(huart,hdmarx,hdma_usart1_rx); /* Peripheral interrupt init*/ HAL_NVIC_SetPriority(USART1_IRQn, 0, 0); HAL_NVIC_EnableIRQ(USART1_IRQn); /* USER CODE BEGIN USART1_MspInit 1 */ /* USER CODE END USART1_MspInit 1 */ }}/** * Enable DMA controller clock */void MX_DMA_Init(void) { /* DMA controller clock enable */ __DMA1_CLK_ENABLE(); /* DMA interrupt init */ HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0); HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn); HAL_NVIC_SetPriority(DMA1_Channel2_3_IRQn, 0, 0); HAL_NVIC_EnableIRQ(DMA1_Channel2_3_IRQn);}2016-05-03 08:15 AM
to whom who cares
- the posted code is ok- it did not work since I was loading it on a discovery board with a different MCU than specified on my CUVE-MX ioc file, resulting in a different UART pins positionthanks