用usart2配置485,發現發送沒問題,接收的時候沒法進入中斷。這是為什么呢?
- void USART2_UART_Init(uint32_t bound)
- {
- HAL_UART_DeInit(&huart2);
- __HAL_RCC_GPIOD_CLK_ENABLE();
- __HAL_RCC_USART2_CLK_ENABLE();
- __HAL_RCC_DMA1_CLK_ENABLE();
-
- GPIO_Init2.Pin = GPIO_PIN_4; //485_RTS
- GPIO_Init2.Mode =GPIO_MODE_AF_PP;
- GPIO_Init2.Pull = GPIO_NOPULL;
- GPIO_Init2.Speed = GPIO_SPEED_FREQ_HIGH;
- GPIO_Init2.Alternate = GPIO_AF7_USART2;
- HAL_GPIO_Init(GPIOD,&GPIO_Init2);
- GPIO_Init2.Pin = GPIO_PIN_5; //485 TX config
- GPIO_Init2.Mode = GPIO_MODE_AF_PP;
- GPIO_Init2.Pull = GPIO_NOPULL;
- GPIO_Init2.Speed = GPIO_SPEED_FREQ_HIGH;
- GPIO_Init2.Alternate = GPIO_AF7_USART2;
- HAL_GPIO_Init(GPIOD,&GPIO_Init2);
- GPIO_Init2.Pin = GPIO_PIN_6; //485 RX config
- GPIO_Init2.Mode = GPIO_MODE_AF_PP;
- GPIO_Init2.Pull = GPIO_NOPULL;
- GPIO_Init2.Speed = GPIO_SPEED_FREQ_HIGH;
- GPIO_Init2.Alternate = GPIO_AF7_USART2;
- HAL_GPIO_Init(GPIOD,&GPIO_Init2); //USART2_GPIO配置
- RS485_R;
- huart2_dma_rx.Instance=DMA1_Stream5; //RX_DMA_config
- huart2_dma_rx.Init.Channel=DMA_CHANNEL_4;
- huart2_dma_rx.Init.Direction=DMA_PERIPH_TO_MEMORY;
- huart2_dma_rx.Init.PeriphInc=DMA_PINC_DISABLE;
- huart2_dma_rx.Init.MemInc=DMA_MINC_ENABLE;
- huart2_dma_rx.Init.MemDataAlignment= DMA_MDATAALIGN_BYTE;
- huart2_dma_rx.Init.PeriphDataAlignment=DMA_PDATAALIGN_BYTE;
- huart2_dma_rx.Init.Mode=DMA_NORMAL;
- huart2_dma_rx.Init.Priority=DMA_PRIORITY_LOW;
- huart2_dma_rx.Init.FIFOMode=DMA_FIFOMODE_DISABLE;
- HAL_DMA_Init(&huart2_dma_rx);
- __HAL_LINKDMA(&huart2, hdmarx, huart2_dma_rx); //關聯USART2和DMA
-
- huart2_dma_tx.Instance=DMA1_Stream6; //TX_DMA_config
- huart2_dma_tx.Init.Channel=DMA_CHANNEL_4;
- huart2_dma_tx.Init.Direction=DMA_MEMORY_TO_PERIPH;
- huart2_dma_tx.Init.PeriphInc=DMA_PINC_DISABLE;
- huart2_dma_tx.Init.MemInc=DMA_MINC_ENABLE;
- huart2_dma_tx.Init.MemDataAlignment= DMA_MDATAALIGN_BYTE;
- huart2_dma_tx.Init.PeriphDataAlignment=DMA_PDATAALIGN_BYTE;
- huart2_dma_tx.Init.Mode=DMA_NORMAL;
- huart2_dma_tx.Init.Priority=DMA_PRIORITY_HIGH;
- huart2_dma_tx.Init.FIFOMode=DMA_FIFOMODE_DISABLE;
- HAL_DMA_Init(&huart2_dma_tx);
- __HAL_LINKDMA(&huart2, hdmatx, huart2_dma_tx); //關聯USART2和DMA
-
- huart2.Instance = USART2;
- huart2.Init.BaudRate = bound;
- 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;
- huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
- HAL_UART_Init(&huart2); //串口配置
-
- HAL_NVIC_SetPriority(USART2_IRQn,3,3); //配置USART2的中斷并使能
- HAL_NVIC_EnableIRQ(USART2_IRQn);
- HAL_NVIC_SetPriority(DMA1_Stream6_IRQn,3,3); //配置DMA通道的中斷并使能
- HAL_NVIC_EnableIRQ(DMA1_Stream6_IRQn);
- HAL_NVIC_SetPriority(DMA1_Stream5_IRQn, 3, 3);
- HAL_NVIC_EnableIRQ(DMA1_Stream5_IRQn);
- }
- int main(void)
- {
- HAL_Init();
- Sysclk_config();
- USART2_UART_Init(38400);
- RS485_Send_data(buffer1,4);
- HAL_Delay(1000);
- HAL_UART_Receive_DMA(&huart2,buffer2,data_length);//打開DMA接收
- while(1)
- {
- if(flag==1)
- {
- RS485_Send_data(buffer2,data_length);
- flag=0;
- }
- }
- }
- void USART2_IRQHandler(void)
- {
- HAL_UART_IRQHandler(&huart2);
- }
- void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
- {
- flag=1;
- HAL_Delay(1000);
- HAL_UART_Receive_DMA(&huart2,buffer2,data_length);//打開DMA接收
- }
復制代碼
|