
uint16_t uart3_rx_buffer[USART3_RXBUF_SIZE]; //串口接收数据缓存数组 UART3Ctl UART3ctl; / USER CODE END 0 / UART_HandleTypeDef huart3; DMA_HandleTypeDef hdma_usart3_rx; DMA_HandleTypeDef hdma_usart3_tx; / USART3 init function / void MX_USART3_UART_Init(void) { / USER CODE BEGIN USART3_Init 0 / / USER CODE END USART3_Init 0 / / USER CODE BEGIN USART3_Init 1 / / USER CODE END USART3_Init 1 / huart3.Instance = USART3; huart3.Init.BaudRate = 115200; huart3.Init.WordLength = UART_WORDLENGTH_9B; huart3.Init.StopBits = UART_STOPBITS_1; huart3.Init.Parity = UART_PARITY_NONE; huart3.Init.Mode = UART_MODE_TX_RX; huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart3.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_MultiProcessor_Init(&huart3, 12, UART_WAKEUPMETHOD_ADDRESSMARK) != HAL_OK) { Error_Handler(); } / USER CODE BEGIN USART3_Init 2 / / USER CODE END USART3_Init 2 / } void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle) { GPIO_InitTypeDef GPIO_InitStruct = {0}; if(uartHandle->Instance==USART3) { / USER CODE BEGIN USART3_MspInit 0 / / USER CODE END USART3_MspInit 0 / / USART3 clock enable / __HAL_RCC_USART3_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE(); /**USART3 GPIO Configuration PD8 ------> USART3_TX PD9 ------> USART3_RX */ GPIO_InitStruct.Pin = GPIO_PIN_8; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF7_USART3; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF7_USART3; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); / USART3 DMA Init / / USART3_RX Init / hdma_usart3_rx.Instance = DMA1_Stream1; hdma_usart3_rx.Init.Channel = DMA_CHANNEL_4; hdma_usart3_rx.Init.Direction = DMA_PERIPH_TO_MEMORY; hdma_usart3_rx.Init.PeriphInc = DMA_PINC_DISABLE; hdma_usart3_rx.Init.MemInc = DMA_MINC_ENABLE; hdma_usart3_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; hdma_usart3_rx.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; hdma_usart3_rx.Init.Mode = DMA_NORMAL; hdma_usart3_rx.Init.Priority = DMA_PRIORITY_LOW; hdma_usart3_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE; if (HAL_DMA_Init(&hdma_usart3_rx) != HAL_OK) { Error_Handler(); } __HAL_LINKDMA(uartHandle,hdmarx,hdma_usart3_rx); / USART3_TX Init / hdma_usart3_tx.Instance = DMA1_Stream3; hdma_usart3_tx.Init.Channel = DMA_CHANNEL_4; hdma_usart3_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; hdma_usart3_tx.Init.PeriphInc = DMA_PINC_DISABLE; hdma_usart3_tx.Init.MemInc = DMA_MINC_ENABLE; hdma_usart3_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; hdma_usart3_tx.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; hdma_usart3_tx.Init.Mode = DMA_NORMAL; hdma_usart3_tx.Init.Priority = DMA_PRIORITY_LOW; hdma_usart3_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE; if (HAL_DMA_Init(&hdma_usart3_tx) != HAL_OK) { Error_Handler(); } __HAL_LINKDMA(uartHandle,hdmatx,hdma_usart3_tx); / USART3 interrupt Init / HAL_NVIC_SetPriority(USART3_IRQn, 0, 0); HAL_NVIC_EnableIRQ(USART3_IRQn); / USER CODE BEGIN USART3_MspInit 1 / / USER CODE END USART3_MspInit 1 / } } 在主程序中开启DMA接收和空闲线中断: int main(void) { / USER CODE BEGIN 1 / / USER CODE END 1 / / MCU Configuration--------------------------------------------------------/ / Reset of all peripherals, Initializes the Flash interface and the Systick. / HAL_Init(); / USER CODE BEGIN Init / / USER CODE END Init / / Configure the system clock / SystemClock_Config(); / USER CODE BEGIN SysInit / / USER CODE END SysInit / / Initialize all configured peripherals / MX_GPIO_Init(); MX_DMA_Init(); MX_USART3_UART_Init(); / USER CODE BEGIN 2 / // 启动DMA接收 HAL_UART_Receive_DMA(&huart3, (uint8_t*)uart3_rx_buffer, USART3_RXBUF_SIZE); // 启用空闲中断 __HAL_UART_ENABLE_IT(&huart3, UART_IT_IDLE); / USER CODE END 2 / / Infinite loop / / USER CODE BEGIN WHILE / while (1) { / USER CODE END WHILE / / USER CODE BEGIN 3 / } / USER CODE END 3 / } 中断处理函数 /**
*/ void USART3_IRQHandler(void) { / USER CODE BEGIN USART3_IRQn 0 / if(__HAL_UART_GET_FLAG(&huart3 , UART_FLAG_IDLE) != RESET)//判断空闲中断 { HAL_UART_DMAStop(&huart3); // 停止DMA接收 UART3ctl.USART3_recv_flag = 1;//串口接收到数据 UART3ctl.USART3_len = USART3_RXBUF_SIZE - __HAL_DMA_GET_COUNTER(&hdma_usart3_rx); //计算接收到的数据长度 memcpy(UART3ctl.USART3_rx_buffer,uart3_rx_buffer,UART3ctl.USART3_len); memset(uart3_rx_buffer,0,UART3ctl.USART3_len); __HAL_UART_CLEAR_IDLEFLAG(&huart3);//清除中断
USART3_DIR_TX; //485发送 HAL_Delay(1); } / USER CODE END USART3_IRQn 0 / HAL_UART_IRQHandler(&huart3); / USER CODE BEGIN USART3_IRQn 1 / / USER CODE END USART3_IRQn 1 / } |
在CUBEMX生成的STM32F407VET6的I2S主机接收模式与I2S主机发送模式能正常运行,如何进行动态调整或者如何实现主机全双工?
设置RDP等级为2的同时,有什么办法可以确保后续还能够烧录程序
STM32F407VET6 I2S 采用DMA传输问题
有STM32F4倒车雷达响应例程吗?
STM32F429I倒车雷达响应
STM32多通道FFT运算异常
在其他电脑上编译成功没有错误并且能够烧录,换了电脑之后编译出现一堆错误,并且不能烧录程序
SD卡初始化第一次初始化后再次初始化时会失败。
串口重定向接收不同
关于三轴陀螺仪 I3G4250D
DMA配置没看出明显问题,UART的中断响应也使能了。
你目前使能的空闲中断,鉴于你的情况,是否需要确认UART真正工作起来了。