UART_ARM.c 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. #include "UART_ARM.h"
  2. #include "TIM6_1MS.h"
  3. #include "app_def.h"
  4. #define UART_BUFSIZE 1024
  5. unsigned int UART_Rev_WriteInex=0;
  6. unsigned int UART_Rev_ReadIndex=0;
  7. unsigned char UART_Rev_Buf[1024];
  8. unsigned int UART_Send_WriteIndex=0;
  9. unsigned int UART_Send_ReadIndex=0;
  10. unsigned char UART_Send_Buf[1024];
  11. static unsigned char UART_SendingFlag=0; //UART发送中标识,0表示非发送中
  12. U16 UartBusTime =0; //收到长的BUS数据,延时发UART指令
  13. extern void UART_Rev_NewInfo(unsigned char *pInfo);
  14. int UART_ARM_init(void)
  15. {
  16. GPIO_InitTypeDef GPIO_InitStruct;
  17. NVIC_InitTypeDef NVIC_InitStruct;
  18. USART_InitTypeDef USART_InitStructure;
  19. RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
  20. //===================================
  21. //打开引脚时钟
  22. UART_ARM_Tx_RccOpen();
  23. UART_ARM_Rx_RccOpen();
  24. //===================================
  25. //Tx,Rx设置为复用引脚,注意:输入要设置浮空输入
  26. GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
  27. GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  28. GPIO_InitStruct.GPIO_Pin = UART_ARM_Tx_Line;
  29. GPIO_Init(UART_ARM_Tx_Port,&GPIO_InitStruct);
  30. //==
  31. GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  32. GPIO_InitStruct.GPIO_Pin = UART_ARM_Rx_Line;
  33. GPIO_Init(UART_ARM_Rx_Port,&GPIO_InitStruct);
  34. //===================================
  35. //引脚重映射
  36. UART_ARM_Remap();
  37. //===================================
  38. UART_ARM_RccOpen(); //打开串口时钟
  39. USART_DeInit(UART_ARM_Periph); //初始化为默认值
  40. USART_InitStructure.USART_BaudRate = 115200; //波特率
  41. USART_InitStructure.USART_WordLength = USART_WordLength_8b; //8位数据
  42. USART_InitStructure.USART_StopBits = USART_StopBits_1; //1位停止位
  43. USART_InitStructure.USART_Parity = USART_Parity_No; //无校验
  44. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //双工
  45. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无协议控制
  46. USART_Init(UART_ARM_Periph,&USART_InitStructure); //初始化
  47. USART_Cmd(UART_ARM_Periph,ENABLE);
  48. //===================================
  49. //打开串口中断
  50. USART_ClearITPendingBit(UART_ARM_Periph,USART_IT_RXNE); //先清掉中断标志位
  51. USART_ClearITPendingBit(UART_ARM_Periph,USART_IT_TXE); //先清掉中断标志位
  52. USART_ITConfig(UART_ARM_Periph,USART_IT_RXNE,ENABLE); //打开串口接收中断
  53. //===================================
  54. //对中断进行初始化
  55. NVIC_InitStruct.NVIC_IRQChannel = UART_ARM_IRQ; //中断号
  56. NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = UART_ARM_PPriority; //抢占级
  57. NVIC_InitStruct.NVIC_IRQChannelSubPriority = UART_ARM_SPriority; //响应级
  58. NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; //打开该中断
  59. NVIC_Init(&NVIC_InitStruct);
  60. //缓冲区初始化
  61. //===================================
  62. UART_Rev_WriteInex=0;
  63. UART_Rev_ReadIndex=0;
  64. UART_Send_WriteIndex=0;
  65. UART_Send_ReadIndex=0;
  66. UART_SendingFlag=0;
  67. return 1;
  68. }
  69. unsigned int u16cnttest =0;
  70. void UART_Tick(void)
  71. {
  72. unsigned int i;
  73. static unsigned char UART_Rev_Data[100]={0};
  74. static unsigned int UART_Rev_DataIndex=0;
  75. //============================================================================
  76. //查询是否有发送任务
  77. if(UART_SendingFlag==0)
  78. {
  79. // if ( UartBusTime < 300) { //避免上行下行干扰
  80. // return;
  81. // }
  82. if(UART_Send_WriteIndex!=UART_Send_ReadIndex)
  83. {
  84. UART_SendingFlag=0xFF;
  85. i=UART_Send_ReadIndex;
  86. UART_Send_ReadIndex++;
  87. if(UART_Send_ReadIndex>=UART_BUFSIZE) UART_Send_ReadIndex=0;
  88. USART_SendData(UART_ARM_Periph, UART_Send_Buf[i]);
  89. USART_ITConfig(UART_ARM_Periph,USART_IT_TXE,ENABLE); //打开串口发送中断
  90. }
  91. }
  92. // if ( Bus_SendStart ) {
  93. // return;
  94. // }
  95. //============================================================================
  96. if(UART_Rev_WriteInex!=UART_Rev_ReadIndex)
  97. {
  98. while(UART_Rev_WriteInex!=UART_Rev_ReadIndex)
  99. {
  100. //======================================================
  101. if(UART_Rev_Buf[UART_Rev_ReadIndex]=='$')
  102. {
  103. UART_Rev_DataIndex=0;
  104. UART_Rev_Data[0]='$';
  105. }
  106. else if(UART_Rev_Buf[UART_Rev_ReadIndex]=='#')
  107. {
  108. UART_Rev_Data[UART_Rev_DataIndex]='#';
  109. UART_Rev_NewInfo(UART_Rev_Data);
  110. UART_Rev_DataIndex=0;
  111. }
  112. else
  113. {
  114. UART_Rev_Data[UART_Rev_DataIndex]=UART_Rev_Buf[UART_Rev_ReadIndex];
  115. }
  116. UART_Rev_DataIndex++;
  117. if(UART_Rev_DataIndex>=100) UART_Rev_DataIndex=0;
  118. //======================================================
  119. UART_Rev_ReadIndex++;
  120. if(UART_Rev_ReadIndex>=UART_BUFSIZE) UART_Rev_ReadIndex=0;
  121. }
  122. }
  123. }
  124. void UART_Send(unsigned char *pdata,unsigned short len)
  125. {
  126. while(len>0)
  127. {
  128. UART_Send_Buf[UART_Send_WriteIndex]=*pdata;
  129. UART_Send_WriteIndex++;
  130. if(UART_Send_WriteIndex>=UART_BUFSIZE)
  131. UART_Send_WriteIndex=0;
  132. pdata++;
  133. len--;
  134. }
  135. }
  136. void UART_ARM_IRQ_Handler()
  137. {
  138. unsigned int i;
  139. //处理接收中断
  140. //============================================
  141. if(USART_GetITStatus(UART_ARM_Periph, USART_IT_RXNE) != RESET)
  142. {
  143. UART_Rev_Buf[UART_Rev_WriteInex]=USART_ReceiveData(UART_ARM_Periph);
  144. UART_Rev_WriteInex++;
  145. if(UART_Rev_WriteInex>=UART_BUFSIZE) UART_Rev_WriteInex=0;
  146. }
  147. //============================================
  148. //处理发送中断
  149. if(USART_GetITStatus(UART_ARM_Periph, USART_IT_TXE) != RESET)
  150. {
  151. if(UART_Send_ReadIndex!=UART_Send_WriteIndex)
  152. {
  153. i=UART_Send_ReadIndex;
  154. UART_Send_ReadIndex++;
  155. if(UART_Send_ReadIndex>=UART_BUFSIZE) UART_Send_ReadIndex=0;
  156. USART_SendData(UART_ARM_Periph, UART_Send_Buf[i]);
  157. }
  158. else
  159. {
  160. UART_SendingFlag=0;
  161. USART_ITConfig(UART_ARM_Periph,USART_IT_TXE,DISABLE); //关闭串口发送中断
  162. }
  163. }
  164. }