void DMA1_Channel5_IRQHandler(void)
{
if(DMA_GetITStatus(DMA1_IT_TC5)) //通道5传输完成中断TC 还有传输 过半中断HT 错误中断TE 全局中断GL
{
//DataCounter = DMA_GetCurrDataCounter(DMA1_Channel5); //获取剩余长度,一般都为0,调试用
DMA_ClearITPendingBit(DMA1_IT_GL5); //清除全部中断标志
//转换可操作BUF
if(Free_Buf_No==BUF_NO1)
{
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)USART1_DMA_Buf1;
DMA_Init(DMA1_Channel5, &DMA_InitStructure);
printf("%s",USART1_DMA_Buf2);
printf("b");
Free_Buf_No=BUF_NO2;
}
else
{
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)USART1_DMA_Buf2;
DMA_Init(DMA1_Channel5, &DMA_InitStructure);
printf("%s",USART1_DMA_Buf1);
printf("a");
Free_Buf_No=BUF_NO1;
}
printf("c");
}
如上是我的接收中断函数,里面是轮流向两个缓冲区写数据,并打印出来。 我设置的两个缓冲区大小都为5,DMA的缓冲也为5, 我用串口调试工具发送 每次都发送12345时,发现 前两次正常输出,后面的每一次输出 USART1_DMA_Buf1(也就是缓冲区1)输出的结果是 1234512345,缓冲区2是正常输出的12345。 下面是我DMA的配置,请问大家是怎么回事啊?
void USART_DMA_Configuration(uint32_t USART1_DR_Address,uint8_t* USART1_DMA_Buf1)
{
extern DMA_InitTypeDef DMA_InitStructure;
DMA_DeInit(DMA1_Channel5);//将DMA1的通道5寄存器设置为缺省值
DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Address;//该参数用以定义外设基地址
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)USART1_DMA_Buf1;//该参数用以定义内存基地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//设置外设作为数据传输的来源
DMA_InitStructure.DMA_BufferSize = 5;//定义DMA通道一的DMA缓存大小,单位为单个数据大小
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//定义外设地址寄存器不变
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//定义内存地址寄存器不变
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//设定外设数据宽度为16位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//设定内存数据宽度为16位
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//指定DMA工作在循环缓存模式
DMA_InitStructure.DMA_Priority = DMA_Priority_High;//指定通DMA通道一拥有高优先级
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//将DMA通道一不设置成内存到内存模式
DMA_Init(DMA1_Channel5, &DMA_InitStructure);//根据DMA_InitStructure中的参数初始化DMA1的通道5寄存器
DMA_ITConfig(DMA1_Channel5, DMA_IT_TC, ENABLE); //DMA5传输完成中断
/* Enable DMA1 channel5 */
DMA_Cmd(DMA1_Channel5, ENABLE);//使能DMA1通道5
}
两个缓冲区的定义
uint8_t USART1_DMA_Buf1[buf_size]={NULL};
uint8_t USART1_DMA_Buf2[buf_size]={NULL};
主函数内是
int main(void)
{
SystemInit();//系统时钟初始化
USART_RCC_Configuration();
USART_GPIO_Configuration();
USART_Configuration();//串口1初始化
NVIC_Configuration();
USART_DMA_Configuration(USART1_DR_Address,USART1_DMA_Buf1);//DMA通道5初始化
Free_Buf_No=BUF_NO2; //空闲的BUF号 typedef enum {BUF_NO1=0,BUF_NO2=1}BUF_NO;
printf("\r\n*******************************************************************************");
printf("\r\n************************ Copyright 2009-2012, ViewTool ************************");
printf("\r\n*************************** http://www.viewtool.com ***************************");
printf("\r\n***************************** All Rights Reserved *****************************");
printf("\r\n*******************************************************************************");
printf("\r\n");
while(1);
}
|