From aa38e5c1f48e31213ee349aa5cd6f06c85bda70d Mon Sep 17 00:00:00 2001
From: android <android@lingyun.com>
Date: Tue, 25 Jun 2024 21:49:39 +0800
Subject: [PATCH] Add GD32F103RCT6 ADC converter board SDK source code
---
mcu_sdk/gd32f103/rk_eFire/App/Src/app.c | 257 +++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 257 insertions(+), 0 deletions(-)
diff --git a/mcu_sdk/gd32f103/rk_eFire/App/Src/app.c b/mcu_sdk/gd32f103/rk_eFire/App/Src/app.c
new file mode 100644
index 0000000..eafe571
--- /dev/null
+++ b/mcu_sdk/gd32f103/rk_eFire/App/Src/app.c
@@ -0,0 +1,257 @@
+#include "board_common.h"
+
+#include "app.h"
+
+
+
+typedef enum
+{
+ T_I = 1,
+ T_V,
+}DATA_TYPE;
+
+typedef enum
+{
+ I_0 = 0,
+ I_1,
+ I_2,
+ I_3,
+}I_CHANNEL;
+
+typedef enum
+{
+ V_0= 0,
+ V_1,
+ V_2,
+ V_3
+}V_CHANNEL;
+
+#define ADC_CHANNEL_MAX_NUM 10
+#define ADC_SAMPLE_BUFFER_SIZE 20
+
+
+#pragma pack (1)
+
+typedef struct
+{
+ uint8_t header[2]; /* 报文头0xAA 0x55 */
+ uint8_t type; /* 1:电流, 2:电压 */
+ uint8_t channel; /* 通道 */
+ uint16_t crc; /* CRC */
+}RxPacket;
+
+#define RX_PACKET_SIZE sizeof(RxPacket)
+typedef union
+{
+ RxPacket packet;
+ uint8_t buffer[RX_PACKET_SIZE];
+}RxPacket_u;
+
+
+typedef struct
+{
+ uint8_t header[2]; /* 报文头0xAA 0x55 */
+ uint8_t type; /* 1:电流, 2:电压 */
+ uint8_t channel; /* 通道 */
+ uint16_t value; /* 数值 */
+ uint16_t crc; /* CRC */
+}RxPacketRes;
+
+#define RX_PACKET_RES_SIZE sizeof(RxPacketRes)
+typedef union
+{
+ RxPacketRes packet;
+ uint8_t buffer[RX_PACKET_RES_SIZE];
+}RxPacketRes_u;
+
+#pragma pack ()
+
+static uint16_t adcSampleBuffer[ADC_CHANNEL_MAX_NUM][ADC_SAMPLE_BUFFER_SIZE] = {0};
+static bool adcDataReadable = false;
+
+void PrintHex(const unsigned char *buffer, unsigned int len)
+{
+ unsigned int i;
+ PRINTF("\r\n");
+ for(i=0; i<len; i++)
+ {
+ PRINTF("%02x ", buffer[i]);
+ if (i!=0 && ((i+1)%16) == 0)
+ PRINTF("\r\n");
+ }
+ PRINTF("\r\n");
+}
+
+static uint16_t CRC16(const uint8_t *Buf , uint32_t usLen)
+{
+ uint16_t i, j;
+ uint16_t usCrc = 0xFFFF;
+ for ( i = 0 ; i < usLen ; i++ )
+ {
+ usCrc ^= Buf[i];
+ for ( j = 0 ; j < 8 ; j++ )
+ {
+ if ( usCrc & 1 )
+ {
+ usCrc >>=1;
+ usCrc ^=0xA001;
+ }
+ else
+ {
+ usCrc >>= 1;
+ }
+ }
+ }
+ return usCrc;
+}
+
+void ADC_Sample(void)
+{
+ /* 采样adc数据 */
+ ADC_SampleData sampleData;
+ memset(&sampleData, 0x0, sizeof(ADC_SampleData));
+ if (ADC1_ADC_GetSampleData(&sampleData, sizeof(ADC_SampleData)) < 0)
+ return ;
+ /*
+ * 将采样数据存储到指定buffer
+ */
+ static uint8_t bufferIndex = 0;
+ uint8_t channel = 0;
+ for (; channel < ADC_CHANNEL_MAX_NUM; channel++)
+ {
+ adcSampleBuffer[channel][bufferIndex] = sampleData.sampleBuffer[channel];
+ }
+
+ if (bufferIndex < ADC_SAMPLE_BUFFER_SIZE)
+ {
+ bufferIndex++;
+ }
+ else
+ {
+ bufferIndex = 0;
+ adcDataReadable = true; /* buffer已经满,数据可读 */
+ }
+
+}
+
+double RootMeanSquareCalc(uint16_t *data, uint8_t num)
+{
+ double sum = 0;
+ uint8_t i = 0;
+
+ for(; i<num; i++)
+ {
+ sum += data[i] * data[i]; /* 平方和 */
+
+ //PRINTF("%d\r\n", data[i]);
+ }
+
+ return sqrt(sum/num);
+}
+
+
+static void ReportChannelData(DATA_TYPE type, uint8_t ch)
+{
+ double rootMeanSquareVref = RootMeanSquareCalc((uint16_t *)&adcSampleBuffer[0], ADC_SAMPLE_BUFFER_SIZE);
+ PRINTF("ref:%f\r\n", rootMeanSquareVref);
+ double rootMeanSquare = 0.0;
+
+ uint32_t v33 = 2500*4095/(uint16_t)rootMeanSquare;
+ rootMeanSquare = RootMeanSquareCalc((uint16_t *)&adcSampleBuffer[1], ADC_SAMPLE_BUFFER_SIZE);
+ uint32_t v12 = 12*v33*rootMeanSquare/4095;
+ uint32_t vo = 0;
+ uint32_t vi = 0;
+ uint32_t v5 = 0;
+ uint32_t value = 0;
+ switch (type)
+ {
+ case T_I:
+ rootMeanSquare = RootMeanSquareCalc((uint16_t *)&adcSampleBuffer[6+ch], ADC_SAMPLE_BUFFER_SIZE);
+ PRINTF("ADC:%f\r\n", rootMeanSquare);
+ vo = 100*2500*rootMeanSquare/rootMeanSquareVref;
+ value = vo/100;
+ PRINTF("vi:%d\t\ti:%d(0.01mA)\r\n", vo,value);
+ break;
+ case T_V:
+ rootMeanSquare = RootMeanSquareCalc((uint16_t *)&adcSampleBuffer[2+ch], ADC_SAMPLE_BUFFER_SIZE);
+ PRINTF("ADC:%f\r\n", rootMeanSquare);
+ vo = 2500*rootMeanSquare/rootMeanSquareVref;
+ vi = 1000*vo/452; /* vo=0.452 x vi */
+ value = vi;
+ PRINTF("vo:%d\t\tvi:%d(1mV)\r\n", vo, vi);
+ break;
+ }
+
+ RxPacketRes_u resPacket;
+ memset(&resPacket, 0x0, sizeof(RxPacketRes_u));
+ resPacket.packet.header[0] = 0xAA;
+ resPacket.packet.header[1] = 0x55;
+ resPacket.packet.type = type;
+ resPacket.packet.channel = ch;
+ resPacket.packet.value = value;
+ resPacket.packet.crc = CRC16(resPacket.buffer, sizeof(RxPacketRes_u)-2);
+
+ PRINTF("Send:");
+ PrintHex((const unsigned char *)resPacket.buffer, sizeof(RxPacketRes_u));
+ Board_USART2Send(resPacket.buffer, sizeof(RxPacketRes_u));
+}
+
+static int ParserRecvPacket(uint8_t *buffer, uint8_t len, RxPacket_u *data)
+{
+ PRINTF("Receive:");
+ PrintHex((const unsigned char *)buffer, len);
+
+ if (len != sizeof(RxPacket_u))
+ return -1;
+
+ RxPacket_u *packet = (RxPacket_u *)buffer;
+ if (packet->packet.header[0] != 0xAA && packet->packet.header[1] != 0x55)
+ return -1;
+
+ uint16_t crc = packet->packet.crc;
+ uint16_t calCrc = CRC16((const uint8_t *)buffer, RX_PACKET_SIZE-2);
+ if (crc != calCrc)
+ return -1;
+ if (adcDataReadable)
+ ReportChannelData(packet->packet.type, packet->packet.channel);
+
+ return 0;
+}
+
+
+int8_t Board_USART_Process(void)
+{
+ uint8_t u8Rx = 0;
+ uint32_t u32TestTimeOut = jiffies + 5000;
+ uint32_t u32RecvTimeOut = jiffies + 200;
+ const uint8_t u8SendBuffer[32] = "Recv OK\r\n";
+ uint8_t u8RecvBuffer[32] = {0};
+ uint8_t u8Index = 0;
+
+ RxPacket_u data;
+ memset(&data, 0x0, sizeof(RxPacket_u));
+ while(1)
+ {
+ while( !Timeout_Happened(u32RecvTimeOut))
+ {
+ if (!Board_USART2Recv(&u8Rx, 200))
+ {
+ u8RecvBuffer[u8Index] = u8Rx;
+ if (u8Index <= (sizeof(u8RecvBuffer)-1))
+ u8Index++;
+ else
+ break;
+ }
+ }
+
+ if(u8Index > 0)
+ {
+ ParserRecvPacket(u8RecvBuffer, u8Index, &data);
+ }
+ u8Index = 0;
+ memset(u8RecvBuffer, 0, sizeof(u8RecvBuffer));
+ u32RecvTimeOut = jiffies + 200;
+ }
+ return -1;
+}
+
--
Gitblit v1.9.1