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

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(“argjiarjfgio\r\n”); 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); }}

Technorati 标记: STM32F4,DMA,USART

posted on

,美国服务器却还是,会愚蠢的选择相互敌视的方式。即使背脊相抵,

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

相关文章:

你感兴趣的文章:

标签云: