完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
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);//清除中断 //HAL_UART_Receive_DMA(&huart1,rx_buffer,BUFFER_SIZE);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 / } |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
4130 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
3221 浏览 1 评论
2747 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
2175 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
14939 浏览 2 评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
3084浏览 4评论
stm32f4下spi+dma读取数据不对是什么原因导致的?
1892浏览 3评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
2064浏览 3评论
1976浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
2165浏览 3评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-1 22:50 , Processed in 0.661612 second(s), Total 75, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
1681