接收采用串口的空闲中断来判断接收完成,程序下进去启动后第一次接收正常,往后就不行了,数据维持不变,不往缓存区写数据了,看了网上许多例程都差不多。
//启动DMA时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
//DMA通道配置
while(DMA_GetCmdStatus(DMA2_Stream2) != DISABLE){} //等待DMA可配置
DMA_DeInit(DMA2_Stream2);
DMA_InitStructure.DMA_Channel = DMA_Channel_4;
//外设地址
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&USART1->DR);
//内存地址
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)re_buff;
//dma传输方向
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
//设置DMA在传输时缓冲区的长度
DMA_InitStructure.DMA_BufferSize =64;
//设置DMA的外设递增模式,一个外设
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
//设置DMA的内存递增模式
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
//外设数据字长
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
//内存数据字长
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
//设置DMA的传输模式
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
//设置DMA的优先级别
DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
//指定如果FIFO模式或直接模式将用于指定的流 : 不使能FIFO模式
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
//指定了FIFO阈值水平
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
//指定的Burst转移配置内存传输
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
//指定的Burst转移配置外围转移 */
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
//配置DMA1的通道
DMA_Init(DMA2_Stream2, &DMA_InitStructure);
//使能通道
DMA_Cmd(DMA2_Stream2,ENABLE);
void Receive_Data_IRQHandler(void)
{
if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)
{
USART1->SR;
USART1->DR; //清USART_IT_IDLE标志
//关闭DMA
DMA_Cmd(DMA2_Stream2,DISABLE);
//清除标志位
DMA_ClearFlag(DMA2_Stream2,DMA_FLAG_TCIF4);
re_len = BUFF_SIZE - DMA_GetCurrDataCounter(DMA2_Stream2);
//获得接收帧帧长
// memcpy(buf,re_buff,re_len);
//设置传输数据长度
DMA_SetCurrDataCounter(DMA2_Stream2,BUFF_SIZE);
//打开DMA
DMA_Cmd(DMA2_Stream2,ENABLE);
}
}
后来把DMA_Mode 改成 DMA_Mode_Circular(循环接收) 则接收正常,正常模式只能接收一次,但在串口接收中断里明明已经重新设定了DMA传输数量并重新使能了。
网上的例程都用的DMA_Mode_Normal,不知道为什么我的用这个模式不行,希望知道的朋友能在下方评论留言!
接收采用串口的空闲中断来判断接收完成,程序下进去启动后第一次接收正常,往后就不行了,数据维持不变,不往缓存区写数据了,看了网上许多例程都差不多。
//启动DMA时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
//DMA通道配置
while(DMA_GetCmdStatus(DMA2_Stream2) != DISABLE){} //等待DMA可配置
DMA_DeInit(DMA2_Stream2);
DMA_InitStructure.DMA_Channel = DMA_Channel_4;
//外设地址
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&USART1->DR);
//内存地址
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)re_buff;
//dma传输方向
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
//设置DMA在传输时缓冲区的长度
DMA_InitStructure.DMA_BufferSize =64;
//设置DMA的外设递增模式,一个外设
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
//设置DMA的内存递增模式
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
//外设数据字长
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
//内存数据字长
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
//设置DMA的传输模式
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
//设置DMA的优先级别
DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
//指定如果FIFO模式或直接模式将用于指定的流 : 不使能FIFO模式
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
//指定了FIFO阈值水平
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
//指定的Burst转移配置内存传输
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
//指定的Burst转移配置外围转移 */
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
//配置DMA1的通道
DMA_Init(DMA2_Stream2, &DMA_InitStructure);
//使能通道
DMA_Cmd(DMA2_Stream2,ENABLE);
void Receive_Data_IRQHandler(void)
{
if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)
{
USART1->SR;
USART1->DR; //清USART_IT_IDLE标志
//关闭DMA
DMA_Cmd(DMA2_Stream2,DISABLE);
//清除标志位
DMA_ClearFlag(DMA2_Stream2,DMA_FLAG_TCIF4);
re_len = BUFF_SIZE - DMA_GetCurrDataCounter(DMA2_Stream2);
//获得接收帧帧长
// memcpy(buf,re_buff,re_len);
//设置传输数据长度
DMA_SetCurrDataCounter(DMA2_Stream2,BUFF_SIZE);
//打开DMA
DMA_Cmd(DMA2_Stream2,ENABLE);
}
}
后来把DMA_Mode 改成 DMA_Mode_Circular(循环接收) 则接收正常,正常模式只能接收一次,但在串口接收中断里明明已经重新设定了DMA传输数量并重新使能了。
网上的例程都用的DMA_Mode_Normal,不知道为什么我的用这个模式不行,希望知道的朋友能在下方评论留言!
举报