初级会员

- 积分
- 197
- 金钱
- 197
- 注册时间
- 2021-6-25
- 在线时间
- 50 小时
|
1金钱
求助:串口助手发数据给USART2,由DMA进行接收,接收到的数据放在USART2_RX_BUF数组中,现在接收不到数据,但USART2->DR中有数据。 若单独用串口接收中断,不使用DMA传输,可以接收到数据,证明串口是通的,但是现在加上了DMA后,但USART2->DR中有数据,但是缓冲区USART2_RX_BUF没有数据。
将DMA初始化函数放在串口初始化函数之前也是同样无数据。
DMA配置似乎没错啊,查看了好多遍了~~~~~
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void usart2_dma_init( void )
{
DMA_InitTypeDef DMA_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);
DMA_DeInit(DMA1_Stream5);
DMA_InitStructure.DMA_Channel = DMA_Channel_4;
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(USART2->DR);
DMA_InitStructure.DMA_Memory0BaseAddr = (u32)(u32)USART2_RX_BUF;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
DMA_InitStructure.DMA_BufferSize = (u32)MAVLINK_MAX_PACKET_LEN;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single
DMA_Init( DMA1_Stream5, &DMA_InitStructure );
DMA_ClearFlag( DMA1_Stream5, DMA_FLAG_TCIF5 );
DMA_Cmd( DMA1_Stream5,ENABLE );
USART_DMACmd( USART2, USART_DMAReq_Rx, ENABLE );
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void USART2_IRQHandler(void)
{
if(USART_GetITStatus( USART2, USART_IT_IDLE ) != RESET )
{
USART2->SR;
USART2->DR;
USART_ClearITPendingBit( USART2, USART_IT_IDLE );
usart2_dma_setting();
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void usart2_dma_setting( void )
{
u32 buff_length;
DMA_Cmd(DMA1_Stream5, DISABLE);
DMA_ClearFlag( DMA1_Stream5, DMA_FLAG_TCIF5 );
buff_length = MAVLINK_MAX_PACKET_LEN - DMA_GetCurrDataCounter(DMA1_Stream5);
USART2_RX_CNT = buff_length;
USART2_RX_FRAME_OK = 1;
DMA_SetCurrDataCounter( DMA1_Stream5, MAVLINK_MAX_PACKET_LEN );
DMA_Cmd(DMA1_Stream5, ENABLE);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
最佳答案
查看完整内容[请看2#楼]
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(USART2->DR);
DMA_InitStructure.DMA_Memory0BaseAddr = (u32)(u32)USART2_RX_BUF;
这个应该为地址:
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&(USART2->DR);
DMA_InitStructure.DMA_Memory0BaseAddr = (u32)&USART2_RX_BUF;
|