From 889f34ae12ea8edb5d7c51797f83bf4cb0173265 Mon Sep 17 00:00:00 2001 From: Robofish <1683502971@qq.com> Date: Sun, 7 Sep 2025 13:54:28 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9can?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 8196 -> 6148 bytes app/code_page/bsp_interface.py | 89 +++++----------------------- assets/User_code/bsp/can.c | 18 ++++++ assets/User_code/bsp/uart.h | 3 + assets/User_code/device/config.yaml | 4 ++ assets/User_code/device/motor.c | 2 +- assets/User_code/device/vofa.h | 2 +- 7 files changed, 42 insertions(+), 76 deletions(-) diff --git a/.DS_Store b/.DS_Store index c3b162386e015bcb7ba930038abcbe6ddfa43eba..448aa90ac79e8c9920f13f8dbf36dd448bbe9bd3 100644 GIT binary patch delta 112 zcmZp1XfcprU|?W$DortDU=RQ@Ie-{Mvv5r;6q~50$jGxXU^g=(&t@KhCdSFfg{Dlt yE_`NVktE|{b`B0fW}r$S5a0$9t{_bt3%@f@=9lpV8Nt8=F%Dz{!{&INIm`g2k`xO7 delta 379 zcmZoMXmOBWU|?W$DortDU;r^WfEYvza8E20o2aMAD6}zPH}hr%jz7$c**Q2SHn1=X zZRTNVVvJ^GNMa~u$YjW2Nb$_cPfp6oPXg%!nkEaR_5Onakj22j!jJ+~SIkg?rmh>8 zy2*Jg4eZ7SItqs7=99m&*o(qVC<`vi%gN762kK;;+|4?@o}0m!A&4O#=$3qj5(Yh> zEd>mz49TcAF#**x)*-n_7)6&SLmtR=42eL$wxd!wdlO CU|fa( diff --git a/app/code_page/bsp_interface.py b/app/code_page/bsp_interface.py index 82c5b19..f04c6d4 100644 --- a/app/code_page/bsp_interface.py +++ b/app/code_page/bsp_interface.py @@ -433,26 +433,6 @@ class bsp_can(BspPeripheralBase): # 生成CAN初始化代码 init_lines = [] - # 初始化发送信号量 - init_lines.append(" // 创建发送信号量,每个CAN通道有3个发送邮箱") - init_lines.append(" for (int i = 0; i < BSP_CAN_NUM; i++) {") - init_lines.append(" tx_semaphore[i] = osSemaphoreNew(CAN_TX_MAILBOX_NUM, CAN_TX_MAILBOX_NUM, NULL);") - init_lines.append(" if (tx_semaphore[i] == NULL) {") - init_lines.append(" // 清理已创建的信号量") - init_lines.append(" for (int j = 0; j < i; j++) {") - init_lines.append(" if (tx_semaphore[j] != NULL) {") - init_lines.append(" osSemaphoreDelete(tx_semaphore[j]);") - init_lines.append(" tx_semaphore[j] = NULL;") - init_lines.append(" }") - init_lines.append(" }") - init_lines.append(" if (queue_mutex != NULL) {") - init_lines.append(" osMutexDelete(queue_mutex);") - init_lines.append(" queue_mutex = NULL;") - init_lines.append(" }") - init_lines.append(" return BSP_ERR;") - init_lines.append(" }") - init_lines.append(" }") - init_lines.append("") # 先设置初始化标志 init_lines.append(" // 先设置初始化标志,以便后续回调注册能通过检查") @@ -503,17 +483,10 @@ class bsp_can(BspPeripheralBase): f" HAL_CAN_ConfigFilter(&hcan{can_num}, &can{can_num}_filter);", f" HAL_CAN_Start(&hcan{can_num});", "", - f" // 注册{instance}发送完成回调(用于释放信号量)", - f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX0_CPLT_CB, BSP_CAN_TxCompleteCallback);", - f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX1_CPLT_CB, BSP_CAN_TxCompleteCallback);", - f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX2_CPLT_CB, BSP_CAN_TxCompleteCallback);", - f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX0_ABORT_CB, BSP_CAN_TxAbortCallback);", - f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX1_ABORT_CB, BSP_CAN_TxAbortCallback);", - f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX2_ABORT_CB, BSP_CAN_TxAbortCallback);", - "", - f" // 注册{instance}接收回调函数", + f" // 自动注册{instance}接收回调函数", f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_RX_FIFO0_MSG_PENDING_CB, BSP_CAN_RxFifo0Callback);", "", + f" // 激活{instance}中断", f" HAL_CAN_ActivateNotification(&hcan{can_num}, CAN_IT_RX_FIFO0_MSG_PENDING | ", f" CAN_IT_TX_MAILBOX_EMPTY); // 激活发送邮箱空中断", "" @@ -543,17 +516,10 @@ class bsp_can(BspPeripheralBase): f" HAL_CAN_ConfigFilter(&hcan1, &can1_filter);", f" HAL_CAN_Start(&hcan1);", "", - f" // 注册CAN1发送完成回调(用于释放信号量)", - f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX0_CPLT_CB, BSP_CAN_TxCompleteCallback);", - f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX1_CPLT_CB, BSP_CAN_TxCompleteCallback);", - f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX2_CPLT_CB, BSP_CAN_TxCompleteCallback);", - f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX0_ABORT_CB, BSP_CAN_TxAbortCallback);", - f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX1_ABORT_CB, BSP_CAN_TxAbortCallback);", - f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX2_ABORT_CB, BSP_CAN_TxAbortCallback);", - "", - f" // 注册CAN1接收回调函数", + f" // 自动注册CAN1接收回调函数", f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_RX_FIFO0_MSG_PENDING_CB, BSP_CAN_RxFifo0Callback);", "", + f" // 激活CAN1中断", f" HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING | ", f" CAN_IT_TX_MAILBOX_EMPTY); // 激活发送邮箱空中断", "" @@ -568,16 +534,10 @@ class bsp_can(BspPeripheralBase): f" HAL_CAN_ConfigFilter(&hcan2, &can1_filter); // 通过 CAN1 配置", f" HAL_CAN_Start(&hcan2);", "", - f" // 注册CAN2发送完成回调(用于释放信号量)", - f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX0_CPLT_CB, BSP_CAN_TxCompleteCallback);", - f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX1_CPLT_CB, BSP_CAN_TxCompleteCallback);", - f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX2_CPLT_CB, BSP_CAN_TxCompleteCallback);", - f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX0_ABORT_CB, BSP_CAN_TxAbortCallback);", - f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX1_ABORT_CB, BSP_CAN_TxAbortCallback);", - f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX2_ABORT_CB, BSP_CAN_TxAbortCallback);", - "", - f" // 注册CAN2接收回调函数", + f" // 自动注册CAN2接收回调函数", f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_RX_FIFO1_MSG_PENDING_CB, BSP_CAN_RxFifo1Callback);", + "", + f" // 激活CAN2中断", f" HAL_CAN_ActivateNotification(&hcan2, CAN_IT_RX_FIFO1_MSG_PENDING | ", f" CAN_IT_TX_MAILBOX_EMPTY); // 激活发送邮箱空中断", "" @@ -608,17 +568,10 @@ class bsp_can(BspPeripheralBase): f" HAL_CAN_ConfigFilter(&hcan1, &can1_filter);", f" HAL_CAN_Start(&hcan1);", "", - f" // 注册CAN1发送完成回调(用于释放信号量)", - f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX0_CPLT_CB, BSP_CAN_TxCompleteCallback);", - f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX1_CPLT_CB, BSP_CAN_TxCompleteCallback);", - f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX2_CPLT_CB, BSP_CAN_TxCompleteCallback);", - f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX0_ABORT_CB, BSP_CAN_TxAbortCallback);", - f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX1_ABORT_CB, BSP_CAN_TxAbortCallback);", - f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX2_ABORT_CB, BSP_CAN_TxAbortCallback);", - "", - f" // 注册CAN1接收回调函数", + f" // 自动注册CAN1接收回调函数", f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_RX_FIFO0_MSG_PENDING_CB, BSP_CAN_RxFifo0Callback);", "", + f" // 激活CAN1中断", f" HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING | ", f" CAN_IT_TX_MAILBOX_EMPTY); // 激活发送邮箱空中断", "" @@ -634,16 +587,10 @@ class bsp_can(BspPeripheralBase): f" HAL_CAN_ConfigFilter(&hcan2, &can1_filter); // 通过 CAN1 配置", f" HAL_CAN_Start(&hcan2);", "", - f" // 注册CAN2发送完成回调(用于释放信号量)", - f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX0_CPLT_CB, BSP_CAN_TxCompleteCallback);", - f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX1_CPLT_CB, BSP_CAN_TxCompleteCallback);", - f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX2_CPLT_CB, BSP_CAN_TxCompleteCallback);", - f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX0_ABORT_CB, BSP_CAN_TxAbortCallback);", - f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX1_ABORT_CB, BSP_CAN_TxAbortCallback);", - f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX2_ABORT_CB, BSP_CAN_TxAbortCallback);", - "", - f" // 注册CAN2接收回调函数", + f" // 自动注册CAN2接收回调函数", f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_RX_FIFO0_MSG_PENDING_CB, BSP_CAN_RxFifo0Callback);", + "", + f" // 激活CAN2中断", f" HAL_CAN_ActivateNotification(&hcan2, CAN_IT_RX_FIFO0_MSG_PENDING | ", f" CAN_IT_TX_MAILBOX_EMPTY); // 激活发送邮箱空中断", "" @@ -661,16 +608,10 @@ class bsp_can(BspPeripheralBase): f" HAL_CAN_ConfigFilter(&hcan1, &can1_filter); // 通过 CAN1 配置", f" HAL_CAN_Start(&hcan{can_num});", "", - f" // 注册{instance}发送完成回调(用于释放信号量)", - f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX0_CPLT_CB, BSP_CAN_TxCompleteCallback);", - f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX1_CPLT_CB, BSP_CAN_TxCompleteCallback);", - f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX2_CPLT_CB, BSP_CAN_TxCompleteCallback);", - f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX0_ABORT_CB, BSP_CAN_TxAbortCallback);", - f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX1_ABORT_CB, BSP_CAN_TxAbortCallback);", - f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX2_ABORT_CB, BSP_CAN_TxAbortCallback);", - "", - f" // 注册{instance}接收回调函数", + f" // 自动注册{instance}接收回调函数", f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_RX_FIFO1_MSG_PENDING_CB, BSP_CAN_RxFifo1Callback);", + "", + f" // 激活{instance}中断", f" HAL_CAN_ActivateNotification(&hcan{can_num}, CAN_IT_RX_FIFO1_MSG_PENDING | ", f" CAN_IT_TX_MAILBOX_EMPTY); // 激活发送邮箱空中断", "" diff --git a/assets/User_code/bsp/can.c b/assets/User_code/bsp/can.c index 5083893..d0376f5 100644 --- a/assets/User_code/bsp/can.c +++ b/assets/User_code/bsp/can.c @@ -243,6 +243,9 @@ static void BSP_CAN_TxAbortCallback(CAN_HandleTypeDef *hcan) { void HAL_CAN_TxMailbox0CompleteCallback(CAN_HandleTypeDef *hcan) { BSP_CAN_t bsp_can = CAN_Get(hcan); if (bsp_can != BSP_CAN_ERR) { + // 自动释放发送信号量 + BSP_CAN_TxCompleteCallback(hcan); + // 调用用户回调 if (CAN_Callback[bsp_can][HAL_CAN_TX_MAILBOX0_CPLT_CB]) CAN_Callback[bsp_can][HAL_CAN_TX_MAILBOX0_CPLT_CB](); } @@ -251,6 +254,9 @@ void HAL_CAN_TxMailbox0CompleteCallback(CAN_HandleTypeDef *hcan) { void HAL_CAN_TxMailbox1CompleteCallback(CAN_HandleTypeDef *hcan) { BSP_CAN_t bsp_can = CAN_Get(hcan); if (bsp_can != BSP_CAN_ERR) { + // 自动释放发送信号量 + BSP_CAN_TxCompleteCallback(hcan); + // 调用用户回调 if (CAN_Callback[bsp_can][HAL_CAN_TX_MAILBOX1_CPLT_CB]) CAN_Callback[bsp_can][HAL_CAN_TX_MAILBOX1_CPLT_CB](); } @@ -259,6 +265,9 @@ void HAL_CAN_TxMailbox1CompleteCallback(CAN_HandleTypeDef *hcan) { void HAL_CAN_TxMailbox2CompleteCallback(CAN_HandleTypeDef *hcan) { BSP_CAN_t bsp_can = CAN_Get(hcan); if (bsp_can != BSP_CAN_ERR) { + // 自动释放发送信号量 + BSP_CAN_TxCompleteCallback(hcan); + // 调用用户回调 if (CAN_Callback[bsp_can][HAL_CAN_TX_MAILBOX2_CPLT_CB]) CAN_Callback[bsp_can][HAL_CAN_TX_MAILBOX2_CPLT_CB](); } @@ -267,6 +276,9 @@ void HAL_CAN_TxMailbox2CompleteCallback(CAN_HandleTypeDef *hcan) { void HAL_CAN_TxMailbox0AbortCallback(CAN_HandleTypeDef *hcan) { BSP_CAN_t bsp_can = CAN_Get(hcan); if (bsp_can != BSP_CAN_ERR) { + // 自动释放发送信号量 + BSP_CAN_TxAbortCallback(hcan); + // 调用用户回调 if (CAN_Callback[bsp_can][HAL_CAN_TX_MAILBOX0_ABORT_CB]) CAN_Callback[bsp_can][HAL_CAN_TX_MAILBOX0_ABORT_CB](); } @@ -275,6 +287,9 @@ void HAL_CAN_TxMailbox0AbortCallback(CAN_HandleTypeDef *hcan) { void HAL_CAN_TxMailbox1AbortCallback(CAN_HandleTypeDef *hcan) { BSP_CAN_t bsp_can = CAN_Get(hcan); if (bsp_can != BSP_CAN_ERR) { + // 自动释放发送信号量 + BSP_CAN_TxAbortCallback(hcan); + // 调用用户回调 if (CAN_Callback[bsp_can][HAL_CAN_TX_MAILBOX1_ABORT_CB]) CAN_Callback[bsp_can][HAL_CAN_TX_MAILBOX1_ABORT_CB](); } @@ -283,6 +298,9 @@ void HAL_CAN_TxMailbox1AbortCallback(CAN_HandleTypeDef *hcan) { void HAL_CAN_TxMailbox2AbortCallback(CAN_HandleTypeDef *hcan) { BSP_CAN_t bsp_can = CAN_Get(hcan); if (bsp_can != BSP_CAN_ERR) { + // 自动释放发送信号量 + BSP_CAN_TxAbortCallback(hcan); + // 调用用户回调 if (CAN_Callback[bsp_can][HAL_CAN_TX_MAILBOX2_ABORT_CB]) CAN_Callback[bsp_can][HAL_CAN_TX_MAILBOX2_ABORT_CB](); } diff --git a/assets/User_code/bsp/uart.h b/assets/User_code/bsp/uart.h index 324b1df..49a758b 100644 --- a/assets/User_code/bsp/uart.h +++ b/assets/User_code/bsp/uart.h @@ -42,6 +42,9 @@ typedef enum { /* Exported functions prototypes -------------------------------------------- */ UART_HandleTypeDef *BSP_UART_GetHandle(BSP_UART_t uart); + +void BSP_UART_IRQHandler(UART_HandleTypeDef *huart); + int8_t BSP_UART_RegisterCallback(BSP_UART_t uart, BSP_UART_Callback_t type, void (*callback)(void)); diff --git a/assets/User_code/device/config.yaml b/assets/User_code/device/config.yaml index 21dd5aa..7472db7 100644 --- a/assets/User_code/device/config.yaml +++ b/assets/User_code/device/config.yaml @@ -213,6 +213,10 @@ devices: dependencies: bsp: ["uart"] component: [] + bsp_requirements: + - type: "uart" + var_name: "BSP_UART_VOFA" # 需要替换的变量名 + description: "用于VOFA数据传输" thread_signals: [] files: header: "vofa.h" diff --git a/assets/User_code/device/motor.c b/assets/User_code/device/motor.c index e71327d..ffea060 100644 --- a/assets/User_code/device/motor.c +++ b/assets/User_code/device/motor.c @@ -18,7 +18,7 @@ /* Exported functions ------------------------------------------------------- */ float MOTOR_GetRotorAbsAngle(const MOTOR_t *motor) { if (motor == NULL) return DEVICE_ERR_NULL; - motor->feedback.rotor_abs_angle; + return motor->feedback.rotor_abs_angle; } float MOTOR_GetRotorSpeed(const MOTOR_t *motor) { diff --git a/assets/User_code/device/vofa.h b/assets/User_code/device/vofa.h index 7eda280..b8f07d9 100644 --- a/assets/User_code/device/vofa.h +++ b/assets/User_code/device/vofa.h @@ -6,7 +6,7 @@ extern "C" { /* Includes ----------------------------------------------------------------- */ #include "bsp/uart.h" -#include ”device/device.h“ +#include "device/device.h" /* Exported constants ------------------------------------------------------- */ /* Exported macro ----------------------------------------------------------- */ /* Exported types ----------------------------------------------------------- */