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 + +/* 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 + +#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 + +#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