STM32F4半生不熟的DMA USART发送数据 函数操作= 联系客服

发布时间 : 星期三 文章STM32F4半生不熟的DMA USART发送数据 函数操作=更新完毕开始阅读ff455f4484254b35eefd34e5

STM32F4半生不熟的DMA/USART发送数据【库函数操作】

半生:是因为发出了数据

不熟:是因为不太理解。只是用了简单的几个东西 配置DMA操作步骤如下: 1、打开时钟。

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE); 2、配置DMA数据结构

有几点明确的:通过USART1发送数据,ST的F4参考手册里边可以找打USART1说对应的通道:DMA2-Channel4-Stream7。 数据传递方向是Memory2Peripheral。即内存到外设。

不使用FIFO,要传输的数据位于数组usart_tx_buf[20]中,USART1发送数据寄存器的地址是:USART1_BASE+0x04,内存和外设的字宽都是1Byte. 单次传输,传输一次完毕需要手动重启。外设地址固定,内存地址自增。 于是:

DMA_DeInit(DMA2_Stream7);

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);

DMA_StructInit(&DMA_InitStructure);

DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; DMA_InitStructure.DMA_Channel = DMA_Channel_4;

DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;

DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)usart_tx_buf; DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_BASE+0x04; DMA_InitStructure.DMA_BufferSize = BufSize;

DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; 之后,使用DMA_Init初始化DMA。最后用DMA_Cmd使能DMA。

以后每次发送数据都要用DMA_Cmd使能一次DMA。我没找到别的办法。。。。。 住函数中调用:

while(1) {

while(RESET == USART_GetFlagStatus(USART1,USART_FLAG_TXE)); USART_SendData(USART1,'b');

while(RESET == USART_GetFlagStatus(USART1,USART_FLAG_TXE)); USART_SendData(USART1,'a'); delay_ms(1000);

printf(\

if(SET == DMA_GetFlagStatus(DMA2_Stream7,DMA_FLAG_TCIF7)) {

DMA_ClearFlag(DMA2_Stream7,DMA_FLAG_TCIF7); //DMA_Cmd(DMA2_Stream7,DISABLE); for(i = 0;i<20;i++)

usart_tx_buf[i] = i+51;

DMA_Cmd(DMA2_Stream7,ENABLE); } }