新手入门
- 积分
- 17
- 金钱
- 17
- 注册时间
- 2016-7-22
- 在线时间
- 1 小时
|
1金钱
请教各位大侠一个问题:
我现在使用STM32F103的串口2,DMA通道6进行接收固定长度的数据帧,帧长度为13个,但是每次接收的数据都有错位。例如,我通过上位机固定200ms发送一帧数据:为01 02 03 04 05 06 07 08 09 0a 0b 0c 0d,但是软件仿真的时候看DMA接收缓存里面的数据就不对了,接收到的数据有错位的现象,实际收到的为 06 07 08 09 0a 0b 0c 0d 01 02 03 04 05,数据信息还是发送的信息,就是顺序乱了,整了两天了,还是没解决,请教各位大侠是什么原因,如下是我的DMA相关代码:
void Uart2_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
/* Configure USART2 Tx as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = RS485_1_TX_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(RS485_1_PORT, &GPIO_InitStructure);
/* Configure USART2 Rx as input floating */
GPIO_InitStructure.GPIO_Pin = RS485_1_RX_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(RS485_1_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = RS485_1_EN_PIN; // 控制485的收发
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出模式
GPIO_Init(RS485_1_PORT, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = RS485_1_COM_BAUD;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No ;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART2, &USART_InitStructure);
USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);
DMA_Cmd(DMA1_Channel6, DISABLE);
DMA_DeInit(DMA1_Channel6);
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&USART2->DR);// 设置串口发送数据寄存器
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)Rs485RxBuf1;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = RF_DATA_PACKLEN;
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_Circular; // 循环传输模式
DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; // 关闭内存到内存的DMA模式
DMA_Init(DMA1_Channel6, &DMA_InitStructure);
DMA_ITConfig(DMA1_Channel6, DMA_IT_TC, ENABLE);
USART_DMACmd(USART2, USART_DMAReq_Rx, ENABLE);
DMA_ClearFlag(DMA1_FLAG_GL6);
DMA_Cmd(DMA1_Channel6, ENABLE);
USART_Cmd(USART2, ENABLE);
RS485_1_RX_ENABLE;
}
void DMA1_Channel6_IRQHandler(void)
{
if(DMA_GetITStatus(DMA1_IT_TC6))
{
DMA_ClearITPendingBit(DMA1_IT_GL6);
Write_DataFifo(&Rs485Fifo1, &Rs485RxBuf1);
}
}
仿真的时候实时观测Rs485RxBuf1这个buf,里面的内容就是错位的数据。
|
|