提交 6b6ea10e 编写于 作者: 真的见不到了码's avatar 真的见不到了码

Replace DMA_UART4

上级 956302d2
#include <object.h> #include <object.h>
#define Set4_SEND GPIO_SetBits(GPIOE,GPIO_Pin_6);
#define Set4_RCVE GPIO_ResetBits(GPIOE,GPIO_Pin_6);
char u4_buff[32]; char u4_buff[32];
char test_command[32]="Hello DTU!"; char test_command[32]="Hello DTU!";
char DTU_reply[64]; char DTU_reply[64];
char len_reply=0; char len_reply=0;
unsigned char u4tx_buf[U4_TXBUF];//一个2K大一点的数据缓冲区 unsigned char u4tx_buf[U4_TXBUF];//一个2K大一点的数据缓冲区
u32 dma_index=0; u32 dma_index=0;
unsigned char sn=0x00; unsigned char sn=0x00;
u32 command_count=0;
char command_enable=0;
//static char b2_index=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() void DMA_config()
{ {
//使能DMA外设 //使能DMA外设
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
DMA_InitTypeDef DMA_InitStructure; DMA_InitTypeDef DMA_InitStructure;
DMA_DeInit(DMA2_Channel3);//串口2的DMA数据通道 DMA_DeInit(DMA1_Channel6);//串口2的DMA数据通道
//相应的DMA配置 //相应的DMA配置
//DMA_DeInit(DMA1_Channel5); //将DMA的通道5寄存器重设为缺省值 串口2对应的是DMA通道16 //DMA_DeInit(DMA1_Channel5); //将DMA的通道5寄存器重设为缺省值 串口2对应的是DMA通道16
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&UART4->DR; //DMA外设usart基地址 DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&USART2->DR; //DMA外设usart基地址
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)u4tx_buf; //DMA内存基地址 DMA_InitStructure.DMA_MemoryBaseAddr = (u32)u4tx_buf; //DMA内存基地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //数据传输方向,从外设读取发送到内存 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //数据传输方向,从外设读取发送到内存
DMA_InitStructure.DMA_BufferSize = U4_TXBUF; //DMA通道的DMA缓存的大小 DMA_InitStructure.DMA_BufferSize = U4_TXBUF; //DMA通道的DMA缓存的大小
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址寄存器不变 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址寄存器不变
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址寄存器递增 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址寄存器递增
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //外设数据宽度为8位 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //外设数据宽度为8位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //内存数据宽度为8位 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //内存数据宽度为8位
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //工作在正常缓存模式 DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //工作在正常缓存模式
DMA_InitStructure.DMA_Priority = DMA_Priority_High;//DMA_Priority_Medium; //DMA通道 x拥有中优先级 DMA_InitStructure.DMA_Priority = DMA_Priority_High;//DMA_Priority_Medium; //DMA通道 x拥有中优先级
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA通道x没有设置为内存到内存传输 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA通道x没有设置为内存到内存传输
DMA_Init(DMA2_Channel3, &DMA_InitStructure); //根据DMA_InitStruct中指定的参数初始化DMA的通道 DMA_Init(DMA1_Channel6, &DMA_InitStructure); //根据DMA_InitStruct中指定的参数初始化DMA的通道
USART_DMACmd(UART4,USART_DMAReq_Rx,ENABLE); //使能串口1 DMA接收 USART_DMACmd(USART2,USART_DMAReq_Rx,ENABLE); //使能串口1 DMA接收
DMA_Cmd(DMA2_Channel3, ENABLE); //正式驱动DMA传输 DMA_Cmd(DMA1_Channel6, ENABLE); //正式驱动DMA传输
//DMA_SetCurrDataCounter(DMA1_Stream6, byteLen); //DMA_SetCurrDataCounter(DMA1_Stream6, byteLen);
} }
//重置DMA数据指向 //重置DMA数据指向
void Reset_DMA() void Reset_DMA()
{ {
DMA_Cmd(DMA2_Channel3, DISABLE); //关闭USART1 TX DMA1所指示的通道 DMA_Cmd(DMA1_Channel6, DISABLE); //关闭USART1 TX DMA1所指示的通道
DMA_SetCurrDataCounter(DMA2_Channel3, U4_TXBUF);//DMA通道的DMA缓存的大小 DMA_SetCurrDataCounter(DMA1_Channel6, U4_TXBUF);//DMA通道的DMA缓存的大小
DMA_Cmd(DMA2_Channel3, ENABLE); //打开USART1 TX DMA1所指示的通道 DMA_Cmd(DMA1_Channel6, ENABLE); //打开USART1 TX DMA1所指示的通道
} }
char uart2_init() char uart2_init()
{ {
...@@ -46,40 +49,51 @@ char uart2_init() ...@@ -46,40 +49,51 @@ char uart2_init()
USART_InitTypeDef USART_InitStructure; USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitTypeDef NVIC_InitStructure;
/* 打开GPIOA时钟、AFIO时钟,USART2时钟 */ /* 打开GPIOA时钟、AFIO时钟,USART2时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); // | RCC_APB2Periph_AFIO RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // | RCC_APB2Periph_AFIO
RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4,ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE); // | RCC_APB2Periph_AFIO //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_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOE, &GPIO_InitStructure); GPIO_Init(GPIOE, &GPIO_InitStructure);
Set4_RCVE Set4_RCVE*/
/* UART2 TX PA2 */ /* UART2 TX PA2 */
/*
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_Init(GPIOC, &GPIO_InitStructure);*/
/* UART2 RX PA3 */ /* 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_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Enable the USART2 Interrupt */ /* Enable the USART2 Interrupt */
//NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3); //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn; //串口中断设置 NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; //串口中断设置
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级1 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //子优先级0 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //子优先级0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure); NVIC_Init(&NVIC_InitStructure);
/* USART 配置 */ /* USART 配置 */
USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_WordLength = USART_WordLength_8b;
...@@ -87,21 +101,21 @@ char uart2_init() ...@@ -87,21 +101,21 @@ char uart2_init()
USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(UART4, &USART_InitStructure); USART_Init(USART2, &USART_InitStructure);
/* 使能UART2接收RXNE中断 */ /* 使能UART2接收RXNE中断 */
USART_ITConfig(UART4, USART_IT_IDLE, ENABLE); //接收空闲中断 USART_ITConfig(USART2, USART_IT_IDLE, ENABLE); //接收空闲中断
//USART_ITConfig(UART4, USART_IT_RXNE, ENABLE); //USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);
/* 使能UART2 */ /* 使能UART2 */
USART_Cmd(UART4, ENABLE); USART_Cmd(USART2, ENABLE);
/* 清除发送完成标志 */ /* 清除发送完成标志 */
//USART_ClearFlag(UART4, USART_FLAG_TC); //USART_ClearFlag(UART4, USART_FLAG_TC);
DMA_config(); DMA_config();
return 0; return 0;
} }
void UART4_IRQHandler(void) void USART2_IRQHandler(void)
{ {
/*if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) /*if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
u2_buff[b2_index]= USART_ReceiveData(USART2); u2_buff[b2_index]= USART_ReceiveData(USART2);
...@@ -114,28 +128,28 @@ void UART4_IRQHandler(void) ...@@ -114,28 +128,28 @@ void UART4_IRQHandler(void)
else else
b2_index++;*/ 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; unsigned char snr=~sn;
dma_index=U4_TXBUF-DMA_GetCurrDataCounter(DMA2_Channel3);//接收的字节个数 dma_index=U4_TXBUF-DMA_GetCurrDataCounter(DMA1_Channel6);//接收的字节个数
//判断是否检测的指令标志 //判断是否检测的指令标志
if(u4tx_buf[0]=='$' && u4tx_buf[1]<128) if(u4tx_buf[0]=='$' && u4tx_buf[dma_index-1]=='#')
{ {
RS485_Send_Data(u4tx_buf,dma_index); RS485_Send_Data(u4tx_buf,dma_index);
Reset_DMA();//复位DMA指针 Reset_DMA();//复位DMA指针
sn=0x00; 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) if(dma_index==2052)
{ {
RS485_Send_Data(u4tx_buf,dma_index); RS485_Send_Data(u4tx_buf,dma_index);
Reset_DMA();//复位DMA指针 Reset_DMA();//复位DMA指针
sn+=1; sn+=1;
} }
else 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) /* else if(u2tx_buf[0]==sn && u2tx_buf[1]==~sn && dma_index!=2052)
{ {
...@@ -146,13 +160,13 @@ void UART4_IRQHandler(void) ...@@ -146,13 +160,13 @@ void UART4_IRQHandler(void)
i--; i--;
} }
DTU_send_char(str); DTU_send_char(str);
Reset_DMA();//复位DMA指针 Reset_DMA();//复位DMA指针
} */ } */
else 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) void DTU_send_char(char * str,u32 len)
...@@ -164,19 +178,18 @@ 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); while(USART_GetFlagStatus(UART4, USART_FLAG_TC)==RESET);
}*/ }*/
u32 t; u32 t;
Set4_SEND //Set4_SEND
for(t=0;t<len;t++) for(t=0;t<len;t++)
{ {
while(USART_GetFlagStatus(UART4, USART_FLAG_TC) == RESET); while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);
USART_SendData(UART4,str[t]); USART_SendData(USART2,str[t]);
} }
while(USART_GetFlagStatus(UART4, USART_FLAG_TC) == RESET); while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);
Set4_RCVE; //Set4_RCVE;
} }
void DTU_SendByte(unsigned char SendData) void DTU_SendByte(unsigned char SendData)
{ {
USART_SendData(UART4,SendData); USART_SendData(USART2,SendData);
while(USART_GetFlagStatus(UART4, USART_FLAG_TXE) == RESET); while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册