USART_DMACmd(USART2,USART_DMAReq_Rx |USART_DMAReq_Tx,ENABLE); USART_Cmd(USART2,ENABLE); }
void DMA2_Stream2_IRQHandler(void) //串口1接收到了数据。即:电脑发数据了 { if(DMA_GetITStatus(DMA2_Stream2,DMA_IT_TCIF2)==SET) { DMA_ClearFlag(DMA2_Stream2,DMA_FLAG_TCIF2); if(uart_rx_tx_buf[0]=='C') { Set_1_rate(uart_rx_tx_buf[1]); } DMA_Cmd(DMA1_Stream6, ENABLE); //使能USART2的串口发送DMA } }
void DMA2_Stream7_IRQHandler(void) { if(DMA_GetITStatus(DMA2_Stream7,DMA_IT_TCIF7)==SET) //串口1发送完数据 { DMA_ClearFlag(DMA2_Stream7,DMA_FLAG_TCIF7); DMA_Cmd(DMA2_Stream7, DISABLE); //不使能DMA对于USART1的发送功能 } }
void DMA1_Stream5_IRQHandler(void) //串口2接收数据完成,即:8051向串口2发送数据 { if(DMA_GetITStatus(DMA1_Stream5,DMA_IT_TCIF5)==SET) { DMA_ClearFlag(DMA1_Stream5,DMA_FLAG_TCIF5); DMA_Cmd(DMA2_Stream7, ENABLE); //使能DMA对于USART1的发送功能 } }
void DMA1_Stream6_IRQHandler(void) //串口2发送数据完成,即:发送到8051 { if(DMA_GetITStatus(DMA1_Stream6,DMA_IT_TCIF6)==SET) { DMA_ClearFlag(DMA1_Stream6,DMA_FLAG_TCIF6); if(uart_rx_tx_buf[0]=='C') { Set_2_rate(uart_rx_tx_buf[1]);
} else if(uart_rx_tx_buf[0]=='R' &&uart_rx_tx_buf[1]=='D') { Set485Mode(RX_MODE); } DMA_Cmd(DMA1_Stream6, DISABLE); //关闭USART2的串口发送DMA } }
void Set_1_rate(unsigned char rate_num) { USART_InitStruct.USART_BaudRate=boundrate[rate_num]; USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None; USART_InitStruct.USART_Mode=USART_Mode_Rx |USART_Mode_Tx; USART_InitStruct.USART_Parity=USART_Parity_No; USART_InitStruct.USART_StopBits=USART_StopBits_1; USART_InitStruct.USART_WordLength=USART_WordLength_8b; USART_Init(USART1,&USART_InitStruct); }
void Set_2_rate(unsigned char rate_num) { USART_InitStruct.USART_BaudRate=boundrate[rate_num]; USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None; USART_InitStruct.USART_Mode=USART_Mode_Rx |USART_Mode_Tx; USART_InitStruct.USART_Parity=USART_Parity_No; USART_InitStruct.USART_StopBits=USART_StopBits_1; USART_InitStruct.USART_WordLength=USART_WordLength_8b; USART_Init(USART2,&USART_InitStruct); }
void Set485Mode(unsigned char flag) { if(flag==RX_MODE) GPIO_ResetBits(GPIOC,GPIO_Pin_1); else if(flag==TX_MODE) GPIO_SetBits(GPIOC,GPIO_Pin_1); }
void _485PinConfig(void) //PC1作为485控制引脚 { GPIO_InitStruct.GPIO_Mode=GPIO_Mode_OUT; GPIO_InitStruct.GPIO_Pin=GPIO_Pin_1; GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_NOPULL; GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOC,&GPIO_InitStruct); }
#ifdef USE_FULL_ASSERT /**
* @brief Reports the name of the source file and the source line number * where the assert_param error has occurred. * @param file: pointer to the source file name
* @param line: assert_param error line source number * @retval None */
void assert_failed(uint8_t* file, uint32_t line) {
/* User can add his own implementation to report the file name and line number, ex: printf(\
while (1) {} }
#endif /** * @} */ /** * @} */
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/