文档详情

STM32 DMA方式进行USART通信.docx

发布:2017-06-19约1.81千字共3页下载文档
文本预览下载声明
今天尝试了一下利用DMA方式进行USART通信。这个做的很简单。只是将内存中的一个数组通过DMA方式发送到USART的数据寄存器里边而已,然后再将该数据发送到PC检验其是否正确。不过还是很有用,可以很好地了解DMA的工作原理。至于什么开时钟啊,就不用说了,主要说一下配置。DMA_InitStructure.DMA_PeripheralBaseAddr = 0DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)TxBuffer;这两个地址可以在数据手册中找到,比如我用的芯片是STM32F103ZET6 在数据手册的这一项中可以看到:而USART1的数据寄存器偏移量为0x04所以USART_DR的地址为:0+ 0= 0于TxBuffer 只是我定义的一个数组罢了,学过计算机的都知道数组的名字本身就是其在内存中的地址。DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; //外设作为数据传送的目的地DMA_InitStructure.DMA_BufferSize = TxBuffer_Size;//缓存大小DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址寄存器不变DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址寄存器递增这两项的配置还是很好理解的,比如在这里我们是要将TxBuffer里边的东西发到USART1中去,每次发送8位,那么外设地址当然不能改变,而每一次发送内容都是不一样的,而且数组在内存中的存放就是递增的,所以内存地址寄存器要递增。下边是设置数据宽度:DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //数据宽度为8位DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;这个模式设置不是很清楚:DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //正常缓存模式优先级:DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;DMA_Init(DMA1_Channel4, DMA_InitStructure);另外关于DMA的通道问题,有两个DMA控制器,DMA1,DMA2。DMA1有7个通道,DMA2有5个通道。他们分别是:DMA1:DMA2:由于我用的是USART1,所以选用的DMA1的通道4.这是主函数:void main(){ USART_RCC_Config(); USART_GPIO_Config(); USART_NVIC_Config(); USART_Configuration(); DMA_Configuration(); USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE); DMA_Cmd(USART_Tx_DMA_Channel,ENABLE); while(index TxBuffer_Size) {//从USART1接收数据 while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET) { } RxBuffer[index++] = USART_ReceiveData(USART1); } while (DMA_GetFlagStatus(DMA1_FLAG_TC4) == RESET) {//等待发送完全 } //发送到终端 USART_SendDATA(USART1,RxBuffer); while(1) { }}如果成功将会在终端里边看到TxBuffer里的内容。
显示全部
相似文档