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.
 
 
 

193 line
6.5 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. uint32_t flag1; //ADC采集标志位
  24. /*****************UART1初始化*************************/
  25. void UART1_InterrputInit()
  26. {
  27. UART1_InitPins(); //UART1引脚初始化
  28. uart_config_t config; //参数设置
  29. UART_GetDefaultConfig(&config);
  30. config.stopBitCount = kUART_OneStopBit;
  31. config.baudRate_Bps = 2500000u; //设置波特率
  32. config.enableTx = true;
  33. config.enableRx = true;
  34. UART_Init(UART1, &config, SystemCoreClock); //初始化配置
  35. UART_EnableInterrupts(UART1, kUART_RxDataRegFullInterruptEnable | kUART_RxOverrunInterruptEnable); //使能Rx中断
  36. EnableIRQ(UART1_RX_TX_IRQn); //开启中断
  37. }
  38. /*****************UART2初始化*************************/
  39. void UART2_InterrputInit()
  40. {
  41. UART2_InitPins(); //UART2引脚初始化
  42. uart_config_t config; //参数设置
  43. UART_GetDefaultConfig(&config);
  44. config.baudRate_Bps = BOARD_DEBUG_UART_BAUDRATE; //设置波特率
  45. config.enableTx = true;
  46. config.enableRx = true;
  47. UART_Init(DEMO_UART, &config, SystemCoreClock); //初始化配置
  48. UART_EnableInterrupts(DEMO_UART, kUART_RxDataRegFullInterruptEnable | kUART_RxOverrunInterruptEnable); //使能Rx中断
  49. EnableIRQ(UART2_RX_TX_IRQn); //开启中断
  50. }
  51. uint32_t UART1_IRQ_Count;
  52. /*****************UART1中断服务函数**********************/
  53. void UART1_RX_TX_IRQHandler(void)
  54. {
  55. uint16_t data;
  56. UART1_IRQ_Count ++;
  57. UART1_IRQ_Count %= 1000;
  58. if ((kUART_RxDataRegFullFlag | kUART_RxOverrunFlag) & UART_GetStatusFlags(UART1)) //接收到数据标志
  59. {
  60. data = UART_ReadByte(UART1);
  61. if (UART1rxIndex < DEMO_RING_BUFFER_SIZE) //
  62. {
  63. demoRingBuffer[UART1rxIndex] = data;
  64. UART1rxIndex++;
  65. UART1rxIndex %= DEMO_RING_BUFFER_SIZE;
  66. }
  67. }
  68. UART2_SendData_len = UART1rxIndex;
  69. SDK_ISR_EXIT_BARRIER;
  70. }
  71. uint32_t UART2_IRQ_Count;
  72. /*****************UART2中断服务函数**********************/
  73. void UART2_RX_TX_IRQHandler(void)
  74. {
  75. uint16_t data;
  76. UART2_IRQ_Count ++;
  77. UART2_IRQ_Count %= 1000;
  78. if ((kUART_RxDataRegFullFlag | kUART_RxOverrunFlag) & UART_GetStatusFlags(DEMO_UART)) //接收到数据标志
  79. {
  80. data = UART_ReadByte(DEMO_UART);
  81. if (((rxIndex + 1) % DEMO_RING_BUFFER_SIZE) != txIndex) //
  82. {
  83. demoRingBuffer[rxIndex] = data;
  84. rxIndex++;
  85. rxIndex %= DEMO_RING_BUFFER_SIZE;
  86. }
  87. }
  88. /*将接收到的数据返回*/
  89. if ((kUART_TxDataRegEmptyFlag & UART_GetStatusFlags(DEMO_UART)) && (rxIndex != txIndex)) //发送中断标志
  90. {
  91. UART_WriteByte(DEMO_UART, demoRingBuffer[txIndex]); //发送一帧数据(一个字节,8个数据位)
  92. txIndex++;
  93. txIndex %= DEMO_RING_BUFFER_SIZE;
  94. }
  95. SDK_ISR_EXIT_BARRIER;
  96. }
  97. /**************发送一帧数据*************/
  98. void UART1_sendData()
  99. {
  100. UART2_SendData_OK ++;
  101. UART2_SendData_OK %= 100;
  102. GPIO_PinWrite(GPIOE, 3, 1); //PTE3写
  103. UART_WriteByte(UART1, 0x1A); //发送一帧数据(一个字节,8个数据位)
  104. UART_WriteByte(UART1, 0x2A); //发送一帧数据(一个字节,8个数据位)
  105. while (!(kUART_TxDataRegEmptyFlag & UART_GetStatusFlags(UART1))); //发送中断标志
  106. UART_ClearStatusFlags(UART1, kUART_TransmissionCompleteFlag);
  107. GPIO_PinWrite(GPIOE, 3, 0); //PTE3写
  108. }
  109. /**************UART2发送数据*******************/
  110. void UART2_sendData()
  111. {
  112. if (UART2_SendData_len != 0)
  113. {
  114. UART_WriteBlocking(DEMO_UART, g_tipString1, sizeof(g_tipString1) / sizeof(g_tipString1[0])-1);
  115. for (uint8_t i = 0; i < 5; i++ )
  116. {
  117. UART_WriteByte(DEMO_UART, UART2_Buf_Arr[i]);
  118. while (!(kUART_TxDataRegEmptyFlag & UART_GetStatusFlags(DEMO_UART))); //等待发送结束
  119. UART_ClearStatusFlags(DEMO_UART, kUART_TransmissionCompleteFlag);
  120. }
  121. UART_WriteBlocking(DEMO_UART, g_tipString2, sizeof(g_tipString2) / sizeof(g_tipString2[0])-1);
  122. for (uint8_t i = 0; i < 4; i++ )
  123. {
  124. UART_WriteByte(DEMO_UART, UART2_Buf_Arr[i+5]);
  125. while (!(kUART_TxDataRegEmptyFlag & UART_GetStatusFlags(DEMO_UART))); //等待发送结束
  126. UART_ClearStatusFlags(DEMO_UART, kUART_TransmissionCompleteFlag);
  127. }
  128. }
  129. }
  130. /***************RS485接收数据*********************/
  131. void RS485_Recieve_Data()
  132. {
  133. if (demoRingBuffer[0] != 0x1A)
  134. {
  135. return;
  136. }
  137. BMQ_Location_Num = (demoRingBuffer[4] << 16) + (demoRingBuffer[3] << 8) + (demoRingBuffer[2]);
  138. BMQ_Location_Num = BMQ_Location_Num * 3600 / 131071; //放大10倍
  139. UART2_Buf_Arr[0] = (BMQ_Location_Num % 10000 / 1000) + '0';
  140. UART2_Buf_Arr[1] = (BMQ_Location_Num % 1000 / 100) + '0';
  141. UART2_Buf_Arr[2] = (BMQ_Location_Num % 100 / 10) + '0';
  142. UART2_Buf_Arr[3] = '.';
  143. UART2_Buf_Arr[4] = (BMQ_Location_Num % 10) + '0';
  144. }
  145. /*************刷新电压数据******************/
  146. void ADC16_Recieve_Data()
  147. {
  148. if (flag1 != 1)
  149. {
  150. adc_GetValue = adc_ReturnValue();
  151. }
  152. UART2_Buf_Arr[5] = (adc_GetValue % 10000 / 1000) + '0';
  153. UART2_Buf_Arr[6] = '.';
  154. UART2_Buf_Arr[7] = (adc_GetValue % 1000 / 100) + '0';
  155. UART2_Buf_Arr[8] = (adc_GetValue % 100 / 10) + '0';
  156. if (adc_GetValue >= 2000)
  157. {
  158. GPIO_PinWrite(GPIOA, 16, 0);
  159. }
  160. else
  161. {
  162. GPIO_PinWrite(GPIOA, 16, 1);
  163. }
  164. }
  165. /*************定时器中断服务函数******************/
  166. void PIT0_IRQHandler()
  167. {
  168. PIT_ClearStatusFlags(PIT, DEMO_PIT_CHANNEL, kPIT_TimerFlag); //清除中断标志
  169. UART1_sendData(); //UART1发送
  170. UART1rxIndex = 0;
  171. flag1 = GPIO_PinRead(GPIOD, 4);
  172. if (flag1 == 1)
  173. {
  174. GPIO_PinWrite(GPIOA, 15, 1); //ADC采集指示灯关闭
  175. DisableIRQ(ADC0_IRQn); //关闭ADC中断
  176. adc_GetValue = 0; //电压数据置0
  177. }
  178. else
  179. {
  180. GPIO_PinWrite(GPIOA, 15, 0); //ADC采集指示灯开启
  181. EnableIRQ(ADC0_IRQn); //开启ADC中断
  182. }
  183. }