diff --git a/.cproject b/.cproject
index 143eaf5..23acfc7 100644
--- a/.cproject
+++ b/.cproject
@@ -24,7 +24,7 @@
-
+
@@ -114,7 +114,7 @@
-
+
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 445181a..b3b8d93 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -42,7 +42,8 @@
"servo_package_process.h": "c",
"tjc_screen.h": "c",
"dma.h": "c",
- "random": "c"
+ "random": "c",
+ "algorithm": "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/Backup/stm32f4xx_it.h.bak b/Core/Inc/Backup/stm32f4xx_it.h.bak
index 602fd56..6158e1b 100644
--- a/Core/Inc/Backup/stm32f4xx_it.h.bak
+++ b/Core/Inc/Backup/stm32f4xx_it.h.bak
@@ -56,6 +56,7 @@ void DebugMon_Handler(void);
void PendSV_Handler(void);
void SysTick_Handler(void);
void RCC_IRQHandler(void);
+void DMA1_Stream1_IRQHandler(void);
void TIM2_IRQHandler(void);
void USART1_IRQHandler(void);
void USART2_IRQHandler(void);
diff --git a/Core/Inc/usart.h b/Core/Inc/usart.h
index d06f4be..2bfae13 100644
--- a/Core/Inc/usart.h
+++ b/Core/Inc/usart.h
@@ -40,10 +40,8 @@ extern UART_HandleTypeDef huart2;
extern UART_HandleTypeDef huart3;
-
-
/* 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/Backup/dma.c.bak b/Core/Src/Backup/dma.c.bak
index d9012a6..0ae4d9e 100644
--- a/Core/Src/Backup/dma.c.bak
+++ b/Core/Src/Backup/dma.c.bak
@@ -41,8 +41,12 @@ void MX_DMA_Init(void)
/* DMA controller clock enable */
__HAL_RCC_DMA2_CLK_ENABLE();
+ __HAL_RCC_DMA1_CLK_ENABLE();
/* DMA interrupt init */
+ /* DMA1_Stream1_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn);
/* DMA2_Stream0_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(DMA2_Stream0_IRQn);
diff --git a/Core/Src/Backup/gpio.c.bak b/Core/Src/Backup/gpio.c.bak
index be8ec94..8f3711b 100644
--- a/Core/Src/Backup/gpio.c.bak
+++ b/Core/Src/Backup/gpio.c.bak
@@ -62,7 +62,7 @@ void MX_GPIO_Init(void)
GPIO_InitStruct.Pin = GPIO_PIN_2;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
/*Configure GPIO pins : PE3 PE6 PE0 PE1 */
@@ -75,7 +75,7 @@ void MX_GPIO_Init(void)
GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
/*Configure GPIO pins : PD0 PD1 PD2 PD3
diff --git a/Core/Src/Backup/stm32f4xx_it.c.bak b/Core/Src/Backup/stm32f4xx_it.c.bak
index 72d18a5..560c41e 100644
--- a/Core/Src/Backup/stm32f4xx_it.c.bak
+++ b/Core/Src/Backup/stm32f4xx_it.c.bak
@@ -58,6 +58,7 @@
extern DMA_HandleTypeDef hdma_adc1;
extern RTC_HandleTypeDef hrtc;
extern TIM_HandleTypeDef htim2;
+extern DMA_HandleTypeDef hdma_usart3_rx;
extern UART_HandleTypeDef huart4;
extern UART_HandleTypeDef huart1;
extern UART_HandleTypeDef huart2;
@@ -218,6 +219,20 @@ void RCC_IRQHandler(void)
}
/**
+ * @brief This function handles DMA1 stream1 global interrupt.
+ */
+void DMA1_Stream1_IRQHandler(void)
+{
+ /* USER CODE BEGIN DMA1_Stream1_IRQn 0 */
+
+ /* USER CODE END DMA1_Stream1_IRQn 0 */
+ HAL_DMA_IRQHandler(&hdma_usart3_rx);
+ /* USER CODE BEGIN DMA1_Stream1_IRQn 1 */
+
+ /* USER CODE END DMA1_Stream1_IRQn 1 */
+}
+
+/**
* @brief This function handles TIM2 global interrupt.
*/
void TIM2_IRQHandler(void)
diff --git a/Core/Src/Backup/usart.c.bak b/Core/Src/Backup/usart.c.bak
index 92bcebb..1b53d17 100644
--- a/Core/Src/Backup/usart.c.bak
+++ b/Core/Src/Backup/usart.c.bak
@@ -28,6 +28,7 @@ UART_HandleTypeDef huart4;
UART_HandleTypeDef huart1;
UART_HandleTypeDef huart2;
UART_HandleTypeDef huart3;
+DMA_HandleTypeDef hdma_usart3_rx;
/* UART4 init function */
void MX_UART4_Init(void)
@@ -99,7 +100,7 @@ void MX_USART2_UART_Init(void)
/* USER CODE END USART2_Init 1 */
huart2.Instance = USART2;
- huart2.Init.BaudRate = 256000;
+ huart2.Init.BaudRate = 1000000;//256000;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;
@@ -128,7 +129,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;
@@ -250,6 +251,25 @@ void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
GPIO_InitStruct.Alternate = GPIO_AF7_USART3;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+ /* USART3 DMA Init */
+ /* USART3_RX Init */
+ hdma_usart3_rx.Instance = DMA1_Stream1;
+ hdma_usart3_rx.Init.Channel = DMA_CHANNEL_4;
+ hdma_usart3_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
+ hdma_usart3_rx.Init.PeriphInc = DMA_PINC_DISABLE;
+ hdma_usart3_rx.Init.MemInc = DMA_MINC_ENABLE;
+ hdma_usart3_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
+ hdma_usart3_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
+ hdma_usart3_rx.Init.Mode = DMA_NORMAL;
+ hdma_usart3_rx.Init.Priority = DMA_PRIORITY_LOW;
+ hdma_usart3_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
+ if (HAL_DMA_Init(&hdma_usart3_rx) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ __HAL_LINKDMA(uartHandle,hdmarx,hdma_usart3_rx);
+
/* USART3 interrupt Init */
HAL_NVIC_SetPriority(USART3_IRQn, 3, 0);
HAL_NVIC_EnableIRQ(USART3_IRQn);
@@ -336,6 +356,9 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
*/
HAL_GPIO_DeInit(GPIOB, GPIO_PIN_10|GPIO_PIN_11);
+ /* USART3 DMA DeInit */
+ HAL_DMA_DeInit(uartHandle->hdmarx);
+
/* USART3 interrupt Deinit */
HAL_NVIC_DisableIRQ(USART3_IRQn);
/* USER CODE BEGIN USART3_MspDeInit 1 */
diff --git a/Core/Src/adc.c b/Core/Src/adc.c
index 6b045a6..c52847c 100644
--- a/Core/Src/adc.c
+++ b/Core/Src/adc.c
@@ -44,7 +44,7 @@ void MX_ADC1_Init(void)
/** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
*/
hadc1.Instance = ADC1;
- hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;
+ hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
hadc1.Init.Resolution = ADC_RESOLUTION_12B;
hadc1.Init.ScanConvMode = DISABLE;
hadc1.Init.ContinuousConvMode = DISABLE;
diff --git a/Core/Src/gpio.c b/Core/Src/gpio.c
index be8ec94..8f3711b 100644
--- a/Core/Src/gpio.c
+++ b/Core/Src/gpio.c
@@ -62,7 +62,7 @@ void MX_GPIO_Init(void)
GPIO_InitStruct.Pin = GPIO_PIN_2;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
/*Configure GPIO pins : PE3 PE6 PE0 PE1 */
@@ -75,7 +75,7 @@ void MX_GPIO_Init(void)
GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
/*Configure GPIO pins : PD0 PD1 PD2 PD3
diff --git a/Core/Src/stm32f4xx_it.c b/Core/Src/stm32f4xx_it.c
index 34095c7..560c41e 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 2fa6ca3..c384029 100644
--- a/Core/Src/usart.c
+++ b/Core/Src/usart.c
@@ -1,5 +1,3 @@
-/*
-
/* USER CODE BEGIN Header */
/**
******************************************************************************
@@ -102,7 +100,7 @@ void MX_USART2_UART_Init(void)
/* USER CODE END USART2_Init 1 */
huart2.Instance = USART2;
- huart2.Init.BaudRate = 256000;
+ huart2.Init.BaudRate = 115200;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;
@@ -131,7 +129,7 @@ void MX_USART3_UART_Init(void)
/* USER CODE END USART3_Init 1 */
huart3.Instance = USART3;
- huart3.Init.BaudRate = 1000000;
+ huart3.Init.BaudRate = 115200;
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 7263bfd..6048272 100644
--- a/Usr/core.c
+++ b/Usr/core.c
@@ -2,7 +2,7 @@
* @Author: sunlight 2524828700@qq.com
* @Date: 2024-09-12 21:05:22
* @LastEditors: sunlight 2524828700@qq.com
- * @LastEditTime: 2024-09-23 13:22:31
+ * @LastEditTime: 2024-09-23 21:37:16
* @FilePath: \auxiliary_addition\Usr\opration\core.c
* @Description: 代码核心运行
*/
@@ -11,7 +11,7 @@
#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_operation.h"
#include "module/feite_servo/servo_reg_map.h"
#include "tim.h"
#include "time_slice/time_slice.h"
@@ -21,17 +21,17 @@ 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);
+ //tjc_process_init();
+ HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, SET);
+ servo_uart_init(&huart2);
- servo_drive_single(4, kRegServoAcc, W_DATA, 200, 1);
- servo_drive_single(4, kRegServoRunSpeed, W_DATA, 1000, 1);
+ // servo_drive_single(1, kRegServoAcc, W_DATA, 200, 1);
+ // servo_drive_single(1, kRegServoRunSpeed, W_DATA, 1000, 1);
}
static int i = 0;
void core_loop(void) {
if (GetFlag(tjc_process)) {
- tjc_processe();
+ //tjc_processe();
ClearFlag(tjc_process);
}
if (GetFlag(debug_light)) {
@@ -41,7 +41,8 @@ void core_loop(void) {
if (GetFlag(low_power)) {
// Power_SleepMode();
- servo_drive_single(4, kRegServoTargetPos, W_DATA,&i, 1); // 测试程序
+ //servo_drive_single(1, kRegServoTargetPos, W_DATA,&i, 1); // 测试程序
+ Ping_operete(1);
if (i > 2000)
i -= 50;
else
diff --git a/Usr/module/feite_servo/need.txt b/Usr/module/feite_servo/need.txt
index 50f3a5f..8415a04 100644
--- a/Usr/module/feite_servo/need.txt
+++ b/Usr/module/feite_servo/need.txt
@@ -128,7 +128,7 @@
9.23
-发先所有的操作都有统一的基础形式
+发先所有的操作都有统一的基础形式,所以对数据包进行统一
2、控制多个舵机
diff --git a/Usr/module/feite_servo/servo_driver.c b/Usr/module/feite_servo/servo_driver.c
index 0a21ba2..71f181c 100644
--- a/Usr/module/feite_servo/servo_driver.c
+++ b/Usr/module/feite_servo/servo_driver.c
@@ -2,27 +2,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_R}, {STS_large_Y},
-};
-static param_t param;
+// static servo_obj_t servo[servo_amount] = {
+// {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_Y || servo_id < STS_small_L) {
+// /**
+// * @description: 获取舵机对象
+// * @param {uint8_t} servo_id 舵机id
+// * @return {*}
+// */
+// servo_obj_t* Get_Servo(uint8_t servo_id) {
+// if (servo_id > STS_large_Y || servo_id < STS_small_L) {
- while(1){
- printf("Servo_id dose not exist:%d\n", servo_id);
- }
- }
-printf("Servo id : %d\n", servo_id);
- //return &servo[servo_id];
+// while(1){
+// printf("Servo_id dose not exist:%d\n", servo_id);
+// }
+// }
+// printf("Servo id : %d\n", servo_id);
+// //return &servo[servo_id];
-}
+// }
/**
* @description: 单个舵机控制
@@ -41,13 +41,7 @@ void servo_drive_single(uint8_t id, uint8_t addr, uint8_t cmd, int16_t *param_da
printf("write cmd error :%02X", cmd);
return;
}
-
- Write_oprete(id, cmd, ¶m);
+
+ Write_operete(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);
-// }
diff --git a/Usr/module/feite_servo/servo_operation.c b/Usr/module/feite_servo/servo_operation.c
new file mode 100644
index 0000000..8b995ee
--- /dev/null
+++ b/Usr/module/feite_servo/servo_operation.c
@@ -0,0 +1,94 @@
+#include "servo_operation.h"
+
+#include
+#include
+#include
+
+static UART_HandleTypeDef* m_uart;
+
+static uint8_t tx_buf[PROCESS_MAX_LEN];
+static uint8_t rx_buf[PROCESS_MAX_LEN];
+static uint8_t tx_send_len;
+
+static uint8_t cmd_type;
+
+static uint8_t check_sum;
+
+// 我需要一个能携带寄存器信息的变量
+static reg_info_t reg_info;
+
+
+
+/**
+ * @description: 舵机串口初始化
+ * @param {UART_HandleTypeDef*} uart
+ * @return {*}
+ */
+void servo_uart_init(UART_HandleTypeDef* uart) { m_uart = uart; }
+
+/**
+ * @description: 写操作
+ * @param {servo_obj_t*} servo 舵机对象
+ * @return {*}
+ */
+bool Write_operete(uint8_t id, uint8_t cmd, param_t* param) {
+ reg_distinguish(param, ®_info);
+
+ if (cmd != SYC_W_DATA)
+ cmd_type = non_syn;
+ else
+ cmd_type = syn;
+
+ write_reg(id, cmd, param);
+ return true;
+}
+
+void Ping_operete(uint8_t id) {
+ cmd_basic_t* cmd_basic = (cmd_basic_t*)tx_buf;
+ cmd_basic->head = 0xffff;
+ cmd_basic->id = id;
+ cmd_basic->valid_len = 0x02;
+ cmd_basic->cmd = PING;
+
+ check_sum = check_sum_calculate(&tx_buf[2], NULL);
+ memcpy(&tx_buf[BASCI_LEN], &check_sum, 1);
+ tx_send_len = BASCI_LEN + 1; // 1 = check_sum
+ packet_process(m_uart, tx_buf, rx_buf, tx_send_len);
+}
+
+// 初始方案无法确定发送参数的长度,用了一个数组但是导致指令包过大,所以改了个方法
+/**
+ * @description:
+ * @param {uint8_t} id
+ * @param {uint8_t} cmd
+ * @param {param_t*} param
+ * @return {*}
+ */
+void write_reg(uint8_t id, uint8_t cmd, param_t* param) {
+ uint8_t param_real_len = param->count * reg_info.data_len; // 参数个数*每个参数长度 = 实际参数长度
+ cmd_basic_t* cmd_basic = (cmd_basic_t*)tx_buf; // 解决发送数据不是数组问题
+ uint8_t* cmd_param = &tx_buf[5];
+
+ cmd_basic->head = 0xffff;
+ cmd_basic->id = id;
+
+ if (cmd_type) {
+ cmd_basic->valid_len = param_real_len + 3; // cmd + id + check_sum = 3
+ cmd_basic->cmd = cmd;
+ cmd_param[0] = param->addr;
+ // 判断参数数据长度
+ if (reg_info.data_len == byte) {
+ memcpy(&cmd_param[1], param->data, param->count);
+ } else if (reg_info.data_len == word) {
+ // 高低位交换,传入的寄存器地址不需要交换
+ high_low_exchange(param, &cmd_param[1], ®_info);
+ }
+ }
+ // else 同步和非同步无法合并为一个函数
+ check_sum = check_sum_calculate(&tx_buf[2], param);
+ // 将checksum放入指令包末尾
+ memcpy(&tx_buf[BASCI_LEN + param_real_len + 1], &check_sum, 1); // tx_buff[5] == addr 1 = addr
+
+ tx_send_len = BASCI_LEN + param_real_len + 2; // 2 = addr + check_sum
+ packet_process(m_uart, tx_buf,rx_buf, tx_send_len);
+}
\ No newline at end of file
diff --git a/Usr/module/feite_servo/servo_operation.h b/Usr/module/feite_servo/servo_operation.h
new file mode 100644
index 0000000..d85b7fa
--- /dev/null
+++ b/Usr/module/feite_servo/servo_operation.h
@@ -0,0 +1,9 @@
+#pragma once
+#include
+#include "servo_package_process.h"
+
+
+
+bool Write_operete(uint8_t id, uint8_t cmd, param_t* param);
+void Ping_operete(uint8_t id);
+void servo_uart_init(UART_HandleTypeDef* uart);
\ 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 92782eb..b6e12f3 100644
--- a/Usr/module/feite_servo/servo_package_process.c
+++ b/Usr/module/feite_servo/servo_package_process.c
@@ -3,29 +3,18 @@
#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;
+#include "tick.h"
+
+
+static uint8_t rx_size;
-static uint8_t cmd_type;
-// 我需要一个能携带寄存器信息的变量
-static reg_info_t reg_info;
+static bool Idle_Flag = false;
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: 判断字符串长度
@@ -36,25 +25,25 @@ void servo_uart_init(UART_HandleTypeDef* uart) { m_uart = uart; }
// 我只需要判断出特殊的寄存器,然后给他们加上多于普通寄存器的信息就行了
// 普通寄存器默认信息:输入数据是一个字节 不用特殊位处理
-void reg_distinguish(param_t* param) {
- reg_info.addr = (uint8_t)param->addr;
+void reg_distinguish(param_t* param, reg_info_t* reg_info) {
+ reg_info->addr = (uint8_t)param->addr;
- switch (reg_info.addr) {
+ switch (reg_info->addr) {
case kRegServoCalibration:
- reg_info.data_len = word;
- reg_info.special_bit = BT_11;
- reg_info.sign_ed = 1;
+ 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;
+ 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;
+ reg_info->data_len = word;
+ reg_info->special_bit = BT_15;
+ reg_info->sign_ed = 1;
break;
case kRegServoTargetPos:
case kRegServoMinAngle:
@@ -65,47 +54,57 @@ void reg_distinguish(param_t* param) {
case kRegServoTorqueLimit:
case kRegServoCurrentLoad:
case kRegServoCurrentCurrent:
- reg_info.data_len = word;
- reg_info.special_bit = 0;
- reg_info.sign_ed = 0;
+ reg_info->data_len = word;
+ reg_info->special_bit = 0;
+ reg_info->sign_ed = 0;
break;
default:
- reg_info.data_len = byte;
- reg_info.special_bit = 0;
- reg_info.sign_ed = 0;
+ reg_info->data_len = byte;
+ reg_info->special_bit = 0;
+ reg_info->sign_ed = 0;
break;
}
}
-static uint8_t check_sum_calculate(uint8_t id, uint8_t len, uint8_t cmd, param_t* param) {
+uint8_t check_sum_calculate(uint8_t* basic, 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];
+ uint16_t i = 0;
+ uint8_t basic_sum = 0;
+ uint8_t sum = 0;
+ for (i = 0; i < BASCI_LEN - 2; i++) {
+ basic_sum += basic[i];
+ }
+
+ if (param != NULL) {
+ sum = basic_sum + param->addr;
+ for (i = 0; i < param->count; i++) {
+ sum += (uint8_t)param->data[i];
+ }
+ } else {
+ sum = basic_sum;
}
return ~(sum);
}
-static void high_low_exchange(param_t* param, uint8_t* packet) {
+void high_low_exchange(param_t* param, uint8_t* packet, reg_info_t* reg_info) {
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] | (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);
+void packet_process(UART_HandleTypeDef* uart, uint8_t* tx, uint8_t* rx, uint8_t len) {
+ cmd_receive_t* receive = (cmd_receive_t*)rx;
+ uint32_t lasttime = HAL_GetTick();
+
+ HAL_UARTEx_ReceiveToIdle_DMA(uart, rx, sizeof(rx));
+ HAL_UART_Transmit(uart, tx, len, 100);
// HAL_UART_Receive_DMA();
while (!Idle_Flag) {
@@ -116,69 +115,15 @@ void packet_process(uint8_t len) {
}
}
- if(receive->status == 0x00 && Idle_Flag){
- printf("servo normal work\n");
- CLEAR_IDEL_FLAG();
+ 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 {uint8_t} id
- * @param {uint8_t} cmd
- * @param {param_t*} param
- * @return {*}
- */
-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 (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 同步和非同步无法合并为一个函数
- 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);
+ printf("tx:%s\n", tx);
+ printf("tx_send_len: %02X\n", len);
}
-/**
- * @description: 写操作
- * @param {servo_obj_t*} servo 舵机对象
- * @return {*}
- */
-bool Write_oprete(uint8_t id, uint8_t cmd, param_t* param) {
- reg_distinguish(param);
-
- if (cmd != SYC_W_DATA)
- cmd_type = non_syn;
- else
- cmd_type = syn;
- write_reg(id, cmd, param);
- return true;
-}
-
-void Ping_oprete(uint8_t id, uint8_t cmd){
-}
+// void get_rx_size(uint16_t Size) { rx_size = Size - __HAL_DMA_GET_COUNTER(m_uart->hdmarx); }
\ No newline at end of file
diff --git a/Usr/module/feite_servo/servo_package_process.h b/Usr/module/feite_servo/servo_package_process.h
index 73ca4de..444cec7 100644
--- a/Usr/module/feite_servo/servo_package_process.h
+++ b/Usr/module/feite_servo/servo_package_process.h
@@ -5,7 +5,8 @@
#include "servo_driver.h"
#include "usart.h"
#define PROCESS_MAX_LEN 256
-#define PARAM_LEN 128
+#define PARAM_LEN 128
+#define BASCI_LEN 5
#define PING 0x01
#define R_DATA 0x02
@@ -31,29 +32,31 @@ enum write_type {
non_syn,
};
+// typedef struct {
+// cmd_basic_t basic;
+// //uint8_t param[]; // 采用柔性数组来解决参数不定长问题,导致checksum得放在别处
+// } cmd_frame_t;
+
typedef struct {
- uint16_t head;
+ uint16_t head;
uint8_t id;
- uint8_t valid_len;//有效数据长度
+ uint8_t valid_len; // 有效数据长度
uint8_t cmd;
- uint8_t param[];//采用柔性数组来解决参数不定长问题,导致checksum得放在别处
-} cmd_frame_t;
+} cmd_basic_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 {
+ cmd_basic_t basic;
+ uint8_t status;
+ uint8_t check_sum;
+} cmd_receive_t;
typedef struct {
- uint8_t addr;
+ uint8_t addr;
int16_t* data;
- uint8_t count;
+ uint8_t count;
} param_t;
-enum reg_type{
+enum reg_type {
normal = 0,
data_longeer,
special_bit10,
@@ -61,8 +64,10 @@ enum reg_type{
};
void servo_uart_init(UART_HandleTypeDef* uart);
-bool Write_oprete(uint8_t id, uint8_t cmd, param_t* param);
-void reg_distinguish(param_t* param);
+void reg_distinguish(param_t* param, reg_info_t* reg_info);
+void high_low_exchange(param_t* param, uint8_t* packet, reg_info_t* reg_info);
+void packet_process(UART_HandleTypeDef* uart, uint8_t* tx, uint8_t* rx, uint8_t len);
+uint8_t check_sum_calculate(uint8_t* basic, param_t* param);
void get_rx_size(uint16_t Size);
diff --git a/Usr/stm32itcb.c b/Usr/stm32itcb.c
index 5f3ca67..978e6ca 100644
--- a/Usr/stm32itcb.c
+++ b/Usr/stm32itcb.c
@@ -26,7 +26,7 @@ void HAL_UART_RxCpltCallback(UART_HandleTypeDef* huart) {
//空闲中断处理
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size){
if (huart == &huart3) {
- get_rx_size(Size);
+ //get_rx_size(Size);
SET_IDEL_FLAG();
}
diff --git a/auxiliary_addition.ioc b/auxiliary_addition.ioc
index 7e18e61..4fdf773 100644
--- a/auxiliary_addition.ioc
+++ b/auxiliary_addition.ioc
@@ -8,9 +8,9 @@ ADC1.master=1
CAD.formats=
CAD.pinconfig=
CAD.provider=
-CAN1.CalculateBaudRate=749999
-CAN1.CalculateTimeBit=1333
-CAN1.CalculateTimeQuantum=444.44444444444446
+CAN1.CalculateBaudRate=875000
+CAN1.CalculateTimeBit=1142
+CAN1.CalculateTimeQuantum=380.95238095238096
CAN1.IPParameters=CalculateTimeQuantum,CalculateTimeBit,CalculateBaudRate
Dma.ADC1.0.Direction=DMA_PERIPH_TO_MEMORY
Dma.ADC1.0.FIFOMode=DMA_FIFOMODE_DISABLE
@@ -185,10 +185,16 @@ PD0.Locked=true
PD0.Signal=GPIO_Input
PD1.Locked=true
PD1.Signal=GPIO_Input
+PD13.GPIOParameters=GPIO_Speed
+PD13.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH
PD13.Locked=true
PD13.Signal=GPIO_Output
+PD14.GPIOParameters=GPIO_Speed
+PD14.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH
PD14.Locked=true
PD14.Signal=GPIO_Output
+PD15.GPIOParameters=GPIO_Speed
+PD15.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH
PD15.Locked=true
PD15.Signal=GPIO_Output
PD2.Locked=true
@@ -201,6 +207,8 @@ PE0.Locked=true
PE0.Signal=GPIO_Input
PE1.Locked=true
PE1.Signal=GPIO_Input
+PE2.GPIOParameters=GPIO_Speed
+PE2.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH
PE2.Locked=true
PE2.Signal=GPIO_Output
PE3.Locked=true
@@ -243,37 +251,37 @@ ProjectManager.UAScriptAfterPath=
ProjectManager.UAScriptBeforePath=
ProjectManager.UnderRoot=true
ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_DMA_Init-DMA-false-HAL-true,4-MX_UART4_Init-UART4-false-HAL-true,5-MX_USART1_UART_Init-USART1-false-HAL-true,6-MX_RTC_Init-RTC-false-HAL-true,7-MX_ADC1_Init-ADC1-false-HAL-true,8-MX_USART3_UART_Init-USART3-false-HAL-true,9-MX_I2C1_Init-I2C1-false-HAL-true,10-MX_CAN1_Init-CAN1-false-HAL-true,11-MX_USART2_UART_Init-USART2-false-HAL-true,12-MX_TIM2_Init-TIM2-false-HAL-true
-RCC.48MHZClocksFreq_Value=36000000
-RCC.AHBFreq_Value=72000000
-RCC.APB1CLKDivider=RCC_HCLK_DIV2
-RCC.APB1Freq_Value=36000000
-RCC.APB1TimFreq_Value=72000000
+RCC.48MHZClocksFreq_Value=84000000
+RCC.AHBFreq_Value=168000000
+RCC.APB1CLKDivider=RCC_HCLK_DIV4
+RCC.APB1Freq_Value=42000000
+RCC.APB1TimFreq_Value=84000000
RCC.APB2CLKDivider=RCC_HCLK_DIV2
-RCC.APB2Freq_Value=36000000
-RCC.APB2TimFreq_Value=72000000
-RCC.CortexFreq_Value=72000000
-RCC.EthernetFreq_Value=72000000
-RCC.FCLKCortexFreq_Value=72000000
+RCC.APB2Freq_Value=84000000
+RCC.APB2TimFreq_Value=168000000
+RCC.CortexFreq_Value=168000000
+RCC.EthernetFreq_Value=168000000
+RCC.FCLKCortexFreq_Value=168000000
RCC.FamilyName=M
-RCC.HCLKFreq_Value=72000000
+RCC.HCLKFreq_Value=168000000
RCC.HSE_VALUE=8000000
RCC.HSI_VALUE=16000000
RCC.I2SClocksFreq_Value=192000000
RCC.IPParameters=48MHZClocksFreq_Value,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2CLKDivider,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,EthernetFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2SClocksFreq_Value,LSI_VALUE,MCO2PinFreq_Value,PLLCLKFreq_Value,PLLM,PLLN,PLLQCLKFreq_Value,PLLSourceVirtual,RTCFreq_Value,RTCHSEDivFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,VCOI2SOutputFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VcooutputI2S
RCC.LSI_VALUE=32000
-RCC.MCO2PinFreq_Value=72000000
-RCC.PLLCLKFreq_Value=72000000
+RCC.MCO2PinFreq_Value=168000000
+RCC.PLLCLKFreq_Value=168000000
RCC.PLLM=4
-RCC.PLLN=72
-RCC.PLLQCLKFreq_Value=36000000
+RCC.PLLN=168
+RCC.PLLQCLKFreq_Value=84000000
RCC.PLLSourceVirtual=RCC_PLLSOURCE_HSE
RCC.RTCFreq_Value=32000
RCC.RTCHSEDivFreq_Value=4000000
-RCC.SYSCLKFreq_VALUE=72000000
+RCC.SYSCLKFreq_VALUE=168000000
RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK
RCC.VCOI2SOutputFreq_Value=384000000
RCC.VCOInputFreq_Value=2000000
-RCC.VCOOutputFreq_Value=144000000
+RCC.VCOOutputFreq_Value=336000000
RCC.VcooutputI2S=192000000
RTC.Alarm=RTC_ALARM_A
RTC.Alarm_B=RTC_ALARM_B
@@ -293,7 +301,8 @@ USART1.VirtualMode=VM_ASYNC
USART2.BaudRate=256000
USART2.IPParameters=VirtualMode,BaudRate
USART2.VirtualMode=VM_ASYNC
-USART3.IPParameters=VirtualMode
+USART3.BaudRate=1000000
+USART3.IPParameters=VirtualMode,BaudRate
USART3.VirtualMode=VM_ASYNC
VP_RTC_VS_RTC_Activate.Mode=RTC_Enabled
VP_RTC_VS_RTC_Activate.Signal=RTC_VS_RTC_Activate