标签:dma tco idle sub rs485 lag tle 处理器 lcm
/*初始化RS485引脚 */
void GPIO_Configuration(void){GPIO_InitTypeDef GPIO_InitStructure;/* 使能USART1 时钟和所在端口时钟 */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);/*初始化USART1_TX端口*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);/*初始化USART1_RX端口 */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);/* 使能USART2时钟和USART2所占用引脚的时钟 *///RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);/* 初始化USART2_Tx时钟 */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);/* 初始化USART2_Rx时钟 */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init ( GPIOA, & GPIO_InitStructure );
}
void USART_Configuration(void){USART_InitTypeDef USART_InitStructure;/* USART1 115200 n 8 1 */USART_InitStructure.USART_BaudRate = 115200;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_1;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(USART1, &USART_InitStructure);//开串口空闲中断USART_ITConfig(USART1, USART_IT_IDLE , ENABLE);//使能USART1USART_Cmd(USART1, ENABLE);USART_ClearFlag(USART1, USART_FLAG_TC);/*usart2 115200 n 8 1*/USART_InitStructure.USART_BaudRate = 115200;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_1;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(USART2, &USART_InitStructure);//开串口空闲中断USART_ITConfig(USART2, USART_IT_IDLE , ENABLE);//使能USART2USART_Cmd(USART2, ENABLE);USART_ClearFlag(USART2, USART_FLAG_TC);}
void DMA_Configuration(void){DMA_InitTypeDef DMA_InitStructure;/* DMA clock enable */RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//DMA1/* DMA1 Channel4 (triggered by USART1 Tx event) Config */DMA_DeInit(DMA1_Channel4);DMA_InitStructure.DMA_PeripheralBaseAddr = 0x40013804;DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)USART1_SEND_DATA;DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;DMA_InitStructure.DMA_BufferSize = 128;DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;DMA_InitStructure.DMA_Priority = DMA_Priority_High;DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;DMA_Init(DMA1_Channel4, &DMA_InitStructure);DMA_ITConfig(DMA1_Channel4, DMA_IT_TC, ENABLE);DMA_ITConfig(DMA1_Channel4, DMA_IT_TE, ENABLE);/* Enable USART1 DMA TX request */USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);DMA_Cmd(DMA1_Channel4, DISABLE);/* DMA1 Channel7 (triggered by USART2 Tx event) Config */DMA_DeInit(DMA1_Channel7);DMA_InitStructure.DMA_PeripheralBaseAddr = 0x40004404;DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)USART2_SEND_DATA;DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;DMA_InitStructure.DMA_BufferSize = 128;DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;DMA_InitStructure.DMA_Priority = DMA_Priority_High;DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;DMA_Init(DMA1_Channel7, &DMA_InitStructure);DMA_ITConfig(DMA1_Channel7, DMA_IT_TC, ENABLE);DMA_ITConfig(DMA1_Channel7, DMA_IT_TE, ENABLE);/* Enable USART1 DMA TX request */USART_DMACmd(USART2, USART_DMAReq_Tx, ENABLE);DMA_Cmd(DMA1_Channel7, DISABLE);/* DMA1 Channel5 (triggered by USART1 Rx event) Config */DMA_DeInit(DMA1_Channel5);DMA_InitStructure.DMA_PeripheralBaseAddr = 0x40013804;DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)USART1_RECEIVE_DATA;DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;DMA_InitStructure.DMA_BufferSize = 128;DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;DMA_InitStructure.DMA_Priority = DMA_Priority_High;DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;DMA_Init(DMA1_Channel5, &DMA_InitStructure);DMA_ITConfig(DMA1_Channel5, DMA_IT_TC, ENABLE);DMA_ITConfig(DMA1_Channel5, DMA_IT_TE, ENABLE);/* Enable USART1 DMA RX request */USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);DMA_Cmd(DMA1_Channel5, ENABLE);/* DMA1 Channel6 (triggered by USART1 Rx event) Config */DMA_DeInit(DMA1_Channel6);DMA_InitStructure.DMA_PeripheralBaseAddr = 0x40004404;DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)USART2_RECEIVE_DATA;DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;DMA_InitStructure.DMA_BufferSize = 128;DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;DMA_Init(DMA1_Channel6, &DMA_InitStructure);DMA_ITConfig(DMA1_Channel6, DMA_IT_TC, ENABLE);DMA_ITConfig(DMA1_Channel6, DMA_IT_TE, ENABLE);/* Enable USART2 DMA RX request */USART_DMACmd(USART2, USART_DMAReq_Rx, ENABLE);DMA_Cmd(DMA1_Channel6, ENABLE);}
void NVIC_Configuration(void){NVIC_InitTypeDef NVIC_InitStructure;/* Configure one bit for preemption priority */NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);/* Enable the USART1 Interrupt串口空闲中断 */NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);/* Enable the USART2 Interrupt 串口空闲中断 */NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);//Enable DMA Channel4 Interrupt DMA 发包完成中断NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);//Enable DMA Channel7 Interrupt DMA 发包完成中断NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel7_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);}
void USART1_IRQHandler(void){u16 DATA_LEN;if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)//收包完成,触发空闲中断{DMA_Cmd(DMA1_Channel5, DISABLE);//关掉DMA防干扰DATA_LEN=128-DMA_GetCurrDataCounter(DMA1_Channel5); //计算长度if(DATA_LEN > 0){//数据处理}DMA_ClearFlag(DMA1_FLAG_GL5 | DMA1_FLAG_TC5 | DMA1_FLAG_TE5 | DMA1_FLAG_HT5);//清楚中断标志位,方便下一次接收DMA1_Channel5->CNDTR = 128;//USART1->SR;USART1->DR;DMA_ClearITPendingBit(DMA1_IT_TC5);DMA_ClearITPendingBit(DMA1_IT_TE5);DMA_Cmd(DMA1_Channel5, DISABLE);//DMA1_Channel5->CNDTR = 128;//?DMA_Cmd(DMA1_Channel5, ENABLE);//}if(USART_GetITStatus(USART1, USART_IT_PE | USART_IT_FE | USART_IT_NE) != RESET)//{USART_ClearITPendingBit(USART1, USART_IT_PE | USART_IT_FE | USART_IT_NE);}USART_ClearITPendingBit(USART1, USART_IT_TC);USART_ClearITPendingBit(USART1, USART_IT_IDLE);}void USART2_IRQHandler(void){u16 DATA_LEN;if(USART_GetITStatus(USART2, USART_IT_IDLE) != RESET) //?????????{DMA_Cmd(DMA1_Channel6, DISABLE);DATA_LEN=512-DMA_GetCurrDataCounter(DMA1_Channel6);if(DATA_LEN > 0){}//DMA_Cmd(DMA1_Channel5, DISABLE);//??DMA,?????????DMA_ClearFlag(DMA1_FLAG_GL6 | DMA1_FLAG_TC6 | DMA1_FLAG_TE6 | DMA1_FLAG_HT6);//???DMA1_Channel6->CNDTR = 512;//???DMA_Cmd(DMA1_Channel6, ENABLE);//???,??DMA//?SR??DR??IdleUSART2->SR;USART2->DR;DMA_ClearITPendingBit(DMA1_IT_TC6);DMA_ClearITPendingBit(DMA1_IT_TE6);DMA_Cmd(DMA1_Channel6, DISABLE);//DMA1_Channel6->CNDTR = 128;//?DMA_Cmd(DMA1_Channel6, ENABLE);//}if(USART_GetITStatus(USART2, USART_IT_PE | USART_IT_FE | USART_IT_NE) != RESET)//??{USART_ClearITPendingBit(USART2, USART_IT_PE | USART_IT_FE | USART_IT_NE);}USART_ClearITPendingBit(USART2, USART_IT_TC);USART_ClearITPendingBit(USART2, USART_IT_IDLE);}
void usart1_DMA_send_data(int DATA_LEN){DMA_Cmd(DMA1_Channel4, DISABLE);DMA1_Channel4->CNDTR=DATA_LEN; //DMA1DMA_Cmd(DMA1_Channel4, ENABLE);}void usart2_DMA_send_data(int DATA_LEN){DMA_Cmd(DMA1_Channel7, DISABLE); //DMA1_Channel7->CNDTR=DATA_LEN; //DMA1,?????DMA_Cmd(DMA1_Channel7, ENABLE);}
//DMA1_Channel4void DMA1_Channel4_IRQHandler(void){DMA_ClearITPendingBit(DMA1_IT_TC4);DMA_ClearITPendingBit(DMA1_IT_TE4);DMA_Cmd(DMA1_Channel4, DISABLE);//}//DMA1_Channel7void DMA1_Channel7_IRQHandler(void){DMA_ClearITPendingBit(DMA1_IT_TC7);DMA_ClearITPendingBit(DMA1_IT_TE7);DMA_Cmd(DMA1_Channel7, DISABLE);}
void set_RS485_TX_mode(){int cnt = 72000;PAout(8) =1;while(cnt--);}void set_RS485_Rx_mode(){int cnt = 72000;while(cnt--);PAout(8) =0;}
void rs485_DMA_send_data(uint8_t* data,uint8_t size){set_RS485_TX_mode();memcpy(USART1_SEND_DATA,data,size);usart1_DMA_send_data(size);set_RS485_Rx_mode();}void USART_DMA_send_data(uint8_t* data,uint8_t size){memcpy(USART2_SEND_DATA,data,size);usart2_DMA_send_data(size);}
标签:dma tco idle sub rs485 lag tle 处理器 lcm
原文地址:http://www.cnblogs.com/yaoyaoyaoyao/p/7326445.html