25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

159 lines
5.8 KiB

  1. /*****************头文件*************************/
  2. #include "fsl_common.h"
  3. #include "uart_Interrupt.h"
  4. #include "fsl_uart.h"
  5. #include "pin_Init.h"
  6. #include "fsl_gpio.h"
  7. /*****************变量声明*************************/
  8. uint8_t demoRingBuffer[DEMO_RING_BUFFER_SIZE];
  9. uint16_t txIndex; //发送数据计数
  10. uint16_t rxIndex; //接收数据计数
  11. uint16_t UART1rxIndex = 0; //接收数据计数
  12. uint8_t RS485_Buf_Arr[DEMO_RS485_ARR_SIZE]; //RS485缓存数据数组
  13. uint16_t UART2_SendData_len; //记录UART2发送数据长度
  14. uint8_t UART2_SendData_OK; //UART2发送结束标志
  15. uint8_t g_tipString1[] = "\r\n\r\n编码器位置\t";
  16. uint8_t g_tipString2[] = "\t圈数\t";
  17. uint32_t BMQ_Location_Num; //编码器位置
  18. uint32_t BMQ_Circle_Num; //编码器圈数
  19. uint8_t UART2_Buf_Arr[DEMO_UART2_ARR_SIZE]; //RS485缓存数据数组
  20. /*****************UART1初始化*************************/
  21. void UART1_InterrputInit()
  22. {
  23. UART1_InitPins(); //UART1引脚初始化
  24. uart_config_t config; //参数设置
  25. UART_GetDefaultConfig(&config);
  26. config.baudRate_Bps = 2500000u; //设置波特率
  27. config.enableTx = true;
  28. config.enableRx = true;
  29. UART_Init(UART1, &config, SystemCoreClock); //初始化配置
  30. UART_EnableInterrupts(UART1, kUART_RxDataRegFullInterruptEnable | kUART_RxOverrunInterruptEnable); //使能Rx中断
  31. EnableIRQ(UART1_RX_TX_IRQn); //开启中断
  32. }
  33. /*****************UART2初始化*************************/
  34. void UART2_InterrputInit()
  35. {
  36. UART2_InitPins(); //UART2引脚初始化
  37. uart_config_t config; //参数设置
  38. UART_GetDefaultConfig(&config);
  39. config.baudRate_Bps = BOARD_DEBUG_UART_BAUDRATE; //设置波特率
  40. config.enableTx = true;
  41. config.enableRx = true;
  42. UART_Init(DEMO_UART, &config, SystemCoreClock); //初始化配置
  43. UART_EnableInterrupts(DEMO_UART, kUART_RxDataRegFullInterruptEnable | kUART_RxOverrunInterruptEnable); //使能Rx中断
  44. EnableIRQ(UART2_RX_TX_IRQn); //开启中断
  45. }
  46. uint32_t UART1_IRQ_Count;
  47. /*****************UART1中断服务函数**********************/
  48. void UART1_RX_TX_IRQHandler(void)
  49. {
  50. uint16_t data;
  51. UART1_IRQ_Count ++;
  52. UART1_IRQ_Count %= 1000;
  53. if ((kUART_RxDataRegFullFlag | kUART_RxOverrunFlag) & UART_GetStatusFlags(UART1)) //接收到数据标志
  54. {
  55. data = UART_ReadByte(UART1);
  56. if (UART1rxIndex < DEMO_RING_BUFFER_SIZE) //
  57. {
  58. demoRingBuffer[UART1rxIndex] = data;
  59. UART1rxIndex++;
  60. UART1rxIndex %= DEMO_RING_BUFFER_SIZE;
  61. }
  62. }
  63. SDK_ISR_EXIT_BARRIER;
  64. }
  65. uint32_t UART2_IRQ_Count;
  66. /*****************UART2中断服务函数**********************/
  67. void UART2_RX_TX_IRQHandler(void)
  68. {
  69. uint16_t data;
  70. UART2_IRQ_Count ++;
  71. UART2_IRQ_Count %= 1000;
  72. if ((kUART_RxDataRegFullFlag | kUART_RxOverrunFlag) & UART_GetStatusFlags(DEMO_UART)) //接收到数据标志
  73. {
  74. data = UART_ReadByte(DEMO_UART);
  75. if (((rxIndex + 1) % DEMO_RING_BUFFER_SIZE) != txIndex) //
  76. {
  77. demoRingBuffer[rxIndex] = data;
  78. rxIndex++;
  79. rxIndex %= DEMO_RING_BUFFER_SIZE;
  80. }
  81. }
  82. /*将接收到的数据返回*/
  83. if ((kUART_TxDataRegEmptyFlag & UART_GetStatusFlags(DEMO_UART)) && (rxIndex != txIndex)) //发送中断标志
  84. {
  85. UART_WriteByte(DEMO_UART, demoRingBuffer[txIndex]); //发送一帧数据(一个字节,8个数据位)
  86. txIndex++;
  87. txIndex %= DEMO_RING_BUFFER_SIZE;
  88. }
  89. SDK_ISR_EXIT_BARRIER;
  90. }
  91. /**************发送一帧数据*************/
  92. void UART1_sendData()
  93. {
  94. if (UART2_SendData_OK == 1)
  95. {
  96. return;
  97. }
  98. GPIO_PinWrite(GPIOE, 3, 1); //PTE3写
  99. UART_WriteByte(UART1, 0x1A); //发送一帧数据(一个字节,8个数据位)
  100. UART_WriteByte(UART1, 0x2A); //发送一帧数据(一个字节,8个数据位)
  101. while (!(kUART_TxDataRegEmptyFlag & UART_GetStatusFlags(UART1))); //发送中断标志
  102. UART_ClearStatusFlags(UART1, kUART_TransmissionCompleteFlag);
  103. GPIO_PinWrite(GPIOE, 3, 0); //PTE3写
  104. }
  105. /**************UART2发送数据*******************/
  106. void UART2_sendData()
  107. {
  108. UART2_SendData_OK = 1;
  109. if (UART2_SendData_len != 0)
  110. {
  111. UART_WriteBlocking(DEMO_UART, g_tipString1, sizeof(g_tipString1) / sizeof(g_tipString1[0])-1);
  112. for (uint8_t i = 0; i < 6; i++ )
  113. {
  114. UART_WriteByte(DEMO_UART, UART2_Buf_Arr[i]);
  115. while (!(kUART_TxDataRegEmptyFlag & UART_GetStatusFlags(DEMO_UART))); //等待发送结束
  116. UART_ClearStatusFlags(DEMO_UART, kUART_TransmissionCompleteFlag);
  117. }
  118. UART_WriteBlocking(DEMO_UART, g_tipString2, sizeof(g_tipString2) / sizeof(g_tipString2[0])-1);
  119. for (uint8_t i = 0; i < 5; i++ )
  120. {
  121. UART_WriteByte(DEMO_UART, UART2_Buf_Arr[i+6]);
  122. while (!(kUART_TxDataRegEmptyFlag & UART_GetStatusFlags(DEMO_UART))); //等待发送结束
  123. UART_ClearStatusFlags(DEMO_UART, kUART_TransmissionCompleteFlag);
  124. }
  125. }
  126. UART2_SendData_OK = 0;
  127. }
  128. /***************RS485接收数据*********************/
  129. void RS485_Recieve_Data()
  130. {
  131. for (uint8_t i = 0; i < UART1rxIndex; i++ )
  132. {
  133. RS485_Buf_Arr[i] = demoRingBuffer[i];
  134. }
  135. BMQ_Location_Num = (RS485_Buf_Arr[4] << 16) + (RS485_Buf_Arr[3] << 8) + (RS485_Buf_Arr[2]);
  136. UART2_Buf_Arr[0] = (BMQ_Location_Num / 100000) + '0';
  137. UART2_Buf_Arr[1] = (BMQ_Location_Num % 100000 / 10000) + '0';
  138. UART2_Buf_Arr[2] = (BMQ_Location_Num % 10000 / 1000) + '0';
  139. UART2_Buf_Arr[3] = (BMQ_Location_Num % 1000 / 100) + '0';
  140. UART2_Buf_Arr[4] = (BMQ_Location_Num % 100 / 10) + '0';
  141. UART2_Buf_Arr[5] = (BMQ_Location_Num % 10) + '0';
  142. BMQ_Circle_Num = (RS485_Buf_Arr[7] << 8) + (RS485_Buf_Arr[6]);
  143. UART2_Buf_Arr[6] = (BMQ_Circle_Num % 100000 / 10000) + '0';
  144. UART2_Buf_Arr[7] = (BMQ_Circle_Num % 10000 / 1000) + '0';
  145. UART2_Buf_Arr[8] = (BMQ_Circle_Num % 1000 / 100) + '0';
  146. UART2_Buf_Arr[9] = (BMQ_Circle_Num % 100 / 10) + '0';
  147. UART2_Buf_Arr[10] = (BMQ_Circle_Num % 10) + '0';
  148. UART2_SendData_len = UART1rxIndex;
  149. UART1rxIndex = 0;
  150. }