标题:
STM32 rs485 DMA接收没法进入中断的问题
[打印本页]
作者:
南国枫火
时间:
2018-12-4 11:13
标题:
STM32 rs485 DMA接收没法进入中断的问题
用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接收
}
复制代码
作者:
南国枫火
时间:
2018-12-5 11:37
问题已解决,还是485管脚配置的问题
作者:
南国枫火
时间:
2018-12-5 11:37
基本配置要保证不能出错
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1