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

Replace DMA_UART4

上级 956302d2
#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 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);//串口2的DMA数据通道
//相应的DMA配置
//DMA_DeInit(DMA1_Channel5); //将DMA的通道5寄存器重设为缺省值 串口2对应的是DMA通道16
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&USART2->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(DMA1_Channel6, &DMA_InitStructure); //根据DMA_InitStruct中指定的参数初始化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); //接收空闲中断
/* 使能UART2接收RXNE中断 */
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<len;t++)
{
while(USART_GetFlagStatus(UART4, USART_FLAG_TC) == RESET);
USART_SendData(UART4,str[t]);
while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);
USART_SendData(USART2,str[t]);
}
while(USART_GetFlagStatus(UART4, USART_FLAG_TC) == RESET);
Set4_RCVE;
while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);
//Set4_RCVE;
}
void DTU_SendByte(unsigned char SendData)
{
USART_SendData(UART4,SendData);
while(USART_GetFlagStatus(UART4, USART_FLAG_TXE) == RESET);
USART_SendData(USART2,SendData);
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.
先完成此消息的编辑!
想要评论请 注册