diff --git a/.settings/com.st.stm32cube.ide.mcu.sfrview.prefs b/.settings/com.st.stm32cube.ide.mcu.sfrview.prefs new file mode 100644 index 0000000..98a69fc --- /dev/null +++ b/.settings/com.st.stm32cube.ide.mcu.sfrview.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +sfrviewstate={"fFavorites"\:{"fLists"\:{}},"fProperties"\:{"fNodeProperties"\:{}}} diff --git a/.vscode/settings.json b/.vscode/settings.json index 59e7728..445181a 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -40,7 +40,9 @@ "servo_reg_map.h": "c", "servo_driver.h": "c", "servo_package_process.h": "c", - "tjc_screen.h": "c" + "tjc_screen.h": "c", + "dma.h": "c", + "random": "c" }, "C_Cpp.clang_format_path": "C:\\Users\\sunlight\\.vscode\\extensions\\ms-vscode.cpptools-1.21.6-win32-x64\\LLVM\\bin\\clang-format.exe", "C_Cpp.formatting": "clangFormat", diff --git a/Core/Inc/usart.h b/Core/Inc/usart.h index 2bfae13..d06f4be 100644 --- a/Core/Inc/usart.h +++ b/Core/Inc/usart.h @@ -40,8 +40,10 @@ extern UART_HandleTypeDef huart2; extern UART_HandleTypeDef huart3; -/* USER CODE BEGIN Private defines */ + +/* USER CODE BEGIN Private defines */ +extern DMA_HandleTypeDef hdma_usart3_rx; /* USER CODE END Private defines */ void MX_UART4_Init(void); diff --git a/Core/Src/stm32f4xx_it.c b/Core/Src/stm32f4xx_it.c index 560c41e..34095c7 100644 --- a/Core/Src/stm32f4xx_it.c +++ b/Core/Src/stm32f4xx_it.c @@ -280,7 +280,7 @@ void USART2_IRQHandler(void) void USART3_IRQHandler(void) { /* USER CODE BEGIN USART3_IRQn 0 */ - + /* USER CODE END USART3_IRQn 0 */ HAL_UART_IRQHandler(&huart3); /* USER CODE BEGIN USART3_IRQn 1 */ diff --git a/Core/Src/usart.c b/Core/Src/usart.c index 6b114f9..2fa6ca3 100644 --- a/Core/Src/usart.c +++ b/Core/Src/usart.c @@ -1,3 +1,5 @@ +/* + /* USER CODE BEGIN Header */ /** ****************************************************************************** @@ -129,7 +131,7 @@ void MX_USART3_UART_Init(void) /* USER CODE END USART3_Init 1 */ huart3.Instance = USART3; - huart3.Init.BaudRate = 115200; + huart3.Init.BaudRate = 1000000; huart3.Init.WordLength = UART_WORDLENGTH_8B; huart3.Init.StopBits = UART_STOPBITS_1; huart3.Init.Parity = UART_PARITY_NONE; diff --git a/Usr/core.c b/Usr/core.c index dc1675f..7263bfd 100644 --- a/Usr/core.c +++ b/Usr/core.c @@ -2,34 +2,34 @@ * @Author: sunlight 2524828700@qq.com * @Date: 2024-09-12 21:05:22 * @LastEditors: sunlight 2524828700@qq.com - * @LastEditTime: 2024-09-20 21:27:51 + * @LastEditTime: 2024-09-23 13:22:31 * @FilePath: \auxiliary_addition\Usr\opration\core.c * @Description: 代码核心运行 */ #include "core.h" -#include "time_slice/time_slice.h" -#include "tim.h" #include "./Processer/tjc_screen_process.h" #include "./Processer/tjc_screen_receive.h" #include "module/feite_servo/servo_driver.h" #include "module/feite_servo/servo_package_process.h" #include "module/feite_servo/servo_reg_map.h" +#include "tim.h" +#include "time_slice/time_slice.h" #include "usart.h" #include "zgpio.h" static uint32_t ticktime_sleep; - +static uint8_t data = 1000; void core_init(void) { HAL_TIM_Base_Start_IT(&htim2); tjc_process_init(); + // HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, SET); servo_uart_init(&huart3); + servo_drive_single(4, kRegServoAcc, W_DATA, 200, 1); + servo_drive_single(4, kRegServoRunSpeed, W_DATA, 1000, 1); } - +static int i = 0; void core_loop(void) { - - - if (GetFlag(tjc_process)) { tjc_processe(); ClearFlag(tjc_process); @@ -39,13 +39,18 @@ void core_loop(void) { ClearFlag(debug_light); } - if (GetFlag(low_power)) { - // Power_SleepMode(); - servo_control_single(Get_Servo(STS_small_L), kRegServoTargetPos_map, -1000);//测试程序 - //Power_StopMode(); - //Power_StandByMode(); - ClearFlag(low_power); - } + if (GetFlag(low_power)) { + // Power_SleepMode(); + servo_drive_single(4, kRegServoTargetPos, W_DATA,&i, 1); // 测试程序 + if (i > 2000) + i -= 50; + else + i += 50; + + // Power_StopMode(); + // Power_StandByMode(); + ClearFlag(low_power); + } // printf("printf\n"); } @@ -54,6 +59,5 @@ void core_main() { core_init(); while (1) { core_loop(); - } } diff --git a/Usr/module/feite_servo/need.txt b/Usr/module/feite_servo/need.txt index 632d031..50f3a5f 100644 --- a/Usr/module/feite_servo/need.txt +++ b/Usr/module/feite_servo/need.txt @@ -52,7 +52,7 @@ // 同步和单纯写是只写一次 - +9.20 上面全部省略 新的思路 @@ -110,6 +110,25 @@ 运行时间 bit11为和 位置校准 bit10位 来区分正负 + +9.21 +问题3 发送和接收指令包的处理 +发送包缺乏校验和数据可能是导致现在驱动不了舵机的原因 +接收指令包利用DMA接收,涉及到一个dma中断的处理, +网上的大部分是利用串口空闲中断处理,这样DMA中断在接收数据处理方面就没多大作用; +所以采用DMA的半中断的方式(不采用全中断是害怕溢出),控制DMA接收缓存区的大小来达到接收完从机应答包后就产生DMA中断 + + +问题4 由于同步和非同步的不确定导致指令包参数数据长度不定,而原先的方法是只能用与参数长度为1个字节或者2个字节, +所以需要改变我原先的方法,让参数定长改为参数可变。 +对于我原来的方法, +在判断寄存器传入字节长度的时候判断了一次寄存器, +在判断特殊寄存器的位控制时有又判断了一次寄存器 + + + +9.23 +发先所有的操作都有统一的基础形式 2、控制多个舵机 diff --git a/Usr/module/feite_servo/servo_driver.c b/Usr/module/feite_servo/servo_driver.c index 9043538..0a21ba2 100644 --- a/Usr/module/feite_servo/servo_driver.c +++ b/Usr/module/feite_servo/servo_driver.c @@ -1,22 +1,27 @@ + #include "servo_driver.h" #include "servo_package_process.h" static servo_obj_t servo[servo_amount] = { - {STS_small_L}, {STS_small_M}, {STS_small_R}, {STS_large_L}, {STS_large_R}, + {STS_small_L}, {STS_small_M}, {STS_small_R}, {STS_large_R}, {STS_large_Y}, }; +static param_t param; + /** * @description: 获取舵机对象 * @param {uint8_t} servo_id 舵机id * @return {*} */ servo_obj_t* Get_Servo(uint8_t servo_id) { - if (servo_id > STS_large_R || servo_id < STS_small_L) { - printf("Servo_id dose not exist:%d\n", servo_id); - while (1); + if (servo_id > STS_large_Y || servo_id < STS_small_L) { + + while(1){ + printf("Servo_id dose not exist:%d\n", servo_id); + } } - - return &servo[servo_id]; - printf("Servo id : %d\n", servo_id); +printf("Servo id : %d\n", servo_id); + //return &servo[servo_id]; + } /** @@ -26,21 +31,23 @@ servo_obj_t* Get_Servo(uint8_t servo_id) { * @param {int32_t} param 传入数据 * @return {*} */ -void servo_drive_single(servo_obj_t* servo, uint8_t function, int32_t param, uint8_t cmd) { - if (cmd != W_DATA || cmd != REG_W_DATA) { - printf("write cmd error :%d", cmd); +void servo_drive_single(uint8_t id, uint8_t addr, uint8_t cmd, int16_t *param_data, uint8_t param_count) { + + param.addr = addr; + param.data = param_data; + param.count = param_count; + + if (!(cmd == W_DATA || cmd == REG_W_DATA)) { + printf("write cmd error :%02X", cmd); return; } - servo->reg = function; - servo->data = param; - servo->cmd = cmd; - Write_oprete(servo); + Write_oprete(id, cmd, ¶m); } -void servo_drive_multi(servo_obj_t* servo, uint8_t function, int32_t param) { - servo->reg = function; - servo->data = param; - servo->cmd = SYC_W_DATA; - Write_oprete(servo); -} +// void servo_drive_multi(servo_obj_t* servo, uint8_t function, int32_t param) { +// servo->reg = function; +// servo->data = param; +// servo->cmd = SYC_W_DATA; +// Write_oprete(servo); +// } diff --git a/Usr/module/feite_servo/servo_driver.h b/Usr/module/feite_servo/servo_driver.h index 637007b..9860172 100644 --- a/Usr/module/feite_servo/servo_driver.h +++ b/Usr/module/feite_servo/servo_driver.h @@ -2,21 +2,29 @@ #include #include #define servo_amount 5 + +typedef struct{ + uint8_t addr; + uint8_t data_len; + uint8_t special_bit; + uint8_t sign_ed; +}reg_info_t; + + // 舵机对象 typedef struct { uint8_t id; - uint8_t reg; - int32_t data; // 数据 预留一段出来,可能进行多数据的写入 + reg_info_t reg_info; uint8_t cmd; } servo_obj_t; enum { STS_small_L = 0, STS_small_M, - STS_small_R, - STS_large_L, - STS_large_R, + STS_small_R,//right + STS_large_R,//Roll + STS_large_Y, }; -void servo_control_single(servo_obj_t* servo, uint8_t function, int32_t param); +void servo_drive_single(uint8_t id, uint8_t addr, uint8_t cmd, int16_t *param_data, uint8_t param_count); servo_obj_t* Get_Servo(uint8_t servo_id); \ No newline at end of file diff --git a/Usr/module/feite_servo/servo_package_process.c b/Usr/module/feite_servo/servo_package_process.c index 31c3c6f..92782eb 100644 --- a/Usr/module/feite_servo/servo_package_process.c +++ b/Usr/module/feite_servo/servo_package_process.c @@ -1,153 +1,165 @@ - - #include "servo_package_process.h" #include #include +#include "tick.h" #include "servo_driver.h" #include "servo_reg_map.h" static UART_HandleTypeDef* m_uart; +static uint8_t rx_buf[PROCESS_MAX_LEN]; +static uint8_t rx_size; +static uint8_t tx_buf[PROCESS_MAX_LEN]; +static uint8_t tx_send_len; +static bool Idle_Flag = false; -static uint8_t cmd_type; -static cmd_frame_t cmd; -static uint8_t cmd_packet[PACKET_MAX_LEN]; - -static uint8_t reg_map[k_reg_max_map] = { - kRegFirmwareMainVersion, - kRegFirmwareSubVersion, - kRegServoMainVersion, - kRegServoSubVersion, - kRegServoId, - kRegServoBaudRate, - kRegServoDelay, - kRegServoAckLevel, - kRegServoMinAngle, - kRegServoMaxAngle, - kRegServoMaxTemp, - kRegServoMaxVoltage, - kRegServoMinVoltage, - kRegServoMaxTorque, - kRegServoPhase, - kRegServoUnloadCondition, - kRegServoLedAlarmCondition, - kRegServoP, - kRegServoD, - kRegServoI, - kRegServoMinStart, - kRegServoCwDeadZone, - kRegServoCcwDeadZone, - kRegServoProtectCurrent, - kRegServoAngleResolution, - kRegServoCalibration, - kRegServoRunMode, - kRegServoProtectTorque, - kRegServoProtectTime, - kRegServoOverloadTorque, - kRegServoSpeedP, - kRegServoOverloadTime, - kRegServoSpeedI, - kRegServoTorqueSwitch, - kRegServoAcc, - kRegServoTargetPos, - kRegServoRunTime, - kRegServoRunSpeed, - kRegServoTorqueLimit, - kRegServoLockFlag, - kRegServoCurrentPos, - kRegServoCurrentSpeed, - kRegServoCurrentLoad, - kRegServoCurrentVoltage, - kRegServoCurrentTemp, - kRegServoAsyncWriteFlag, - kRegServoStatus, - kRegServoMoveFlag, - kRegServoCurrentCurrent, - kRegServoCheckSpeed, - kRegServoDTime, - kRegServoSpeedUnit, - kRegServoMinSpeedLimit, - kRegServoMaxSpeedLimit, - kRegServoAccLimit, - kRegServoAccMultiple, -}; +static uint8_t cmd_type; +// 我需要一个能携带寄存器信息的变量 +static reg_info_t reg_info; +void SET_IDEL_FLAG(void) { Idle_Flag = true; } +void CLEAR_IDEL_FLAG(void) { Idle_Flag = false; } + +/** + * @description: 舵机串口初始化 + * @param {UART_HandleTypeDef*} uart + * @return {*} + */ void servo_uart_init(UART_HandleTypeDef* uart) { m_uart = uart; } /** * @description: 判断字符串长度 * @param {uint8_t} reg_addr * @return {*} - *///原先由于寄存器不连贯,导致进行判断时变得繁琐 -static uint8_t estimate_data_len(uint8_t reg_addr) { - if (reg_addr > k_reg_max_map) return error; - - switch (reg_addr) { - case kRegServoMinAngle_map: - case kRegServoMaxAngle_map: - case kRegServoMaxTorque_map: - case kRegServoProtectCurrent_map: - case kRegServoCalibration_map: - case kRegServoTargetPos_map: - case kRegServoRunTime_map: - case kRegServoRunSpeed_map: - case kRegServoTorqueLimit_map: - case kRegServoCurrentPos_map: - case kRegServoCurrentSpeed_map: - case kRegServoCurrentLoad_map: - case kRegServoCurrentCurrent_map: - return word; + */ +// 特殊的寄存器只是比原先普通的寄存器多携带 了一些信息 +// 我只需要判断出特殊的寄存器,然后给他们加上多于普通寄存器的信息就行了 +// 普通寄存器默认信息:输入数据是一个字节 不用特殊位处理 + +void reg_distinguish(param_t* param) { + reg_info.addr = (uint8_t)param->addr; + + switch (reg_info.addr) { + case kRegServoCalibration: + reg_info.data_len = word; + reg_info.special_bit = BT_11; + reg_info.sign_ed = 1; + break; + case kRegServoRunTime: + reg_info.data_len = word; + reg_info.special_bit = BT_10; + reg_info.sign_ed = 1; + break; + case kRegServoCurrentPos: + case kRegServoCurrentSpeed: + reg_info.data_len = word; + reg_info.special_bit = BT_15; + reg_info.sign_ed = 1; + break; + case kRegServoTargetPos: + case kRegServoMinAngle: + case kRegServoMaxAngle: + case kRegServoMaxTorque: + case kRegServoProtectCurrent: + case kRegServoRunSpeed: + case kRegServoTorqueLimit: + case kRegServoCurrentLoad: + case kRegServoCurrentCurrent: + reg_info.data_len = word; + reg_info.special_bit = 0; + reg_info.sign_ed = 0; + break; default: - return byte; + reg_info.data_len = byte; + reg_info.special_bit = 0; + reg_info.sign_ed = 0; + break; } } -void send_cmd_packet(cmd_frame_t* cmd) { - memcpy(cmd_packet, cmd->head, sizeof(cmd->head)); - cmd_packet[2] = cmd->id; - cmd_packet[3] = cmd->len; - memcpy(&cmd_packet[4], cmd->param, strlen((const char*)cmd->param)); +static uint8_t check_sum_calculate(uint8_t id, uint8_t len, uint8_t cmd, param_t* param) { + // Check Sum = ~ (ID + Length + Instruction + Parameter1 + ... Parameter N) + uint8_t sum = 0; + sum = id + len + cmd + param->addr; + for (int16_t i = 0; i < param->count; i++) { + sum += (uint8_t)param->data[i]; + } - HAL_UART_Transmit(m_uart, cmd_packet, sizeof(cmd), 10); - // printf("cmd_frame_packet:%02X %02X %02X %02X %02X %02X %02X\n", cmd_packet[0], cmd_packet[1], cmd_packet[2], cmd_packet[3], cmd_packet[4], cmd_packet[5], cmd_packet[6]); + return ~(sum); } +static void high_low_exchange(param_t* param, uint8_t* packet) { + static int16_t trans_buf; + + for (uint8_t i = 0; i < param->count; i++) { + trans_buf = (param->data[i] | (reg_info.sign_ed << reg_info.special_bit)) >> 8; + trans_buf |= param->data[i] << 8; + memcpy(packet + (uint8_t)(i * 2), &trans_buf, sizeof(trans_buf)); + } +} + +void get_rx_size(uint16_t Size) {rx_size = Size - __HAL_DMA_GET_COUNTER(m_uart->hdmarx);} + +void packet_process(uint8_t len) { + cmd_receive_t* receive = (cmd_receive_t*)rx_buf; + uint32_t lasttime = HAL_GetTick(); + + HAL_UARTEx_ReceiveToIdle_DMA(m_uart, rx_buf, sizeof(rx_buf)); + HAL_UART_Transmit(m_uart, tx_buf, len, 10); + // HAL_UART_Receive_DMA(); + + while (!Idle_Flag) { + // 没接收到数据进入等待 + if (pass_time(lasttime) > OVERTIME) { + printf("uart3 receive error\n"); + break; + } + } + + if(receive->status == 0x00 && Idle_Flag){ + printf("servo normal work\n"); + CLEAR_IDEL_FLAG(); + } + + printf("tx:%02X %02X %02X %02X %02X %02X %02X %02X %02X\n", tx_buf[0], tx_buf[1], tx_buf[2], tx_buf[3], tx_buf[4], tx_buf[5], tx_buf[6], tx_buf[7], tx_buf[8]); + printf("tx_send_len: %02X\n", len); +} + +// 初始方案无法确定发送参数的长度,用了一个数组但是导致指令包过大,所以改了个方法 /** - * @description: 写寄存器(只实现了单个数据的写入 不支持多数据) - * @param {servo_obj_t*} servo 舵机对象 - * @param {uint8_t} param_len 数据写入寄存器中的长度 + * @description: + * @param {uint8_t} id + * @param {uint8_t} cmd + * @param {param_t*} param * @return {*} */ -void write_reg(servo_obj_t* servo, uint8_t param_len) { - cmd.head[0] = 0xff; - cmd.head[1] = 0xff; - cmd.id = servo->id; - if (cmd_type) { - cmd.len = param_len + 3; - cmd.param[0] = reg_map[servo->reg]; - cmd.cmd = servo->cmd; +void write_reg(uint8_t id, uint8_t cmd, param_t* param) { + uint8_t check_sum = 0; + uint8_t cmd_packet_len = 0; + cmd_frame_t* cmd_packet = (cmd_frame_t*)tx_buf; // 解决发送数据不是数组问题 + + cmd_packet->head = 0xffff; + cmd_packet->id = id; + if (cmd_type) { + // 参数个数*每个参数长度 = 实际参数长度 + cmd_packet->valid_len = param->count * reg_info.data_len + 3; // cmd + id + check_sum = 3 + cmd_packet->cmd = cmd; + cmd_packet->param[0] = param->addr; // 判断参数数据长度 - if (param_len == byte) { - cmd.param[1] = (uint8_t)servo->data; - } else if (param_len == word) { - // 运行时间和位置校准需要特殊位的处理 - if (kRegServoCalibration_map == servo->reg) { - cmd.param[1] = servo->data & 0xff; // 低八位 - cmd.param[2] = (servo->data >> 8) | (1 << BT_11); // 高八位 - } else if (kRegServoRunTime_map == servo->reg) { - cmd.param[1] = servo->data & 0xff; // 低八位 - cmd.param[2] = (servo->data >> 8) | (1 << BT_10); // 高八位 - } else { - // 对于二进制来说 uint32_t和 int32_t是一样的 只是用最高位来区别正负 - cmd.param[1] = ((uint32_t)servo->data) & 0xff; // 低八位 - cmd.param[2] = ((uint32_t)servo->data) >> 8; // 高八位 - printf("%02X\n", servo->data); - } + if (reg_info.data_len == byte) { + memcpy(&cmd_packet->param[1], param->data, param->count); + } else if (reg_info.data_len == word) { + // 高低位交换,传入的寄存器地址不需要交换 + high_low_exchange(param, &cmd_packet->param[1]); } } - // else 同步写未完成 - send_cmd_packet(&cmd); + // else 同步和非同步无法合并为一个函数 + check_sum = check_sum_calculate(cmd_packet->id, cmd_packet->valid_len, cmd_packet->cmd, param); + memcpy(&cmd_packet->param[param->count * reg_info.data_len + 1], &check_sum, param->count); // 将checksum放入指令包末尾 + + tx_send_len = cmd_packet->valid_len + 4; // 4 = cmd_head[1] + cmd_head[2] + add + check_sum + packet_process(tx_send_len); } /** @@ -155,21 +167,18 @@ void write_reg(servo_obj_t* servo, uint8_t param_len) { * @param {servo_obj_t*} servo 舵机对象 * @return {*} */ -bool Write_oprete(servo_obj_t* servo) { - uint8_t data_len; +bool Write_oprete(uint8_t id, uint8_t cmd, param_t* param) { + reg_distinguish(param); - if (servo->cmd != SYC_W_DATA) + if (cmd != SYC_W_DATA) cmd_type = non_syn; else cmd_type = syn; - data_len = estimate_data_len(servo->reg); + write_reg(id, cmd, param); + return true; +} - if (data_len == error) { - printf("The reg does not exist:%02X", servo->reg); - return false; - } +void Ping_oprete(uint8_t id, uint8_t cmd){ - write_reg(servo, data_len); - return true; } diff --git a/Usr/module/feite_servo/servo_package_process.h b/Usr/module/feite_servo/servo_package_process.h index 4b5ff44..73ca4de 100644 --- a/Usr/module/feite_servo/servo_package_process.h +++ b/Usr/module/feite_servo/servo_package_process.h @@ -4,7 +4,7 @@ #include "servo_driver.h" #include "usart.h" -#define PACKET_MAX_LEN 256 +#define PROCESS_MAX_LEN 256 #define PARAM_LEN 128 #define PING 0x01 @@ -18,6 +18,7 @@ // 特殊处理的寄存器位 #define BT_11 11 #define BT_10 10 +#define BT_15 15 enum data_len { error = 0, @@ -31,18 +32,39 @@ enum write_type { }; typedef struct { - uint8_t head[2]; + uint16_t head; uint8_t id; - uint8_t len; + uint8_t valid_len;//有效数据长度 uint8_t cmd; - uint8_t param[PARAM_LEN]; - uint16_t crc; // 预留 + uint8_t param[];//采用柔性数组来解决参数不定长问题,导致checksum得放在别处 } cmd_frame_t; -// typedef struct { -// uint8_t reg_addr; -// uint8_t data_len; -// } reg_info_t; +typedef struct{ + uint16_t head; + uint8_t id; + uint8_t valid_len;//有效数据长度 + uint8_t status; + uint8_t check_sum; +}cmd_receive_t; + +typedef struct { + uint8_t addr; + int16_t* data; + uint8_t count; +} param_t; + +enum reg_type{ + normal = 0, + data_longeer, + special_bit10, + special_bit11, +}; void servo_uart_init(UART_HandleTypeDef* uart); -bool Write_oprete(servo_obj_t* servo); \ No newline at end of file +bool Write_oprete(uint8_t id, uint8_t cmd, param_t* param); +void reg_distinguish(param_t* param); + +void get_rx_size(uint16_t Size); + +void SET_IDEL_FLAG(void); +void CLEAR_IDEL_FLAG(void); \ No newline at end of file diff --git a/Usr/module/feite_servo/servo_reg_map.h b/Usr/module/feite_servo/servo_reg_map.h index c834e6b..2a0a450 100644 --- a/Usr/module/feite_servo/servo_reg_map.h +++ b/Usr/module/feite_servo/servo_reg_map.h @@ -1,68 +1,6 @@ #pragma once -//寄存器映射 -typedef enum { - kRegFirmwareMainVersion_map = 0, // 固件主版本号 - kRegFirmwareSubVersion_map, // 固件次版本号 - kRegServoMainVersion_map, // 舵机主版本号 - kRegServoSubVersion_map, // 舵机次版本号 - kRegServoId_map, // ID - kRegServoBaudRate_map, // 波特率 - kRegServoDelay_map, // 返回延时 - kRegServoAckLevel_map, // 应答状态级别 - kRegServoMinAngle_map, // 最小角度限制 - kRegServoMaxAngle_map, // 最大角度限制 - kRegServoMaxTemp_map, // 最高温度上限 - kRegServoMaxVoltage_map, // 最高输入电压 - kRegServoMinVoltage_map, // 最低输入电压 - kRegServoMaxTorque_map, // 最大扭矩 - kRegServoPhase_map, // 相位 - kRegServoUnloadCondition_map, // 卸载条件 - kRegServoLedAlarmCondition_map, // LED 报警条件 - kRegServoP_map, // P 比例系 - kRegServoD_map, // D 微分系 - kRegServoI_map, // I - kRegServoMinStart_map, // 最小启动 - kRegServoCwDeadZone_map, // 顺时针不灵敏区 - kRegServoCcwDeadZone_map, // 逆时针不灵敏 - kRegServoProtectCurrent_map, // 保护电流 - kRegServoAngleResolution_map, // 角度分辨 - kRegServoCalibration_map, // 位置校正 BIT11为方向位,表示正负方向,BIT0~10位表示范围0-2047步 - kRegServoRunMode_map, // 运行模式 - kRegServoProtectTorque_map, // 保护扭矩 0->100 ,触发后,需要写入与组转方向相反的位置指令,进行解除 - kRegServoProtectTime_map, // 保护时间 - kRegServoOverloadTorque_map, // 过载扭矩 - kRegServoSpeedP_map, // 速度闭环P比例参数 - kRegServoOverloadTime_map, // 过流保护时间 - kRegServoSpeedI_map, // 速度闭环I积分参数 - kRegServoTorqueSwitch_map, // 扭矩开关 - kRegServoAcc_map, // 加速度 - kRegServoTargetPos_map, // 目标位置 - kRegServoRunTime_map, // 运行时间 - kRegServoRunSpeed_map, // 运行速度 - kRegServoTorqueLimit_map, // 转矩限制 - kRegServoLockFlag_map, // 锁标志 - kRegServoCurrentPos_map, // 当前位置 - kRegServoCurrentSpeed_map, // 当前速度 - kRegServoCurrentLoad_map, // 当前负载 bit10为方向位 - kRegServoCurrentVoltage_map, // 当前电压 - kRegServoCurrentTemp_map, // 当前温度 - kRegServoAsyncWriteFlag_map, // 异步写标志 - kRegServoStatus_map, // 舵机状态 - kRegServoMoveFlag_map, // 移动标志 - kRegServoCurrentCurrent_map, // 当前电流 - kRegServoCheckSpeed_map, // 80 移动检查速度 - kRegServoDTime_map, // 81 D控制时间 - kRegServoSpeedUnit_map, // 82 速度单位系数 - kRegServoMinSpeedLimit_map, // 83 最小速度限制 - kRegServoMaxSpeedLimit_map, // 84 最大速度限制 - kRegServoAccLimit_map, // 85 加速度限制 - kRegServoAccMultiple_map, // 86 加速度倍数 - k_reg_max_map, -} reg_addr_map; - - //寄存器实际地址 diff --git a/Usr/service/Processer/tjc_screen_process.c b/Usr/service/Processer/tjc_screen_process.c index c1e2cd2..cffd461 100644 --- a/Usr/service/Processer/tjc_screen_process.c +++ b/Usr/service/Processer/tjc_screen_process.c @@ -1,3 +1,11 @@ +/* + * @Author: sunlight 2524828700@qq.com + * @Date: 2024-09-13 11:35:08 + * @LastEditors: sunlight 2524828700@qq.com + * @LastEditTime: 2024-09-23 16:14:59 + * @FilePath: \auxiliary_addition\Usr\service\Processer\tjc_screen_process.c + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ @@ -5,6 +13,7 @@ #include #include +#include #include "tjc_screen_event.h" #include "tjc_screen_page.h" diff --git a/Usr/service/Processer/tjc_screen_receive.c b/Usr/service/Processer/tjc_screen_receive.c index ae15617..9c598c3 100644 --- a/Usr/service/Processer/tjc_screen_receive.c +++ b/Usr/service/Processer/tjc_screen_receive.c @@ -52,19 +52,3 @@ void tjc_date_pack(packet_t* packet) { } -/* - * - * @brief 串口中断回调 - * - */ -void HAL_UART_RxCpltCallback(UART_HandleTypeDef* huart) { - if (huart == &huart2) { - // 接收 - tjc_uart_receive(); - } - - if (huart == &huart2) { - // 重启 - HAL_UART_Receive_IT(huart, &rxCache, 1); - } -} diff --git a/Usr/service/Processer/tjc_screen_receive.h b/Usr/service/Processer/tjc_screen_receive.h index 7157110..e47aa18 100644 --- a/Usr/service/Processer/tjc_screen_receive.h +++ b/Usr/service/Processer/tjc_screen_receive.h @@ -4,7 +4,7 @@ #include "usart.h" #define BUF_MAX_LEN 256 -#define OVERTIME 1 + typedef struct { uint8_t date[BUF_MAX_LEN]; uint16_t len; diff --git a/Usr/stm32itcb.c b/Usr/stm32itcb.c new file mode 100644 index 0000000..5f3ca67 --- /dev/null +++ b/Usr/stm32itcb.c @@ -0,0 +1,36 @@ + +#include + +#include "./Processer/tjc_screen_receive.h" +#include "./module/feite_servo/servo_package_process.h" +#include "usart.h" +static uint8_t rx_cache; + +/* + * + * @brief 串口中断回调 + * + */ +void HAL_UART_RxCpltCallback(UART_HandleTypeDef* huart) { + if (huart == &huart2) { + // 接收 + tjc_uart_receive(); + } + + if (huart == &huart2) { + // 重启 + HAL_UART_Receive_IT(huart, &rx_cache, 1); + } +} + +//空闲中断处理 +void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size){ + if (huart == &huart3) { + get_rx_size(Size); + SET_IDEL_FLAG(); + } + + if (huart == &huart3) { + // 重启 + } +} diff --git a/Usr/stm32itcb.h b/Usr/stm32itcb.h new file mode 100644 index 0000000..7b9637e --- /dev/null +++ b/Usr/stm32itcb.h @@ -0,0 +1 @@ +#pragma once \ No newline at end of file diff --git a/Usr/tick.h b/Usr/tick.h index 083690e..9218d29 100644 --- a/Usr/tick.h +++ b/Usr/tick.h @@ -1,4 +1,6 @@ #pragma once #include +#define OVERTIME 10 + uint32_t pass_time(uint32_t lastime); \ No newline at end of file diff --git a/Usr/time_slice/time_slice.c b/Usr/time_slice/time_slice.c index 8194002..3bc1626 100644 --- a/Usr/time_slice/time_slice.c +++ b/Usr/time_slice/time_slice.c @@ -2,7 +2,7 @@ * @Author: sunlight 2524828700@qq.com * @Date: 2024-09-18 20:58:48 * @LastEditors: sunlight 2524828700@qq.com - * @LastEditTime: 2024-09-20 14:42:35 + * @LastEditTime: 2024-09-21 11:35:50 * @FilePath: \auxiliary_addition\Usr\time_slice\time_slice.c * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE */ diff --git a/auxiliary_addition Debug.cfg b/auxiliary_addition Debug.cfg new file mode 100644 index 0000000..ef37116 --- /dev/null +++ b/auxiliary_addition Debug.cfg @@ -0,0 +1,44 @@ +# This is an genericBoard board with a single STM32F407VETx chip +# +# Generated by STM32CubeIDE +# Take care that such file, as generated, may be overridden without any early notice. Please have a look to debug launch configuration setup(s) + +source [find interface/stlink-dap.cfg] + + +set WORKAREASIZE 0x8000 + +transport select "dapdirect_swd" + +set CHIPNAME STM32F407VETx +set BOARDNAME genericBoard + +# Enable debug when in low power modes +set ENABLE_LOW_POWER 1 + +# Stop Watchdog counters when halt +set STOP_WATCHDOG 1 + +# STlink Debug clock frequency +set CLOCK_FREQ 8000 + +# Reset configuration +# use hardware reset, connect under reset +# connect_assert_srst needed if low power mode application running (WFI...) +reset_config srst_only srst_nogate connect_assert_srst +set CONNECT_UNDER_RESET 1 +set CORE_RESET 0 + +# ACCESS PORT NUMBER +set AP_NUM 0 +# GDB PORT +set GDB_PORT 3333 + + + + + +# BCTM CPU variables + +source [find target/stm32f4x.cfg] + diff --git a/auxiliary_addition Debug.launch b/auxiliary_addition Debug.launch index 08f929e..5af087e 100644 --- a/auxiliary_addition Debug.launch +++ b/auxiliary_addition Debug.launch @@ -30,7 +30,7 @@ - +