diff --git a/usrc/main.cpp b/usrc/main.cpp index 2db733b..d664845 100644 --- a/usrc/main.cpp +++ b/usrc/main.cpp @@ -13,6 +13,8 @@ #include "subboards/subboard60_inlet_and_outlet_module/subboard60_inlet_and_outlet_module_board.h" #include "subboards/subboard70_incubation_turntable/subboard70_incubation_turntable.hpp" #include "subboards/subboard70_incubation_turntable/subboard70_incubation_turntable_board.h" +#include "subboards/subboard80_cliptip/subboard80_cliptip.hpp" +#include "subboards/subboard80_cliptip/subboard80_cliptip_board.h" // @@ -40,6 +42,11 @@ static void board_init() { case 70: // 孵化转盘 subboard70_incubation_turntable_board_init(); break; + + case 80: + subboard80_cliptip_board_init(); + break; + default: common_hardware_init(); break; @@ -58,6 +65,10 @@ static void board_post_init() { case 70: // 孵化转盘 Subboard70IncubationTurntable::ins()->initialize(); break; + case 80: + Subboard80Cliptip::ins()->initialize(); + break; + default: break; } diff --git a/usrc/public_service/gins.c b/usrc/public_service/gins.c index 50206a8..9d3567c 100644 --- a/usrc/public_service/gins.c +++ b/usrc/public_service/gins.c @@ -2,32 +2,43 @@ #include "main.h" -TIM_HandleTypeDef htim6; -TIM_HandleTypeDef htim7; -CAN_HandleTypeDef hcan1; -UART_HandleTypeDef huart1; -UART_HandleTypeDef huart3; -DMA_HandleTypeDef *hdma_usart1_rx; -DMA_HandleTypeDef *hdma_usart3_rx; -DMA_HandleTypeDef *hdma_usart3_tx; +DEFINE_GLOBAL(CAN_HandleTypeDef, hcan1); -DMA_HandleTypeDef hdma1_stream1; -DMA_HandleTypeDef hdma2_stream2; -DMA_HandleTypeDef hdma1_stream3; +DEFINE_GLOBAL(TIM_HandleTypeDef, htim1); +DEFINE_GLOBAL(TIM_HandleTypeDef, htim6); +DEFINE_GLOBAL(TIM_HandleTypeDef, htim7); -extern DMA_HandleTypeDef* hdma_usart3_rx; -extern DMA_HandleTypeDef* hdma_usart3_tx; +DEFINE_GLOBAL(UART_HandleTypeDef, huart1); +DEFINE_GLOBAL(UART_HandleTypeDef, huart2); +DEFINE_GLOBAL(UART_HandleTypeDef, huart3); +DEFINE_GLOBAL(UART_HandleTypeDef, huart4); -SPI_HandleTypeDef hspi1; +DEFINE_GLOBAL(DMA_HandleTypeDef, hdma1_stream1); +DEFINE_GLOBAL(DMA_HandleTypeDef, hdma1_stream2); +DEFINE_GLOBAL(DMA_HandleTypeDef, hdma1_stream3); +DEFINE_GLOBAL(DMA_HandleTypeDef, hdma1_stream5); +DEFINE_GLOBAL(DMA_HandleTypeDef, hdma1_stream6); +DEFINE_GLOBAL(DMA_HandleTypeDef, hdma2_stream1); +DEFINE_GLOBAL(DMA_HandleTypeDef, hdma2_stream2); // used by common board +DEFINE_GLOBAL(DMA_HandleTypeDef, hdma2_stream3); +DEFINE_GLOBAL(DMA_HandleTypeDef, hdma2_stream7); +DEFINE_GLOBAL(DMA_HandleTypeDef, hdma3_stream1); +DEFINE_GLOBAL(DMA_HandleTypeDef, hdma3_stream2); +DEFINE_GLOBAL(DMA_HandleTypeDef, hdma3_stream3); +DEFINE_GLOBAL(DMA_HandleTypeDef, hdma4_stream1); +DEFINE_GLOBAL(DMA_HandleTypeDef, hdma4_stream2); +DEFINE_GLOBAL(DMA_HandleTypeDef, hdma4_stream3); -bool htim6_enable; -bool htim7_enable; -bool htim11_enable = true; -bool hcan1_enable; -bool huart1_enable; -bool huart3_enable; -bool hdma1_stream1_enable; -bool hdma2_stream2_enable; -bool hdma1_stream3_enable; +DEFINE_GLOBAL(SPI_HandleTypeDef, hspi1); -bool hspi1_enable; +/*********************************************************************************************************************** + * PTR * + ***********************************************************************************************************************/ +DEFINE_GLOBAL_PTR(DMA_HandleTypeDef, hdma_usart1_rx); +DEFINE_GLOBAL_PTR(DMA_HandleTypeDef, hdma_usart1_tx); +DEFINE_GLOBAL_PTR(DMA_HandleTypeDef, hdma_usart2_rx); +DEFINE_GLOBAL_PTR(DMA_HandleTypeDef, hdma_usart2_tx); +DEFINE_GLOBAL_PTR(DMA_HandleTypeDef, hdma_usart3_rx); +DEFINE_GLOBAL_PTR(DMA_HandleTypeDef, hdma_usart3_tx); +DEFINE_GLOBAL_PTR(DMA_HandleTypeDef, hdma_usart4_rx); +DEFINE_GLOBAL_PTR(DMA_HandleTypeDef, hdma_usart4_tx); diff --git a/usrc/public_service/gins.h b/usrc/public_service/gins.h index 70ae900..ee9d6fe 100644 --- a/usrc/public_service/gins.h +++ b/usrc/public_service/gins.h @@ -8,30 +8,64 @@ extern "C" { #endif -extern TIM_HandleTypeDef htim6; -extern TIM_HandleTypeDef htim7; -extern TIM_HandleTypeDef htim11; -extern CAN_HandleTypeDef hcan1; -extern UART_HandleTypeDef huart1; -extern UART_HandleTypeDef huart3; -extern DMA_HandleTypeDef hdma1_stream1; -extern DMA_HandleTypeDef hdma2_stream2; // used by common board -extern DMA_HandleTypeDef hdma1_stream3; -extern SPI_HandleTypeDef hspi1; - -extern DMA_HandleTypeDef* hdma_usart3_rx; -extern DMA_HandleTypeDef* hdma_usart3_tx; - -extern bool htim6_enable; -extern bool htim7_enable; -extern bool htim11_enable; -extern bool hcan1_enable; -extern bool huart1_enable; -extern bool huart3_enable; -extern bool hdma1_stream1_enable; -extern bool hdma2_stream2_enable; // used by common board -extern bool hdma1_stream3_enable; -extern bool hspi1_enable; +#define EXTERN_GLOBAL(type, name) \ + extern type name; \ + extern bool name##_enable; + +#define EXTERN_GLOBAL_PTR(type, name) extern type* name; + +#define DEFINE_GLOBAL(type, name) \ + type name; \ + bool name##_enable; + +#define DEFINE_GLOBAL_PTR(type, name) type* name; + +/*********************************************************************************************************************** + * GLOBAL * + ***********************************************************************************************************************/ + +EXTERN_GLOBAL(CAN_HandleTypeDef, hcan1); + +EXTERN_GLOBAL(TIM_HandleTypeDef, htim1); +EXTERN_GLOBAL(TIM_HandleTypeDef, htim6); +EXTERN_GLOBAL(TIM_HandleTypeDef, htim7); + +EXTERN_GLOBAL(UART_HandleTypeDef, huart1); +EXTERN_GLOBAL(UART_HandleTypeDef, huart2); +EXTERN_GLOBAL(UART_HandleTypeDef, huart3); +EXTERN_GLOBAL(UART_HandleTypeDef, huart4); + +EXTERN_GLOBAL(DMA_HandleTypeDef, hdma1_stream1); +EXTERN_GLOBAL(DMA_HandleTypeDef, hdma1_stream2); +EXTERN_GLOBAL(DMA_HandleTypeDef, hdma1_stream3); +EXTERN_GLOBAL(DMA_HandleTypeDef, hdma1_stream5); +EXTERN_GLOBAL(DMA_HandleTypeDef, hdma1_stream6); +EXTERN_GLOBAL(DMA_HandleTypeDef, hdma2_stream1); +EXTERN_GLOBAL(DMA_HandleTypeDef, hdma2_stream2); // used by common board +EXTERN_GLOBAL(DMA_HandleTypeDef, hdma2_stream3); +EXTERN_GLOBAL(DMA_HandleTypeDef, hdma2_stream7); +EXTERN_GLOBAL(DMA_HandleTypeDef, hdma3_stream1); +EXTERN_GLOBAL(DMA_HandleTypeDef, hdma3_stream2); +EXTERN_GLOBAL(DMA_HandleTypeDef, hdma3_stream3); +EXTERN_GLOBAL(DMA_HandleTypeDef, hdma4_stream1); +EXTERN_GLOBAL(DMA_HandleTypeDef, hdma4_stream2); +EXTERN_GLOBAL(DMA_HandleTypeDef, hdma4_stream3); + +EXTERN_GLOBAL(SPI_HandleTypeDef, hspi1); + +/*********************************************************************************************************************** + * PTR * + ***********************************************************************************************************************/ + +EXTERN_GLOBAL_PTR(DMA_HandleTypeDef, hdma_usart1_rx); +EXTERN_GLOBAL_PTR(DMA_HandleTypeDef, hdma_usart1_tx); +EXTERN_GLOBAL_PTR(DMA_HandleTypeDef, hdma_usart2_rx); +EXTERN_GLOBAL_PTR(DMA_HandleTypeDef, hdma_usart2_tx); +EXTERN_GLOBAL_PTR(DMA_HandleTypeDef, hdma_usart3_rx); +EXTERN_GLOBAL_PTR(DMA_HandleTypeDef, hdma_usart3_tx); +EXTERN_GLOBAL_PTR(DMA_HandleTypeDef, hdma_usart4_rx); +EXTERN_GLOBAL_PTR(DMA_HandleTypeDef, hdma_usart4_tx); + #ifdef __cplusplus } #endif diff --git a/usrc/public_service/stm32irq.c b/usrc/public_service/stm32irq.c index 3142d60..ce4456f 100644 --- a/usrc/public_service/stm32irq.c +++ b/usrc/public_service/stm32irq.c @@ -42,15 +42,13 @@ void DebugMon_Handler(void) {} * IRQ * ***********************************************************************************************************************/ -void DMA1_Stream1_IRQHandler(void) { - if (hdma1_stream1_enable) HAL_DMA_IRQHandler(&hdma1_stream1); -} -void DMA2_Stream2_IRQHandler(void) { - if (hdma2_stream2_enable) HAL_DMA_IRQHandler(&hdma2_stream2); -} -void DMA1_Stream3_IRQHandler(void) { - if (hdma1_stream3_enable) HAL_DMA_IRQHandler(&hdma1_stream3); -} +void DMA1_Stream1_IRQHandler(void) { HAL_DMA_IRQHandler(&hdma1_stream1); } +void DMA2_Stream2_IRQHandler(void) { HAL_DMA_IRQHandler(&hdma2_stream2); } +void DMA1_Stream3_IRQHandler(void) { HAL_DMA_IRQHandler(&hdma1_stream3); } +void DMA2_Stream7_IRQHandler(void) { HAL_DMA_IRQHandler(&hdma2_stream7); } +void DMA1_Stream5_IRQHandler(void) { HAL_DMA_IRQHandler(&hdma1_stream5); } +void DMA1_Stream6_IRQHandler(void) { HAL_DMA_IRQHandler(&hdma1_stream6); } + void CAN1_TX_IRQHandler(void) { if (hcan1_enable) HAL_CAN_IRQHandler(&hcan1); } @@ -64,8 +62,12 @@ void CAN1_SCE_IRQHandler(void) { if (hcan1_enable) HAL_CAN_IRQHandler(&hcan1); } // 定时器 + +extern TIM_HandleTypeDef htim11; + void TIM1_TRG_COM_TIM11_IRQHandler(void) { - if (htim11_enable) HAL_TIM_IRQHandler(&htim11); + HAL_TIM_IRQHandler(&htim11); + if (htim1_enable) HAL_TIM_IRQHandler(&htim1); } void TIM6_DAC_IRQHandler(void) { @@ -75,12 +77,11 @@ void TIM7_IRQHandler(void) { if (htim7_enable) HAL_TIM_IRQHandler(&htim7); } // 串口 -void USART1_IRQHandler(void) { - if (huart1_enable) HAL_UART_IRQHandler(&huart1); -} -void USART3_IRQHandler(void) { - if (huart3_enable) HAL_UART_IRQHandler(&huart3); -} +void USART1_IRQHandler(void) { HAL_UART_IRQHandler(&huart1); } +void USART2_IRQHandler(void) { HAL_UART_IRQHandler(&huart2); } +void USART3_IRQHandler(void) { HAL_UART_IRQHandler(&huart3); } +void UART4_IRQHandler(void) { HAL_UART_IRQHandler(&huart4); } + /*********************************************************************************************************************** * EXT * ***********************************************************************************************************************/ diff --git a/usrc/subboards/subboard80_cliptip/pri_board.h b/usrc/subboards/subboard80_cliptip/pri_board.h new file mode 100644 index 0000000..47c2aed --- /dev/null +++ b/usrc/subboards/subboard80_cliptip/pri_board.h @@ -0,0 +1,51 @@ +#pragma once + +/*********************************************************************************************************************** + * 板载扩展IO * + ***********************************************************************************************************************/ + +#define EXT_INPUT_IO0 PinNull +#define EXT_INPUT_IO1 PinNull +#define EXT_INPUT_IO2 PinNull +#define EXT_INPUT_IO3 PinNull +#define EXT_INPUT_IO4 PinNull + +#define EXT_INPUT_IO0_MIRROR true +#define EXT_INPUT_IO1_MIRROR true +#define EXT_INPUT_IO2_MIRROR true +#define EXT_INPUT_IO3_MIRROR true +#define EXT_INPUT_IO4_MIRROR true + +/*********************************************************************************************************************** + * 转盘电机 * + ***********************************************************************************************************************/ +#define TMC_MOTOR_SPI hspi1 + +#define MOTOR1_CSN PA4 +#define MOTOR1_ENN PE3 +#define MOTOR1_SPI_MODE_SELECT PinNull +#define MOTOR1_nFREEZE_IO PE12 +#define MOTOR1_nRESET_IO PinNull +#define MOTOR1_SUB_IC_ENN_IO PE11 + +#define MOTOR1_REFL PD2 +#define MOTOR1_REFR PD1 +#define MOTOR1_REFL_MIRROR true +#define MOTOR1_REFR_MIRROR true + +#define MOTOR1_MOTOR_SHAFT false // +#define MOTOR1_MOTOR_ONE_CIRCLE_PULSE 80 // 3600 = 93圈, 3600/93 = 38.70967741935484 +#define MOTOR1_MOTOR_ONE_CIRCLE_PULSE_DENOMINATOR 1 // +#define MOTOR1_STEPMOTOR_IHOLD 1 +#define MOTOR1_STEPMOTOR_IRUN 8 +#define MOTOR1_STEPMOTOR_IHOLDDELAY 100 +#define MOTOR1_STEPMOTOR_IGLOBALSCALER 1 +#define MOTOR1_MOTOR_DEFAULT_ACC 300 +#define MOTOR1_MOTOR_DEFAULT_DEC 300 +#define MOTOR1_MOTOR_DEFAULT_VELOCITY 500 +#define MOTOR1_MIN_D 0 +#define MOTOR1_MAX_D 0 +#define MOTOR1_MOTOR_RUN_TO_ZERO_SPEED 100 +#define MOTOR1_MOTOR_RUN_TO_ZERO_DEC 300 +#define MOTOR1_MOTOR_LOOK_ZERO_EDGE_SPEED 50 +#define MOTOR1_MOTOR_LOOK_ZERO_EDGE_DEC 600 diff --git a/usrc/subboards/subboard80_cliptip/subboard80_cliptip.cpp b/usrc/subboards/subboard80_cliptip/subboard80_cliptip.cpp new file mode 100644 index 0000000..6d21b0c --- /dev/null +++ b/usrc/subboards/subboard80_cliptip/subboard80_cliptip.cpp @@ -0,0 +1,146 @@ +#include "subboard80_cliptip.hpp" +extern "C" { +#include "subboard80_cliptip_board.h" +} +#include "pri_board.h" +#include "public_service/public_service.hpp" +#include "sdk/components/mini_servo_motor/feite_servo_motor.hpp" +#include "sdk/components/mini_servo_motor/mini_servo_motor_ctrl_module.hpp" +#include "sdk/components/sensors/m3078/m3078_code_scaner.hpp" +#include "sdk/components/step_motor_ctrl_module/step_motor_ctrl_module.hpp" +#include "sdk/components/tmc/ic/ztmc4361A.hpp" +#include "sdk\components\pipette_module\pipette_ctrl_module_v2.hpp" + +#define TAG "ShakeModule" + +using namespace iflytop; + +static ZGPIO IO[5]; + +Subboard80Cliptip::Subboard80Cliptip(/* args */) {} +Subboard80Cliptip::~Subboard80Cliptip() {} +int32_t Subboard80Cliptip::getmoduleId(int off) { return zdevice_id_mgr_get_device_id() + off; } +Subboard80Cliptip *Subboard80Cliptip::ins() { + static Subboard80Cliptip instance; + return &instance; +} +/*********************************************************************************************************************** + * PRI * + ***********************************************************************************************************************/ +int32_t Subboard80Cliptip::getid(int32_t *id) { + *id = getmoduleId(0); + return 0; +} +int32_t Subboard80Cliptip::module_xxx_reg(int32_t param_id, bool read, int32_t &val) { return err::kmodule_not_find_reg; } +int32_t Subboard80Cliptip::board_read_ext_io(int32_t ioindex, int32_t *val) { + if (ioindex < 0 || ioindex >= ZARRAY_SIZE(IO)) { + return err::kparam_out_of_range; + } + *val = IO[ioindex].getState(); + + return 0; +} +int32_t Subboard80Cliptip::board_write_ext_io(int32_t ioindex, int32_t val) { return 0; } + +int32_t Subboard80Cliptip::board_read_muti_io(int32_t *val) { + for (int i = 0; i < ZARRAY_SIZE(IO); i++) { + *val |= IO[i].getState() << i; + } + return 0; +} + +/*********************************************************************************************************************** + * IMPL * + ***********************************************************************************************************************/ +void Subboard80Cliptip::initialize() { + IO[0].initAsInput(EXT_INPUT_IO0, ZGPIO::kMode_nopull, ZGPIO::kIRQ_noIrq, EXT_INPUT_IO0_MIRROR); + IO[1].initAsInput(EXT_INPUT_IO1, ZGPIO::kMode_nopull, ZGPIO::kIRQ_noIrq, EXT_INPUT_IO1_MIRROR); + IO[2].initAsInput(EXT_INPUT_IO2, ZGPIO::kMode_nopull, ZGPIO::kIRQ_noIrq, EXT_INPUT_IO2_MIRROR); + IO[3].initAsInput(EXT_INPUT_IO3, ZGPIO::kMode_nopull, ZGPIO::kIRQ_noIrq, EXT_INPUT_IO3_MIRROR); + IO[4].initAsInput(EXT_INPUT_IO4, ZGPIO::kMode_nopull, ZGPIO::kIRQ_noIrq, EXT_INPUT_IO4_MIRROR); + GService::inst()->getZCanProtocolParser()->registerModule(this); + +#if 1 + + /*********************************************************************************************************************** + * ID1 * + ***********************************************************************************************************************/ + { + static TMC5130 motor; + static StepMotorCtrlModule module; + int subid = 1; + + TMC5130::cfg_t tmc5130cfg = { + .spi = &TMC_MOTOR_SPI, // + .csgpio = MOTOR1_CSN, // + .ennPin = MOTOR1_ENN, // + .spi_mode_select = MOTOR1_SPI_MODE_SELECT, // + }; + motor.initialize(&tmc5130cfg); + motor.setMotorShaft(false); + + static ZGPIO input[2]; + input[0].initAsInput(MOTOR1_REFL /*REFL*/, ZGPIO::kMode_nopull, ZGPIO::kIRQ_noIrq, MOTOR1_REFL_MIRROR); + input[1].initAsInput(MOTOR1_REFR /*REFR*/, ZGPIO::kMode_nopull, ZGPIO::kIRQ_noIrq, MOTOR1_REFR_MIRROR); + + StepMotorCtrlModule::config_t stepcfg = {0}; + StepMotorCtrlModule::create_default_cfg(stepcfg); + + stepcfg.motor_shaft = MOTOR1_MOTOR_SHAFT; + stepcfg.motor_one_circle_pulse = MOTOR1_MOTOR_ONE_CIRCLE_PULSE; + stepcfg.motor_one_circle_pulse_denominator = MOTOR1_MOTOR_ONE_CIRCLE_PULSE_DENOMINATOR; + stepcfg.stepmotor_ihold = MOTOR1_STEPMOTOR_IHOLD; + stepcfg.stepmotor_irun = MOTOR1_STEPMOTOR_IRUN; + stepcfg.stepmotor_iholddelay = MOTOR1_STEPMOTOR_IHOLDDELAY; + stepcfg.stepmotor_iglobalscaler = MOTOR1_STEPMOTOR_IGLOBALSCALER; + stepcfg.motor_default_acc = MOTOR1_MOTOR_DEFAULT_ACC; + stepcfg.motor_default_dec = MOTOR1_MOTOR_DEFAULT_DEC; + stepcfg.motor_default_velocity = MOTOR1_MOTOR_DEFAULT_VELOCITY; + stepcfg.min_d = MOTOR1_MIN_D; + stepcfg.max_d = MOTOR1_MAX_D; + stepcfg.motor_run_to_zero_speed = MOTOR1_MOTOR_RUN_TO_ZERO_SPEED; + stepcfg.motor_run_to_zero_dec = MOTOR1_MOTOR_RUN_TO_ZERO_DEC; + stepcfg.motor_look_zero_edge_speed = MOTOR1_MOTOR_LOOK_ZERO_EDGE_SPEED; + stepcfg.motor_look_zero_edge_dec = MOTOR1_MOTOR_LOOK_ZERO_EDGE_DEC; + + module.initialize(getmoduleId(subid), &motor, input, ZARRAY_SIZE(input), &stepcfg); + GService::inst()->getZCanProtocolParser()->registerModule(&module); + + ZLOGI(TAG, "motor%d readic version %x", subid, motor.readICVersion()); + } + + { + static PipetteModule module; + int subid = 2; + PipetteModule::config_t cfg = { + .limit_ul = 30, + }; + + PipetteModule::hardward_config_t hardwarecfg = { + .uart = &huart2, + .hdma_rx = hdma_usart2_rx, + .hdma_tx = hdma_usart2_tx, + }; + module.initialize(getmoduleId(subid), &cfg, &hardwarecfg); + GService::inst()->getZCanProtocolParser()->registerModule(&module); + } + + { + static M3078CodeScanner codescanner; + int subid = 3; + + static M3078CodeScanner::hardware_config_t cfg = { + .uart = &huart4, + .hdma_rx = nullptr, + .hdma_tx = nullptr, + + .codeReadOkPin = PinNull, + .rstPin = PinNull, + .triggerPin = PD15, + }; + codescanner.initialize(getmoduleId(subid), &cfg); + GService::inst()->getZCanProtocolParser()->registerModule(&codescanner); + } + +#endif +} diff --git a/usrc/subboards/subboard80_cliptip/subboard80_cliptip.hpp b/usrc/subboards/subboard80_cliptip/subboard80_cliptip.hpp new file mode 100644 index 0000000..adf4231 --- /dev/null +++ b/usrc/subboards/subboard80_cliptip/subboard80_cliptip.hpp @@ -0,0 +1,44 @@ +#include +#include + +// +#include "configs/device_id_mgr.hpp" +#include "sdk/chip/chip.hpp" +#include "sdk/os/zos.hpp" +// +#include "sdk\components\step_motor_ctrl_module\step_motor_ctrl_module.hpp" +#include "sdk\components\tmc\ic\ztmc5130.hpp" + +namespace iflytop { +class Subboard80Cliptip : public ZIBoard, public ZIModule { + ENABLE_MODULE(Subboard80Cliptip, kboard, 1); + + private: + /* data */ + + public: + Subboard80Cliptip(/* args */); + ~Subboard80Cliptip(); + + static Subboard80Cliptip *ins(); + + void initialize(); + + public: + /*********************************************************************************************************************** + * ZIModule * + ***********************************************************************************************************************/ + virtual int32_t getid(int32_t *id); + virtual int32_t module_xxx_reg(int32_t param_id, bool read, int32_t &val); + /*********************************************************************************************************************** + * ZIBoard * + ***********************************************************************************************************************/ + virtual int32_t board_read_ext_io(int32_t ioindex, int32_t *val); + virtual int32_t board_write_ext_io(int32_t ioindex, int32_t val); + virtual int32_t board_read_muti_io(int32_t *val); + + private: + int32_t getmoduleId(int off); +}; + +} // namespace iflytop diff --git a/usrc/subboards/subboard80_cliptip/subboard80_cliptip_board.c b/usrc/subboards/subboard80_cliptip/subboard80_cliptip_board.c new file mode 100644 index 0000000..ca9b721 --- /dev/null +++ b/usrc/subboards/subboard80_cliptip/subboard80_cliptip_board.c @@ -0,0 +1,187 @@ +#include "main.h" +#include "public_service/public_service.h" + +/* SPI1 init function */ +static void MX_SPI1_Init(void) { + __HAL_RCC_SPI1_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + + hspi1.Instance = SPI1; + hspi1.Init.Mode = SPI_MODE_MASTER; + hspi1.Init.Direction = SPI_DIRECTION_2LINES; + hspi1.Init.DataSize = SPI_DATASIZE_8BIT; + hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; + hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; + hspi1.Init.NSS = SPI_NSS_SOFT; + hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32; + hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; + hspi1.Init.TIMode = SPI_TIMODE_DISABLE; + hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + hspi1.Init.CRCPolynomial = 10; + if (HAL_SPI_Init(&hspi1) != HAL_OK) { + Error_Handler(); + } + GPIO_InitTypeDef GPIO_InitStruct = {0}; + GPIO_InitStruct.Pin = GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + hspi1_enable = true; +} + +/** + * @brief 移液体枪串口 + */ +static void UART2_Init() { + GPIO_InitTypeDef GPIO_InitStruct = {0}; + + __HAL_RCC_USART2_CLK_ENABLE(); + __HAL_RCC_GPIOD_CLK_ENABLE(); + __HAL_RCC_DMA1_CLK_ENABLE(); + + /*********************************************************************************************************************** + * INIT_UART * + ***********************************************************************************************************************/ + huart2.Instance = USART2; + huart2.Init.BaudRate = 38400; + huart2.Init.WordLength = UART_WORDLENGTH_8B; + huart2.Init.StopBits = UART_STOPBITS_1; + huart2.Init.Parity = UART_PARITY_NONE; + huart2.Init.Mode = UART_MODE_TX_RX; + huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; + huart2.Init.OverSampling = UART_OVERSAMPLING_16; + if (HAL_UART_Init(&huart3) != HAL_OK) { + Error_Handler(); + } + /*********************************************************************************************************************** + * INIT_GPIO * + ***********************************************************************************************************************/ + GPIO_InitStruct.Pin = GPIO_PIN_5 | GPIO_PIN_6; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF7_USART2; + HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); + + /*********************************************************************************************************************** + * INIT DMA * + ***********************************************************************************************************************/ + /* USART2 DMA Init */ + /* USART2_RX Init */ + hdma1_stream5.Instance = DMA1_Stream5; + hdma1_stream5.Init.Channel = DMA_CHANNEL_4; + hdma1_stream5.Init.Direction = DMA_PERIPH_TO_MEMORY; + hdma1_stream5.Init.PeriphInc = DMA_PINC_DISABLE; + hdma1_stream5.Init.MemInc = DMA_MINC_ENABLE; + hdma1_stream5.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; + hdma1_stream5.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; + hdma1_stream5.Init.Mode = DMA_NORMAL; + hdma1_stream5.Init.Priority = DMA_PRIORITY_LOW; + hdma1_stream5.Init.FIFOMode = DMA_FIFOMODE_DISABLE; + if (HAL_DMA_Init(&hdma1_stream5) != HAL_OK) { + Error_Handler(); + } + + __HAL_LINKDMA(&huart2, hdmarx, hdma1_stream5); + + /* USART2_TX Init */ + hdma1_stream6.Instance = DMA1_Stream6; + hdma1_stream6.Init.Channel = DMA_CHANNEL_4; + hdma1_stream6.Init.Direction = DMA_MEMORY_TO_PERIPH; + hdma1_stream6.Init.PeriphInc = DMA_PINC_DISABLE; + hdma1_stream6.Init.MemInc = DMA_MINC_ENABLE; + hdma1_stream6.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; + hdma1_stream6.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; + hdma1_stream6.Init.Mode = DMA_NORMAL; + hdma1_stream6.Init.Priority = DMA_PRIORITY_LOW; + hdma1_stream6.Init.FIFOMode = DMA_FIFOMODE_DISABLE; + if (HAL_DMA_Init(&hdma1_stream6) != HAL_OK) { + Error_Handler(); + } + + __HAL_LINKDMA(&huart2, hdmatx, hdma1_stream6); + + /*********************************************************************************************************************** + * INIT_IRQ * + ***********************************************************************************************************************/ + + HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 5, 0); + HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn); + + HAL_NVIC_SetPriority(DMA1_Stream3_IRQn, 5, 0); + HAL_NVIC_EnableIRQ(DMA1_Stream3_IRQn); + + HAL_NVIC_SetPriority(USART2_IRQn, 5, 0); + HAL_NVIC_EnableIRQ(USART2_IRQn); + + /*********************************************************************************************************************** + * LINK * + ***********************************************************************************************************************/ + hdma_usart2_rx = &hdma1_stream5; + hdma_usart2_tx = &hdma1_stream6; + hdma1_stream5_enable = true; + hdma1_stream6_enable = true; + + huart2_enable = true; +} + +/** + * @brief 扫码枪初始化 + */ +static void UART4_Init() { + GPIO_InitTypeDef GPIO_InitStruct = {0}; + + __HAL_RCC_UART4_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOC_CLK_ENABLE(); + + huart4.Instance = UART4; + huart4.Init.BaudRate = 115200; + huart4.Init.WordLength = UART_WORDLENGTH_8B; + huart4.Init.StopBits = UART_STOPBITS_1; + huart4.Init.Parity = UART_PARITY_NONE; + huart4.Init.Mode = UART_MODE_TX_RX; + huart4.Init.HwFlowCtl = UART_HWCONTROL_NONE; + huart4.Init.OverSampling = UART_OVERSAMPLING_16; + if (HAL_UART_Init(&huart4) != HAL_OK) { + Error_Handler(); + } + + /**UART4 GPIO Configuration + PA0-WKUP ------> UART4_TX + PC11 ------> UART4_RX + */ + GPIO_InitStruct.Pin = GPIO_PIN_0; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF8_UART4; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_11; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF8_UART4; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + /* UART4 interrupt Init */ + HAL_NVIC_SetPriority(UART4_IRQn, 5, 0); + HAL_NVIC_EnableIRQ(UART4_IRQn); + + huart4_enable = true; +} + +/** + * @brief 移液体枪串口 + */ + +void subboard80_cliptip_board_init() { + common_hardware_init(); + MX_SPI1_Init(); + UART2_Init(); // 移动液枪串口初始化 + UART4_Init(); +} diff --git a/usrc/subboards/subboard80_cliptip/subboard80_cliptip_board.h b/usrc/subboards/subboard80_cliptip/subboard80_cliptip_board.h new file mode 100644 index 0000000..420dd2e --- /dev/null +++ b/usrc/subboards/subboard80_cliptip/subboard80_cliptip_board.h @@ -0,0 +1,12 @@ +#pragma once +#include "main.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void subboard80_cliptip_board_init(); + +#ifdef __cplusplus +} +#endif