本帖最后由 10点不打烊 于 2020-1-30 18:12 编辑
芯片是stm32f103c8t6,设置从usart2到内存DMA传输,空闲中断后取数据,设置是外设和内存都是8位数据宽度,外设地址不变,内存地址自增,内存设置32位数组Buf保存数据,结果中断后得到的数据有两个疑问:
1.假如发送数据 A1B2C3,空闲中断后内存得到数据是Buf【1】=C3B2A1,疑问是既然设置8位数据宽度,结果不应该是Buf【1】=A1,Buf【2】=B2,Buf【3】=C3吗?为何会内存地址要一直写满才会地址自增?写到8个Byte后才会开始写入Buf【2】;尝试设置内存地址Buf为8位数组,结果是得不到数据,按照说明好像也必须外设和内存数据位宽一样。
2.如果按照上面却是如此,如果发现只发送一个Byte数据,Usart不会进入空闲中断,既也得不到数据。
DMA配置如下:
//DMA1通道6配置
DMA_DeInit(DMA1_Channel6); //将DMA的通道6寄存器重设为缺省值 USART2 RX对应的是DMA1通道6
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&USART2->DR; //DMA外设ADC基地址
DMA_InitStructure.DMA_MemoryBaseAddr = (vu32)usart2DmaRecFifoBuf; //DMA内存基地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //数据传输方向,从外设读取发送到内存
DMA_InitStructure.DMA_BufferSize = USART2_DMA_REC_FIFO_MAX_LEN; //DMA通道的DMA缓存的大小
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址寄存器不变
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址寄存器递增
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //数据宽度为8位
DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte; //数据宽度为8位
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //工作在正常模式
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //DMA通道 x拥有中优先级
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA通道x没有设置为内存到内存传输
DMA_Init(DMA1_Channel6, &DMA_InitStructure); //根据DMA_InitStruct中指定的参数初始化DMA的通道
// DMA1_Channel6->CCR |= 0x40;
USART_DMACmd(USART2,USART_DMAReq_Rx,ENABLE);
DMA_Cmd(DMA1_Channel6, ENABLE);
|