u8 buf1[100]; //都初始化0
u8 buf2[100]; //都初始化0
u16 rev; //中断接收计数
串口发送方式: DMA
串口接收方式: 中断
DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base;
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)buf1;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_BufferSize = 10;
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_Medium;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel4, &DMA_InitStructure);
在主程序中
main()
while(1)
{
启动DMA发送;
延时;
}
是可以正常发送
而通过中断接收数据,再把接收的数据DMA发送出去就不对了,如下:
main()
while(1)
{
if( rev > 10)
{
启动DMA发送; //发送buf1
rev = 0;
}
}
串口接收中断中
u8 c;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
c=USART1->DR;
buf1[rev] = c; //接收放在buf1
rev ++;
}
当计算机这边发送11个字节数据时可以正常发回,当大于11个时,发回的就不是发出去的数据.
以为是buf1冲突
把
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)buf2;
发送buf2的数据,怎么接收的也不是buf2里的数据.
最后把main里接收计数条件 换成 判断最后一个字节比如buf1[rev]=0x23
(PC端发送的数据中只有一个0x23,且是最后一个)
这样就正常,上面接收计数方法有问题吗,到底怎么回事
高手讲讲串口DMA注意的问题? |