STM32串口DMA发送的数据不连续,已经试了一些办法,仍未解决,不知是什么原因?
用串口监控得到的数据是:
10,9:07:54,io.exe(5532),IRP_MJ_WRITE,COM8,7, 4D 00 01 01 06 00 08 | M#0#1#1#6#0#8,
12,9:07:54,io.exe(5532),IRP_MJ_READ,COM8,1, 4D | M,
13,9:07:56,io.exe(5532),IRP_MJ_READ,COM8,1, 00 | #0,
14,9:07:56,io.exe(5532),IRP_MJ_READ,COM8,1, 01 | #1,
15,9:07:56,io.exe(5532),IRP_MJ_READ,COM8,1, 23 | #,
16,9:07:56,io.exe(5532),IRP_MJ_READ,COM8,1, 00 | #0,
17,9:07:56,io.exe(5532),IRP_MJ_READ,COM8,1, 03 | #3,
18,9:07:56,io.exe(5532),IRP_MJ_READ,COM8,1, 5C | ,
19,9:07:56,io.exe(5532),IRP_MJ_READ,COM8,1, 88 | ?,
20,9:07:56,io.exe(5532),IRP_MJ_READ,COM8,1, 00 | #0,
21,9:07:56,io.exe(5532),IRP_MJ_READ,COM8,1, 13 | #19,
22,9:07:56,io.exe(5532),IRP_MJ_READ,COM8,1, CB | ?,
23,9:07:56,io.exe(5532),IRP_MJ_READ,COM8,1, 12 | #18,
24,9:07:56,io.exe(5532),IRP_MJ_READ,COM8,1, 00 | #0,
25,9:07:56,io.exe(5532),IRP_MJ_READ,COM8,1, 00 | #0,
26,9:07:56,io.exe(5532),IRP_MJ_READ,COM8,1, 90 | ?,
27,9:07:56,io.exe(5532),IRP_MJ_READ,COM8,1, D2 | ò,
28,9:07:56,io.exe(5532),IRP_MJ_READ,COM8,1, 07 | #7,
29,9:07:56,io.exe(5532),IRP_MJ_READ,COM8,1, EE | ?,
30,9:07:56,io.exe(5532),IRP_MJ_READ,COM8,1, 17 | ,
31,9:07:56,io.exe(5532),IRP_MJ_READ,COM8,1, E1 | á,
32,9:07:56,io.exe(5532),IRP_MJ_READ,COM8,1, 00 | #0,
33,9:07:56,io.exe(5532),IRP_MJ_READ,COM8,1, 0D | #13,
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
//串口初始化:
void USART_Configuration(void)
{
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = 9600;
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(USART1, &USART_InitStructure);
USART_ITConfig(USART1, USART_IT_IDLE , ENABLE);
USART_Cmd(USART1, ENABLE);
USART_ClearFlag(USART1, USART_FLAG_TC); // 清发送完成标志
}
//DMA配置:
void DMA_Configuration(void)
{
DMA_InitTypeDef DMA_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//DMA1时钟
DMA_DeInit(DMA1_Channel4);
DMA_InitStructure.DMA_PeripheralBaseAddr = 0x40013804;
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)TX1_SendBuf;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; //外设作为DMA的目的端
DMA_InitStructure.DMA_BufferSize = 512; // 根据实际发送数据长度确定
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址不增加
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址自增1
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//(只传送一次) DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; //DMA传送优先级
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel4, &DMA_InitStructure);
DMA_ITConfig(DMA1_Channel4, DMA_IT_TC, ENABLE);
DMA_ITConfig(DMA1_Channel4, DMA_IT_TE, ENABLE);
USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);
DMA_Cmd(DMA1_Channel4, DISABLE);
DMA_DeInit(DMA1_Channel5);
DMA_InitStructure.DMA_PeripheralBaseAddr = 0x40013804;
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)RX1_RcvBuf;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = 512;
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_VeryHigh; //DMA传送优先级
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel5, &DMA_InitStructure);
DMA_ITConfig(DMA1_Channel5, DMA_IT_TC, ENABLE);
DMA_ITConfig(DMA1_Channel5, DMA_IT_TE, ENABLE);
USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);
DMA_Cmd(DMA1_Channel5, ENABLE);
}
//中断优先级配置:
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* Configure one bit for preemption priority */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断分组设置
/* Enable the USART1 Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //设置串口1中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //响应优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* Enable the USART2 Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级 1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //响应优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void USART1_IRQHandler(void) //USART1收发全用DMA
{
u16 DATA_LEN;
if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)//如果为空闲总线中断
{
DMA_Cmd(DMA1_Channel5, DISABLE);
if(RX1_dataOverflow == 0) //1=接收的数据超过缓冲区数量
{
DATA_LEN = 512 - DMA_GetCurrDataCounter(DMA1_Channel5); //已经传输的字节数
if(RX1_RcvBuf[0] == 'M')//;判断是否为帧头,MODBUS数据接收标志,0x4D='M'
{
RX1_Data_Len = DATA_LEN;
Handle_MODBUS_CMD();
}
else if(RX1_RcvBuf[0] == 126)//检查USART1的国军标协议接收标志,为1则有命令帧需处理
{
HandleCMD() ;
}
}
RX1_dataOverflow = 0; //1=接收的数据超过缓冲区数量
DMA_ClearFlag(DMA1_FLAG_GL5 | DMA1_FLAG_TC5 | DMA1_FLAG_TE5 | DMA1_FLAG_HT5);//清标志
DMA1_Channel5->CNDTR = 512;//重装填
DMA_Cmd(DMA1_Channel5, ENABLE);//处理完,重开DMA
DATA_LEN = USART1->SR;
DATA_LEN = USART1->DR;
}
if(USART_GetITStatus(USART1, USART_IT_PE | USART_IT_FE | USART_IT_NE) != RESET)//出错
{
USART_ClearITPendingBit(USART1, USART_IT_PE | USART_IT_FE | USART_IT_NE);
}
USART_ClearITPendingBit(USART1, USART_IT_TC);
USART_ClearITPendingBit(USART1, USART_IT_IDLE);
}
一周热门 更多>