你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F407 多机RS485串口通讯+地址位唤醒+DMA空闲线接收,无法进入中断服务程序。

[复制链接]
古月风色 提问时间:2025-6-12 10:41 / 未解决

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 /

}

中断处理函数

/**

  • @brief This function handles USART3 global interrupt.

*/

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 /

}

收藏 评论2 发布时间:2025-6-12 10:41

举报

2个回答
butterflyspring 回答时间:3 天前
楼主可以先看看,串口的数据位长度是不是设置错了。
xmshao 回答时间:3 天前
从你给出的配置来看,数据长度9位,即按16位接收没有问题。


DMA配置没看出明显问题,UART的中断响应也使能了。


你目前使能的空闲中断,鉴于你的情况,是否需要确认UART真正工作起来了。
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版