/*
* 函数名: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;
}