You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

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