/*****************头文件*************************/ #include "fsl_common.h" #include "uart_Interrupt.h" #include "fsl_uart.h" #include "pin_Init.h" #include "fsl_gpio.h" #include "fsl_pit.h" #include "pit.h" #include "adc_Interrupt.h" /*****************变量声明*************************/ uint8_t demoRingBuffer[DEMO_RING_BUFFER_SIZE]; uint16_t txIndex; //发送数据计数 uint16_t rxIndex; //接收数据计数 uint16_t UART1rxIndex = 0; //接收数据计数 uint8_t RS485_Buf_Arr[DEMO_RS485_ARR_SIZE]; //RS485缓存数据数组 uint16_t UART2_SendData_len; //记录UART2发送数据长度 uint16_t UART2_SendData_OK; //UART2发送结束标志 uint8_t g_tipString1[] = "\r\n\r\n编码器位置\t"; uint8_t g_tipString2[] = "\t电压\t"; uint32_t BMQ_Location_Num; //编码器位置 uint8_t UART2_Buf_Arr[DEMO_UART2_ARR_SIZE]; //RS485缓存数据数组 uint32_t adc_GetValue = 0; //接收母线直流电压值 /*****************UART1初始化*************************/ void UART1_InterrputInit() { UART1_InitPins(); //UART1引脚初始化 uart_config_t config; //参数设置 UART_GetDefaultConfig(&config); config.stopBitCount = kUART_OneStopBit; config.baudRate_Bps = 2500000u; //设置波特率 config.enableTx = true; config.enableRx = true; UART_Init(UART1, &config, SystemCoreClock); //初始化配置 UART_EnableInterrupts(UART1, kUART_RxDataRegFullInterruptEnable | kUART_RxOverrunInterruptEnable); //使能Rx中断 EnableIRQ(UART1_RX_TX_IRQn); //开启中断 } /*****************UART2初始化*************************/ void UART2_InterrputInit() { UART2_InitPins(); //UART2引脚初始化 uart_config_t config; //参数设置 UART_GetDefaultConfig(&config); config.baudRate_Bps = BOARD_DEBUG_UART_BAUDRATE; //设置波特率 config.enableTx = true; config.enableRx = true; UART_Init(DEMO_UART, &config, SystemCoreClock); //初始化配置 UART_EnableInterrupts(DEMO_UART, kUART_RxDataRegFullInterruptEnable | kUART_RxOverrunInterruptEnable); //使能Rx中断 EnableIRQ(UART2_RX_TX_IRQn); //开启中断 } uint32_t UART1_IRQ_Count; /*****************UART1中断服务函数**********************/ void UART1_RX_TX_IRQHandler(void) { uint16_t data; UART1_IRQ_Count ++; UART1_IRQ_Count %= 1000; if ((kUART_RxDataRegFullFlag | kUART_RxOverrunFlag) & UART_GetStatusFlags(UART1)) //接收到数据标志 { data = UART_ReadByte(UART1); if (UART1rxIndex < DEMO_RING_BUFFER_SIZE) // { demoRingBuffer[UART1rxIndex] = data; UART1rxIndex++; UART1rxIndex %= DEMO_RING_BUFFER_SIZE; } } UART2_SendData_len = UART1rxIndex; SDK_ISR_EXIT_BARRIER; } uint32_t UART2_IRQ_Count; /*****************UART2中断服务函数**********************/ void UART2_RX_TX_IRQHandler(void) { uint16_t data; UART2_IRQ_Count ++; UART2_IRQ_Count %= 1000; if ((kUART_RxDataRegFullFlag | kUART_RxOverrunFlag) & UART_GetStatusFlags(DEMO_UART)) //接收到数据标志 { data = UART_ReadByte(DEMO_UART); if (((rxIndex + 1) % DEMO_RING_BUFFER_SIZE) != txIndex) // { demoRingBuffer[rxIndex] = data; rxIndex++; rxIndex %= DEMO_RING_BUFFER_SIZE; } } /*将接收到的数据返回*/ if ((kUART_TxDataRegEmptyFlag & UART_GetStatusFlags(DEMO_UART)) && (rxIndex != txIndex)) //发送中断标志 { UART_WriteByte(DEMO_UART, demoRingBuffer[txIndex]); //发送一帧数据(一个字节,8个数据位) txIndex++; txIndex %= DEMO_RING_BUFFER_SIZE; } SDK_ISR_EXIT_BARRIER; } /**************发送一帧数据*************/ void UART1_sendData() { // if (UART2_SendData_OK == 1) // { // return; // } UART2_SendData_OK ++; UART2_SendData_OK %= 100; GPIO_PinWrite(GPIOE, 3, 1); //PTE3写 UART_WriteByte(UART1, 0x1A); //发送一帧数据(一个字节,8个数据位) UART_WriteByte(UART1, 0x2A); //发送一帧数据(一个字节,8个数据位) while (!(kUART_TxDataRegEmptyFlag & UART_GetStatusFlags(UART1))); //发送中断标志 UART_ClearStatusFlags(UART1, kUART_TransmissionCompleteFlag); GPIO_PinWrite(GPIOE, 3, 0); //PTE3写 } /**************UART2发送数据*******************/ void UART2_sendData() { if (UART2_SendData_len != 0) { UART_WriteBlocking(DEMO_UART, g_tipString1, sizeof(g_tipString1) / sizeof(g_tipString1[0])-1); for (uint8_t i = 0; i < 6; i++ ) { UART_WriteByte(DEMO_UART, UART2_Buf_Arr[i]); while (!(kUART_TxDataRegEmptyFlag & UART_GetStatusFlags(DEMO_UART))); //等待发送结束 UART_ClearStatusFlags(DEMO_UART, kUART_TransmissionCompleteFlag); } UART_WriteBlocking(DEMO_UART, g_tipString2, sizeof(g_tipString2) / sizeof(g_tipString2[0])-1); for (uint8_t i = 0; i < 6; i++ ) { UART_WriteByte(DEMO_UART, UART2_Buf_Arr[i+6]); while (!(kUART_TxDataRegEmptyFlag & UART_GetStatusFlags(DEMO_UART))); //等待发送结束 UART_ClearStatusFlags(DEMO_UART, kUART_TransmissionCompleteFlag); } } } /***************RS485接收数据*********************/ void RS485_Recieve_Data() { // for (uint8_t i = 0; i < UART1rxIndex; i++ ) // { // RS485_Buf_Arr[i] = demoRingBuffer[i]; // } // BMQ_Location_Num = (RS485_Buf_Arr[4] << 16) + (RS485_Buf_Arr[3] << 8) + (RS485_Buf_Arr[2]); if (demoRingBuffer[0] != 0x1A) { return; } BMQ_Location_Num = (demoRingBuffer[4] << 16) + (demoRingBuffer[3] << 8) + (demoRingBuffer[2]); UART2_Buf_Arr[0] = (BMQ_Location_Num / 100000) + '0'; UART2_Buf_Arr[1] = (BMQ_Location_Num % 100000 / 10000) + '0'; UART2_Buf_Arr[2] = (BMQ_Location_Num % 10000 / 1000) + '0'; UART2_Buf_Arr[3] = (BMQ_Location_Num % 1000 / 100) + '0'; UART2_Buf_Arr[4] = (BMQ_Location_Num % 100 / 10) + '0'; UART2_Buf_Arr[5] = (BMQ_Location_Num % 10) + '0'; } /*************刷新电压数据******************/ void ADC16_Recieve_Data() { adc_GetValue = adc_ReturnValue(); UART2_Buf_Arr[6] = (adc_GetValue / 100000) + '0'; UART2_Buf_Arr[7] = (adc_GetValue % 100000 / 10000) + '0'; UART2_Buf_Arr[8] = (adc_GetValue % 10000 / 1000) + '0'; UART2_Buf_Arr[9] = (adc_GetValue % 1000 / 100) + '0'; UART2_Buf_Arr[10] = (adc_GetValue % 100 / 10) + '0'; UART2_Buf_Arr[11] = (adc_GetValue % 10) + '0'; } void PIT0_IRQHandler() { PIT_ClearStatusFlags(PIT, DEMO_PIT_CHANNEL, kPIT_TimerFlag); //清除中断标志 UART1_sendData(); //UART1发送 UART1rxIndex = 0; //GPIO_PortToggle(GPIOA, 1 << 15); }