diff --git a/DMA_UART4 b/DMA_UART4 index 3f0b4492017a7be34a82aedb42cbfbb4855117a1..9ecb0a3c69739cb45c8fb653825d303183ccb9bc 100644 --- a/DMA_UART4 +++ b/DMA_UART4 @@ -1,44 +1,47 @@ #include +#define Set4_SEND GPIO_SetBits(GPIOE,GPIO_Pin_6); +#define Set4_RCVE GPIO_ResetBits(GPIOE,GPIO_Pin_6); char u4_buff[32]; char test_command[32]="Hello DTU!"; char DTU_reply[64]; char len_reply=0; -unsigned char u4tx_buf[U4_TXBUF];//一个2K大一点的数据缓冲区 +unsigned char u4tx_buf[U4_TXBUF];//һ2Kһݻ u32 dma_index=0; unsigned char sn=0x00; +u32 command_count=0; +char command_enable=0; //static char b2_index=0; -#define Set4_SEND GPIO_SetBits(GPIOE,GPIO_Pin_6); -#define Set4_RCVE GPIO_ResetBits(GPIOE,GPIO_Pin_6); + void DMA_config() { - //使能DMA外设 - RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE); + //ʹDMA + RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); DMA_InitTypeDef DMA_InitStructure; - DMA_DeInit(DMA2_Channel3);//串口2的DMA数据通道 - //相应的DMA配置 - //DMA_DeInit(DMA1_Channel5); //将DMA的通道5寄存器重设为缺省值 串口2对应的是DMA通道16 - DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&UART4->DR; //DMA外设usart基地址 - DMA_InitStructure.DMA_MemoryBaseAddr = (u32)u4tx_buf; //DMA内存基地址 - DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //数据传输方向,从外设读取发送到内存 - DMA_InitStructure.DMA_BufferSize = U4_TXBUF; //DMA通道的DMA缓存的大小 - DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址寄存器不变 - DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址寄存器递增 - DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //外设数据宽度为8位 - DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //内存数据宽度为8位 - DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //工作在正常缓存模式 - DMA_InitStructure.DMA_Priority = DMA_Priority_High;//DMA_Priority_Medium; //DMA通道 x拥有中优先级 - DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA通道x没有设置为内存到内存传输 - DMA_Init(DMA2_Channel3, &DMA_InitStructure); //根据DMA_InitStruct中指定的参数初始化DMA的通道 - USART_DMACmd(UART4,USART_DMAReq_Rx,ENABLE); //使能串口1 DMA接收 - DMA_Cmd(DMA2_Channel3, ENABLE); //正式驱动DMA传输 + DMA_DeInit(DMA1_Channel6);//2DMAͨ + //ӦDMA + //DMA_DeInit(DMA1_Channel5); //DMAͨ5ĴΪȱʡֵ 2ӦDMAͨ16 + DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&USART2->DR; //DMAusartַ + DMA_InitStructure.DMA_MemoryBaseAddr = (u32)u4tx_buf; //DMAڴַ + DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //ݴ䷽򣬴ȡ͵ڴ + DMA_InitStructure.DMA_BufferSize = U4_TXBUF; //DMAͨDMAĴС + DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //ַĴ + DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //ڴַĴ + DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //ݿΪ8λ + DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //ڴݿΪ8λ + DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //ģʽ + DMA_InitStructure.DMA_Priority = DMA_Priority_High;//DMA_Priority_Medium; //DMAͨ xӵȼ + DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMAͨxûΪڴ浽ڴ洫 + DMA_Init(DMA1_Channel6, &DMA_InitStructure); //DMA_InitStructָIJʼDMAͨ + USART_DMACmd(USART2,USART_DMAReq_Rx,ENABLE); //ʹܴ1 DMA + DMA_Cmd(DMA1_Channel6, ENABLE); //ʽDMA //DMA_SetCurrDataCounter(DMA1_Stream6, byteLen); } -//重置DMA数据指向 +//DMAָ void Reset_DMA() { - DMA_Cmd(DMA2_Channel3, DISABLE); //关闭USART1 TX DMA1所指示的通道 - DMA_SetCurrDataCounter(DMA2_Channel3, U4_TXBUF);//DMA通道的DMA缓存的大小 - DMA_Cmd(DMA2_Channel3, ENABLE); //打开USART1 TX DMA1所指示的通道 + DMA_Cmd(DMA1_Channel6, DISABLE); //رUSART1 TX DMA1ָʾͨ + DMA_SetCurrDataCounter(DMA1_Channel6, U4_TXBUF);//DMAͨDMAĴС + DMA_Cmd(DMA1_Channel6, ENABLE); //USART1 TX DMA1ָʾͨ } char uart2_init() { @@ -46,40 +49,51 @@ char uart2_init() USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; - /* 打开GPIOA时钟、AFIO时钟,USART2时钟 */ - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); // | RCC_APB2Periph_AFIO - RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4,ENABLE); - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE); // | RCC_APB2Periph_AFIO + /* GPIOAʱӡAFIOʱӣUSART2ʱ */ + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // | RCC_APB2Periph_AFIO + RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE); + //RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE); // | RCC_APB2Periph_AFIO - USART_DeInit(UART4); + USART_DeInit(USART2); - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; + /*GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOE, &GPIO_InitStructure); - Set4_RCVE + Set4_RCVE*/ /* UART2 TX PA2 */ + /* GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_Init(GPIOC, &GPIO_InitStructure); + GPIO_Init(GPIOC, &GPIO_InitStructure);*/ /* UART2 RX PA3 */ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; + /*GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_Init(GPIOC, &GPIO_InitStructure);*/ + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_Init(GPIOA, &GPIO_InitStructure); + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_Init(GPIOC, &GPIO_InitStructure); + GPIO_Init(GPIOA, &GPIO_InitStructure); /* Enable the USART2 Interrupt */ //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3); - NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn; //串口中断设置 - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级1 - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //子优先级0 + NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; //ж + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //ռȼ1 + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //ȼ0 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); - /* USART 配置 */ + /* USART */ USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; @@ -87,21 +101,21 @@ char uart2_init() USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; - USART_Init(UART4, &USART_InitStructure); + USART_Init(USART2, &USART_InitStructure); - /* 使能UART2接收RXNE中断 */ - USART_ITConfig(UART4, USART_IT_IDLE, ENABLE); //接收空闲中断 + /* ʹUART2RXNEж */ + USART_ITConfig(USART2, USART_IT_IDLE, ENABLE); //տж //USART_ITConfig(UART4, USART_IT_RXNE, ENABLE); - /* 使能UART2 */ - USART_Cmd(UART4, ENABLE); - /* 清除发送完成标志 */ + /* ʹUART2 */ + USART_Cmd(USART2, ENABLE); + /* ɱ־ */ //USART_ClearFlag(UART4, USART_FLAG_TC); DMA_config(); return 0; } -void UART4_IRQHandler(void) +void USART2_IRQHandler(void) { /*if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) u2_buff[b2_index]= USART_ReceiveData(USART2); @@ -114,28 +128,28 @@ void UART4_IRQHandler(void) else b2_index++;*/ - if(USART_GetITStatus(UART4, USART_IT_IDLE) != RESET) + if(USART_GetITStatus(USART2, USART_IT_IDLE) != RESET) { - USART_ReceiveData(UART4);//清楚中断标志 + USART_ReceiveData(USART2);//жϱ־ unsigned char snr=~sn; - dma_index=U4_TXBUF-DMA_GetCurrDataCounter(DMA2_Channel3);//接收的字节个数 - //判断是否检测的指令标志 - if(u4tx_buf[0]=='$' && u4tx_buf[1]<128) + dma_index=U4_TXBUF-DMA_GetCurrDataCounter(DMA1_Channel6);//յֽڸ + //жǷָ־ + if(u4tx_buf[0]=='$' && u4tx_buf[dma_index-1]=='#') { RS485_Send_Data(u4tx_buf,dma_index); - Reset_DMA();//复位DMA指针 + Reset_DMA();//λDMAָ sn=0x00; - }//否则是检测到数据包开头,数据包开头不会有$ - else if(u4tx_buf[0]==sn && u4tx_buf[1]==snr) //一次发送数据包大小为2052,如果小于2052认为数据丢失 + }//Ǽ⵽ݰͷݰͷ$ + else if(u4tx_buf[0]==sn && u4tx_buf[1]==snr) //һηݰСΪ2052С2052Ϊݶʧ { if(dma_index==2052) { RS485_Send_Data(u4tx_buf,dma_index); - Reset_DMA();//复位DMA指针 + Reset_DMA();//λDMAָ sn+=1; } else - USART_ClearITPendingBit(UART4,USART_IT_IDLE); //清除中断标志 + USART_ClearITPendingBit(USART2,USART_IT_IDLE); //жϱ־ } /* else if(u2tx_buf[0]==sn && u2tx_buf[1]==~sn && dma_index!=2052) { @@ -146,13 +160,13 @@ void UART4_IRQHandler(void) i--; } DTU_send_char(str); - Reset_DMA();//复位DMA指针 + Reset_DMA();//λDMAָ } */ else - Reset_DMA();//复位DMA指针 + Reset_DMA();//λDMAָ } - USART_ClearITPendingBit(UART4,USART_IT_IDLE); //清除中断标志 + USART_ClearITPendingBit(USART2,USART_IT_IDLE); //жϱ־ } void DTU_send_char(char * str,u32 len) @@ -164,19 +178,18 @@ void DTU_send_char(char * str,u32 len) while(USART_GetFlagStatus(UART4, USART_FLAG_TC)==RESET); }*/ u32 t; - Set4_SEND + //Set4_SEND for(t=0;t