Я учился программировать на 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 для генерации этого кода.