#include "UART_ARM.h" #include "TIM6_1MS.h" #include "app_def.h" #define UART_BUFSIZE 1024 unsigned int UART_Rev_WriteInex=0; unsigned int UART_Rev_ReadIndex=0; unsigned char UART_Rev_Buf[1024]; unsigned int UART_Send_WriteIndex=0; unsigned int UART_Send_ReadIndex=0; unsigned char UART_Send_Buf[1024]; static unsigned char UART_SendingFlag=0; //UART发送中标识,0表示非发送中 U16 UartBusTime =0; //收到长的BUS数据,延时发UART指令 extern void UART_Rev_NewInfo(unsigned char *pInfo); int UART_ARM_init(void) { GPIO_InitTypeDef GPIO_InitStruct; NVIC_InitTypeDef NVIC_InitStruct; USART_InitTypeDef USART_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //=================================== //打开引脚时钟 UART_ARM_Tx_RccOpen(); UART_ARM_Rx_RccOpen(); //=================================== //Tx,Rx设置为复用引脚,注意:输入要设置浮空输入 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_Pin = UART_ARM_Tx_Line; GPIO_Init(UART_ARM_Tx_Port,&GPIO_InitStruct); //== GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStruct.GPIO_Pin = UART_ARM_Rx_Line; GPIO_Init(UART_ARM_Rx_Port,&GPIO_InitStruct); //=================================== //引脚重映射 UART_ARM_Remap(); //=================================== UART_ARM_RccOpen(); //打开串口时钟 USART_DeInit(UART_ARM_Periph); //初始化为默认值 USART_InitStructure.USART_BaudRate = 115200; //波特率 USART_InitStructure.USART_WordLength = USART_WordLength_8b; //8位数据 USART_InitStructure.USART_StopBits = USART_StopBits_1; //1位停止位 USART_InitStructure.USART_Parity = USART_Parity_No; //无校验 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //双工 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无协议控制 USART_Init(UART_ARM_Periph,&USART_InitStructure); //初始化 USART_Cmd(UART_ARM_Periph,ENABLE); //=================================== //打开串口中断 USART_ClearITPendingBit(UART_ARM_Periph,USART_IT_RXNE); //先清掉中断标志位 USART_ClearITPendingBit(UART_ARM_Periph,USART_IT_TXE); //先清掉中断标志位 USART_ITConfig(UART_ARM_Periph,USART_IT_RXNE,ENABLE); //打开串口接收中断 //=================================== //对中断进行初始化 NVIC_InitStruct.NVIC_IRQChannel = UART_ARM_IRQ; //中断号 NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = UART_ARM_PPriority; //抢占级 NVIC_InitStruct.NVIC_IRQChannelSubPriority = UART_ARM_SPriority; //响应级 NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; //打开该中断 NVIC_Init(&NVIC_InitStruct); //缓冲区初始化 //=================================== UART_Rev_WriteInex=0; UART_Rev_ReadIndex=0; UART_Send_WriteIndex=0; UART_Send_ReadIndex=0; UART_SendingFlag=0; return 1; } unsigned int u16cnttest =0; void UART_Tick(void) { unsigned int i; static unsigned char UART_Rev_Data[100]={0}; static unsigned int UART_Rev_DataIndex=0; //============================================================================ //查询是否有发送任务 if(UART_SendingFlag==0) { // if ( UartBusTime < 300) { //避免上行下行干扰 // return; // } if(UART_Send_WriteIndex!=UART_Send_ReadIndex) { UART_SendingFlag=0xFF; i=UART_Send_ReadIndex; UART_Send_ReadIndex++; if(UART_Send_ReadIndex>=UART_BUFSIZE) UART_Send_ReadIndex=0; USART_SendData(UART_ARM_Periph, UART_Send_Buf[i]); USART_ITConfig(UART_ARM_Periph,USART_IT_TXE,ENABLE); //打开串口发送中断 } } // if ( Bus_SendStart ) { // return; // } //============================================================================ if(UART_Rev_WriteInex!=UART_Rev_ReadIndex) { while(UART_Rev_WriteInex!=UART_Rev_ReadIndex) { //====================================================== if(UART_Rev_Buf[UART_Rev_ReadIndex]=='$') { UART_Rev_DataIndex=0; UART_Rev_Data[0]='$'; } else if(UART_Rev_Buf[UART_Rev_ReadIndex]=='#') { UART_Rev_Data[UART_Rev_DataIndex]='#'; UART_Rev_NewInfo(UART_Rev_Data); UART_Rev_DataIndex=0; } else { UART_Rev_Data[UART_Rev_DataIndex]=UART_Rev_Buf[UART_Rev_ReadIndex]; } UART_Rev_DataIndex++; if(UART_Rev_DataIndex>=100) UART_Rev_DataIndex=0; //====================================================== UART_Rev_ReadIndex++; if(UART_Rev_ReadIndex>=UART_BUFSIZE) UART_Rev_ReadIndex=0; } } } void UART_Send(unsigned char *pdata,unsigned short len) { while(len>0) { UART_Send_Buf[UART_Send_WriteIndex]=*pdata; UART_Send_WriteIndex++; if(UART_Send_WriteIndex>=UART_BUFSIZE) UART_Send_WriteIndex=0; pdata++; len--; } } void UART_ARM_IRQ_Handler() { unsigned int i; //处理接收中断 //============================================ if(USART_GetITStatus(UART_ARM_Periph, USART_IT_RXNE) != RESET) { UART_Rev_Buf[UART_Rev_WriteInex]=USART_ReceiveData(UART_ARM_Periph); UART_Rev_WriteInex++; if(UART_Rev_WriteInex>=UART_BUFSIZE) UART_Rev_WriteInex=0; } //============================================ //处理发送中断 if(USART_GetITStatus(UART_ARM_Periph, USART_IT_TXE) != RESET) { if(UART_Send_ReadIndex!=UART_Send_WriteIndex) { i=UART_Send_ReadIndex; UART_Send_ReadIndex++; if(UART_Send_ReadIndex>=UART_BUFSIZE) UART_Send_ReadIndex=0; USART_SendData(UART_ARM_Periph, UART_Send_Buf[i]); } else { UART_SendingFlag=0; USART_ITConfig(UART_ARM_Periph,USART_IT_TXE,DISABLE); //关闭串口发送中断 } } }