123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- #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); //关闭串口发送中断
- }
- }
- }
|