/* * 函数名:USART1_DMA_Config * 描述 :串口1的DMA 的初始化配置 * 输入 :无 * 输出 : 无 * 调用 :在USART1_INIT()中被调用 */ void USART1_DMA_Config(void) { DMA_InitTypeDef DMA_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //开启DMA时钟 //配置串口1发送DMA DMA_DeInit(DMA1_Channel4); /*设置DMA源:内存地址&串口数据寄存器地址*/ DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base; /*内存地址(要传输的变量的指针)*/ DMA_InitStructure.DMA_MemoryBaseAddr = (u32)Txd1Buffer; //发送的内存地址任意,请参考发送函数 /*方向:从内存到外设*/ DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; /*传输大小DMA_BufferSize=0*/ DMA_InitStructure.DMA_BufferSize = 0; //发送的数据个数任意,请参考发送函数 /*外设地址不增*/ DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; /*内存地址自增*/ DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; /*外设数据单位*/ DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; /*内存数据单位 8bit*/ DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; /*DMA模式:一次传输,循环*/ DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ; /*优先级:中*/ DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //DMA_Priority_VeryHigh; /*禁止内存到内存的传输 */ DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel4, &DMA_InitStructure); /*配置DMA1的4通道*/ DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE); //配置DMA发送完成后产生中断 DMA_Cmd (DMA1_Channel4,DISABLE); //配置串口1接收DMA /*设置DMA源:内存地址&串口数据寄存器地址*/ DMA_DeInit(DMA1_Channel5); DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base; /*内存地址(要传输的变量的指针)*/ DMA_InitStructure.DMA_MemoryBaseAddr = (u32)Rcv1Buffer; //接收缓存是固定不变的 /*方向:从内存到外设*/ DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; /*传输大小DMA_BufferSize=BUFFSIZE*/ DMA_InitStructure.DMA_BufferSize = Rcv1_BUFFSIZE; //必须这样设置 /*外设地址不增*/ DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; /*内存地址自增*/ DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; /*外设数据单位*/ DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; /*内存数据单位 8bit*/ DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; /*DMA模式:一次传输,循环*/ DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ; /*优先级:中*/ DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; // DMA_Priority_VeryHigh; /*禁止内存到内存的传输 */ DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; /*配置DMA1的5通道*/ DMA_Init(DMA1_Channel5, &DMA_InitStructure); DMA_ITConfig(DMA1_Channel5,DMA_IT_TC,DISABLE); //DMA接收不产生中断 DMA_Cmd (DMA1_Channel5,ENABLE); }
/* * 函数名:USART1_Send * 描述 :串口1发送数据函数 * 输入 :要发送数据的首地址,发送数据的个数。发送数据的地址任意,并不用固定为Txd1Buffer * 输出 : 无 * 举例 :Usart1_Send("Hello word!",11); Usart1_Send(Txd1Buffer,11); */ void USART1_Send(uint8_t *pbuffer, uint32_t size) { DMA_Cmd (DMA1_Channel4,DISABLE); DMA1_Channel4->CMAR = (u32)pbuffer; DMA1_Channel4->CNDTR = size; DMA_Cmd (DMA1_Channel4,ENABLE); //使能DMA,开始发送 Txd1_Flag=1; //数据发送中 // LED1(ON); //灯亮 }
/* * 函数名:USART1_SendOK_IQ * 描述 :串口1发送数据完毕后,会调用的中断函数,将发送标志置0 * 输入 :无 * 输出 : 无 * 调用 :此函数需在stm32f10x_it.c 的 DMA1_Channel4_IRQHandler()中被调用 */ void USART1_SendOK_IQ(void) { //判断是否为DMA发送完成中断 if(DMA_GetFlagStatus(DMA1_FLAG_TC4)==SET) { DMA_ClearITPendingBit(DMA1_IT_GL4); DMA_ClearFlag(DMA1_FLAG_TC4); DMA_Cmd (DMA1_Channel4,DISABLE); Txd1_Flag = 0; //数据发送完毕 //LED关闭 // LED1(OFF); } }
/* * 函数名:USART1_INIT * 描述 :串口1初始化函数,包括引脚配置,串口配置,DMA配置及中断优先级配置 * 输入 :无 * 输出 : 无 */ void USART1_INIT(void) { USART1_Config(); USART1_DMA_Config(); USART1_NVIC_Config(); Rcv1Counter = 0; Rcv1_Flag = 0; Txd1_Flag = 0; }