From 20e0cec93fe3de9d071588da0f851b48e18f640a Mon Sep 17 00:00:00 2001
From: RB <robofish>
Date: Sun, 27 Apr 2025 15:40:56 +0800
Subject: [PATCH] =?UTF-8?q?=E5=8F=88=E6=B7=BB=E5=8A=A0=E4=BA=86=E7=82=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 User/bsp/adc.c         |  14 ++++++
 User/bsp/adc.h         |  20 ++++++++
 User/bsp/i2c.c         | 112 +++++++++++++++++++++++++++++++++++++++++
 User/bsp/i2c.h         |  47 +++++++++++++++++
 User/bsp/uart.c        |  12 ++---
 User/bsp/uart.h        |   6 +--
 User/device/oled_i2c.c |  26 +++++-----
 7 files changed, 214 insertions(+), 23 deletions(-)
 create mode 100644 User/bsp/adc.c
 create mode 100644 User/bsp/adc.h
 create mode 100644 User/bsp/i2c.c
 create mode 100644 User/bsp/i2c.h

diff --git a/User/bsp/adc.c b/User/bsp/adc.c
new file mode 100644
index 0000000..671e93c
--- /dev/null
+++ b/User/bsp/adc.c
@@ -0,0 +1,14 @@
+/* Includes ----------------------------------------------------------------- */
+#include "bsp\adc.h"
+
+#include <adc.h>
+
+/* Private define ----------------------------------------------------------- */
+/* Private macro ------------------------------------------------------------ */
+/* Private typedef ---------------------------------------------------------- */
+/* Private variables -------------------------------------------------------- */
+/* Private function  -------------------------------------------------------- */
+/* Exported functions ------------------------------------------------------- */
+// float BSP_GetAdc(){
+
+// }
diff --git a/User/bsp/adc.h b/User/bsp/adc.h
new file mode 100644
index 0000000..74dff84
--- /dev/null
+++ b/User/bsp/adc.h
@@ -0,0 +1,20 @@
+#pragma once
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ----------------------------------------------------------------- */
+#include <stdint.h>
+
+#include "bsp/bsp.h"
+
+/* Exported constants ------------------------------------------------------- */
+/* Exported macro ----------------------------------------------------------- */
+/* Exported types ----------------------------------------------------------- */
+/* Exported functions prototypes -------------------------------------------- */
+// float BSP_GetAdc();
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/User/bsp/i2c.c b/User/bsp/i2c.c
new file mode 100644
index 0000000..b435f73
--- /dev/null
+++ b/User/bsp/i2c.c
@@ -0,0 +1,112 @@
+/* Includes ----------------------------------------------------------------- */
+#include "bsp\i2c.h"
+
+/* Private define ----------------------------------------------------------- */
+/* Private macro ------------------------------------------------------------ */
+/* Private typedef ---------------------------------------------------------- */
+/* Private variables -------------------------------------------------------- */
+static void (*I2C_Callback[BSP_I2C_NUM][BSP_I2C_CB_NUM])(void);
+
+/* Private function  -------------------------------------------------------- */
+static BSP_I2C_t I2C_Get(I2C_HandleTypeDef *hi2c) {
+  if (hi2c->Instance == I2C1) return BSP_I2C_OLED;
+  /*
+  else if (hi2c->Instance == I2CX)
+                  return BSP_I2C_XXX;
+  */
+  else
+    return BSP_I2C_ERR;
+}
+
+void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c) {
+  BSP_I2C_t bsp_i2c = I2C_Get(hi2c);
+  if (bsp_i2c != BSP_I2C_ERR) {
+    if (I2C_Callback[bsp_i2c][HAL_I2C_MASTER_TX_CPLT_CB])
+      I2C_Callback[bsp_i2c][HAL_I2C_MASTER_TX_CPLT_CB]();
+  }
+}
+
+void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c) {
+  BSP_I2C_t bsp_i2c = I2C_Get(hi2c);
+  if (bsp_i2c != BSP_I2C_ERR) {
+    if (I2C_Callback[bsp_i2c][HAL_I2C_MASTER_RX_CPLT_CB])
+      I2C_Callback[bsp_i2c][HAL_I2C_MASTER_RX_CPLT_CB]();
+  }
+}
+
+void HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *hi2c) {
+  BSP_I2C_t bsp_i2c = I2C_Get(hi2c);
+  if (bsp_i2c != BSP_I2C_ERR) {
+    if (I2C_Callback[bsp_i2c][HAL_I2C_SLAVE_TX_CPLT_CB])
+      I2C_Callback[bsp_i2c][HAL_I2C_SLAVE_TX_CPLT_CB]();
+  }
+}
+
+void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c) {
+  BSP_I2C_t bsp_i2c = I2C_Get(hi2c);
+  if (bsp_i2c != BSP_I2C_ERR) {
+    if (I2C_Callback[bsp_i2c][HAL_I2C_SLAVE_RX_CPLT_CB])
+      I2C_Callback[bsp_i2c][HAL_I2C_SLAVE_RX_CPLT_CB]();
+  }
+}
+
+void HAL_I2C_ListenCpltCallback(I2C_HandleTypeDef *hi2c) {
+  BSP_I2C_t bsp_i2c = I2C_Get(hi2c);
+  if (bsp_i2c != BSP_I2C_ERR) {
+    if (I2C_Callback[bsp_i2c][HAL_I2C_LISTEN_CPLT_CB])
+      I2C_Callback[bsp_i2c][HAL_I2C_LISTEN_CPLT_CB]();
+  }
+}
+
+void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c) {
+  BSP_I2C_t bsp_i2c = I2C_Get(hi2c);
+  if (bsp_i2c != BSP_I2C_ERR) {
+    if (I2C_Callback[bsp_i2c][HAL_I2C_MEM_TX_CPLT_CB])
+      I2C_Callback[bsp_i2c][HAL_I2C_MEM_TX_CPLT_CB]();
+  }
+}
+
+void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c) {
+  BSP_I2C_t bsp_i2c = I2C_Get(hi2c);
+  if (bsp_i2c != BSP_I2C_ERR) {
+    if (I2C_Callback[bsp_i2c][HAL_I2C_MEM_RX_CPLT_CB])
+      I2C_Callback[bsp_i2c][HAL_I2C_MEM_RX_CPLT_CB]();
+  }
+}
+
+void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c) {
+  BSP_I2C_t bsp_i2c = I2C_Get(hi2c);
+  if (bsp_i2c != BSP_I2C_ERR) {
+    if (I2C_Callback[bsp_i2c][HAL_I2C_ERROR_CB])
+      I2C_Callback[bsp_i2c][HAL_I2C_ERROR_CB]();
+  }
+}
+
+void HAL_I2C_AbortCpltCallback(I2C_HandleTypeDef *hi2c) {
+  BSP_I2C_t bsp_i2c = I2C_Get(hi2c);
+  if (bsp_i2c != BSP_I2C_ERR) {
+    if (I2C_Callback[bsp_i2c][HAL_I2C_ABORT_CPLT_CB])
+      I2C_Callback[bsp_i2c][HAL_I2C_ABORT_CPLT_CB]();
+  }
+}
+
+/* Exported functions ------------------------------------------------------- */
+I2C_HandleTypeDef *BSP_I2C_GetHandle(BSP_I2C_t i2c) {
+  switch (i2c) {
+    case BSP_I2C_OLED:
+      return &hi2c1;
+    /*
+    case BSP_I2C_XXX:
+            return &hi2cX;
+    */
+    default:
+      return NULL;
+  }
+}
+
+int8_t BSP_I2C_RegisterCallback(BSP_I2C_t i2c, BSP_I2C_Callback_t type,
+                                void (*callback)(void)) {
+  if (callback == NULL) return BSP_ERR_NULL;
+  I2C_Callback[i2c][type] = callback;
+  return BSP_OK;
+}
diff --git a/User/bsp/i2c.h b/User/bsp/i2c.h
new file mode 100644
index 0000000..5ba76f9
--- /dev/null
+++ b/User/bsp/i2c.h
@@ -0,0 +1,47 @@
+#pragma once
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ----------------------------------------------------------------- */
+#include <i2c.h>
+
+#include "bsp/bsp.h"
+
+/* Exported constants ------------------------------------------------------- */
+/* Exported macro ----------------------------------------------------------- */
+/* Exported types ----------------------------------------------------------- */
+
+/* 要添加使用I2C的新设备,需要先在此添加对应的枚举值 */
+
+/* I2C实体枚举,与设备对应 */
+typedef enum {
+  BSP_I2C_OLED,
+  /* BSP_I2C_XXX,*/
+  BSP_I2C_NUM,
+  BSP_I2C_ERR,
+} BSP_I2C_t;
+
+/* I2C支持的中断回调函数类型,具体参考HAL中定义 */
+typedef enum {
+  HAL_I2C_MASTER_TX_CPLT_CB,
+  HAL_I2C_MASTER_RX_CPLT_CB,
+  HAL_I2C_SLAVE_TX_CPLT_CB,
+  HAL_I2C_SLAVE_RX_CPLT_CB,
+  HAL_I2C_LISTEN_CPLT_CB,
+  HAL_I2C_MEM_TX_CPLT_CB,
+  HAL_I2C_MEM_RX_CPLT_CB,
+  HAL_I2C_ERROR_CB,
+  HAL_I2C_ABORT_CPLT_CB,
+  BSP_I2C_CB_NUM,
+} BSP_I2C_Callback_t;
+
+/* Exported functions prototypes -------------------------------------------- */
+I2C_HandleTypeDef *BSP_I2C_GetHandle(BSP_I2C_t i2c);
+int8_t BSP_I2C_RegisterCallback(BSP_I2C_t i2c, BSP_I2C_Callback_t type,
+                                void (*callback)(void));
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/User/bsp/uart.c b/User/bsp/uart.c
index 331c0fb..c1fecb7 100644
--- a/User/bsp/uart.c
+++ b/User/bsp/uart.c
@@ -9,11 +9,11 @@ static void (*UART_Callback[BSP_UART_NUM][BSP_UART_CB_NUM])(void);
 
 /* Private function  -------------------------------------------------------- */
 static BSP_UART_t UART_Get(UART_HandleTypeDef *huart) {
-  if (huart->Instance == UART1)
+  if (huart->Instance == USART1)
     return BSP_UART_UART1;
-  else if (huart->Instance == UART2)
+  else if (huart->Instance == USART2)
     return BSP_UART_UART2;
-  else if (huart->Instance == UART3)
+  else if (huart->Instance == USART3)
     return BSP_UART_UART3;
   else
     return BSP_UART_ERR;
@@ -103,11 +103,11 @@ void BSP_UART_IRQHandler(UART_HandleTypeDef *huart) {
 
 UART_HandleTypeDef *BSP_UART_GetHandle(BSP_UART_t uart) {
   switch (uart) {
-    case BSP_UART_UART1:
+    case BSP_UART_USART1:
       return &huart1;
-    case BSP_UART_UART2:
+    case BSP_UART_USART2:
       return &huart2;
-    case BSP_UART_UART3:
+    case BSP_UART_USART3:
       return &huart3;
     default:
       return NULL;
diff --git a/User/bsp/uart.h b/User/bsp/uart.h
index 8f25cf6..63446ad 100644
--- a/User/bsp/uart.h
+++ b/User/bsp/uart.h
@@ -17,9 +17,9 @@ extern "C" {
 
 /* UART实体枚举,与设备对应 */
 typedef enum {
-  BSP_UART_UART1,
-  BSP_UART_UART2,
-  BSP_UART_UART3,
+  BSP_UART_USART1,
+  BSP_UART_USART2,
+  BSP_UART_USART3,
   BSP_UART_NUM,
   BSP_UART_ERR,
 } BSP_UART_t;
diff --git a/User/device/oled_i2c.c b/User/device/oled_i2c.c
index 40bb2df..38cf7d0 100644
--- a/User/device/oled_i2c.c
+++ b/User/device/oled_i2c.c
@@ -19,8 +19,18 @@ static struct {
 } dirty_rect = {0, 0, 0, 0, 0};
 
 /* Private function prototypes ---------------------------------------------- */
-static void OLED_WriteCommand(uint8_t cmd);
-static void OLED_WriteData(uint8_t *data, uint16_t size);
+static void OLED_WriteCommand(uint8_t cmd) {
+    uint8_t data[2] = {0x00, cmd};
+    HAL_I2C_Master_Transmit(BSP_I2C_GetHandle(BSP_I2C_OLED), OLED_I2C_ADDR, data, 2, HAL_MAX_DELAY);
+}
+
+static void OLED_WriteData(uint8_t *data, uint16_t size) {
+    uint8_t buffer[size + 1];
+    buffer[0] = 0x40;
+    memcpy(&buffer[1], data, size);
+    HAL_I2C_Master_Transmit(BSP_I2C_GetHandle(BSP_I2C_OLED), OLED_I2C_ADDR, buffer, size + 1, HAL_MAX_DELAY);
+}
+
 static void OLED_MarkDirty(uint8_t x, uint8_t y);
 static void OLED_UpdateDirtyScreen(void);
 
@@ -254,15 +264,3 @@ static void OLED_UpdateDirtyScreen(void) {
 
     dirty_rect.dirty = 0;
 }
-
-static void OLED_WriteCommand(uint8_t cmd) {
-    uint8_t data[2] = {0x00, cmd};
-    HAL_I2C_Master_Transmit(BSP_I2C_GetHandle(BSP_I2C_OLED), OLED_I2C_ADDR, data, 2, HAL_MAX_DELAY);
-}
-
-static void OLED_WriteData(uint8_t *data, uint16_t size) {
-    uint8_t buffer[size + 1];
-    buffer[0] = 0x40;
-    memcpy(&buffer[1], data, size);
-    HAL_I2C_Master_Transmit(BSP_I2C_GetHandle(BSP_I2C_OLED), OLED_I2C_ADDR, buffer, size + 1, HAL_MAX_DELAY);
-}
\ No newline at end of file