Browse Source

improve cmd_packet frame and Ping operation

master
sunlight 10 months ago
parent
commit
1175ed857b
  1. 4
      .cproject
  2. 3
      .vscode/settings.json
  3. 1
      Core/Inc/Backup/stm32f4xx_it.h.bak
  4. 4
      Core/Inc/usart.h
  5. 4
      Core/Src/Backup/dma.c.bak
  6. 4
      Core/Src/Backup/gpio.c.bak
  7. 15
      Core/Src/Backup/stm32f4xx_it.c.bak
  8. 27
      Core/Src/Backup/usart.c.bak
  9. 2
      Core/Src/adc.c
  10. 4
      Core/Src/gpio.c
  11. 2
      Core/Src/stm32f4xx_it.c
  12. 6
      Core/Src/usart.c
  13. 19
      Usr/core.c
  14. 2
      Usr/module/feite_servo/need.txt
  15. 46
      Usr/module/feite_servo/servo_driver.c
  16. 94
      Usr/module/feite_servo/servo_operation.c
  17. 9
      Usr/module/feite_servo/servo_operation.h
  18. 159
      Usr/module/feite_servo/servo_package_process.c
  19. 39
      Usr/module/feite_servo/servo_package_process.h
  20. 2
      Usr/stm32itcb.c
  21. 51
      auxiliary_addition.ioc

4
.cproject

@ -24,7 +24,7 @@
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.377661821" name="Floating-point ABI" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi" useByScannerDiscovery="true" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.value.hard" valueType="enumerated"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board.273320545" name="Board" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board" useByScannerDiscovery="false" value="genericBoard" valueType="string"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults.1506876983" name="Defaults" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults" useByScannerDiscovery="false" value="com.st.stm32cube.ide.common.services.build.inputs.revA.1.0.6 || Debug || true || Executable || com.st.stm32cube.ide.mcu.gnu.managedbuild.option.toolchain.value.workspace || STM32F407VETx || 0 || 0 || arm-none-eabi- || ${gnu_tools_for_stm32_compiler_path} || ../Core/Inc | ../Drivers/STM32F4xx_HAL_Driver/Inc | ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy | ../Drivers/CMSIS/Device/ST/STM32F4xx/Include | ../Drivers/CMSIS/Include || || || USE_HAL_DRIVER | STM32F407xx || || Drivers | Core/Startup | Core || || || ${workspace_loc:/${ProjName}/STM32F407VETX_FLASH.ld} || true || NonSecure || || secure_nsclib.o || || None || || || " valueType="string"/>
<option id="com.st.stm32cube.ide.mcu.debug.option.cpuclock.959946920" name="Cpu clock frequence" superClass="com.st.stm32cube.ide.mcu.debug.option.cpuclock" useByScannerDiscovery="false" value="72" valueType="string"/>
<option id="com.st.stm32cube.ide.mcu.debug.option.cpuclock.959946920" name="Cpu clock frequence" superClass="com.st.stm32cube.ide.mcu.debug.option.cpuclock" useByScannerDiscovery="false" value="168" valueType="string"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.convertbinary.46951286" name="Convert to binary file (-O binary)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.convertbinary" useByScannerDiscovery="false" value="true" valueType="boolean"/>
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform.366309264" isAbstract="false" osList="all" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform"/>
<builder buildPath="${workspace_loc:/auxiliary_addition}/Debug" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder.136438457" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder"/>
@ -114,7 +114,7 @@
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.1492355288" name="Floating-point ABI" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi" useByScannerDiscovery="true" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.value.hard" valueType="enumerated"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board.1676201566" name="Board" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board" useByScannerDiscovery="false" value="genericBoard" valueType="string"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults.1534087057" name="Defaults" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults" useByScannerDiscovery="false" value="com.st.stm32cube.ide.common.services.build.inputs.revA.1.0.6 || Release || false || Executable || com.st.stm32cube.ide.mcu.gnu.managedbuild.option.toolchain.value.workspace || STM32F407VETx || 0 || 0 || arm-none-eabi- || ${gnu_tools_for_stm32_compiler_path} || ../Core/Inc | ../Drivers/STM32F4xx_HAL_Driver/Inc | ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy | ../Drivers/CMSIS/Device/ST/STM32F4xx/Include | ../Drivers/CMSIS/Include || || || USE_HAL_DRIVER | STM32F407xx || || Drivers | Core/Startup | Core || || || ${workspace_loc:/${ProjName}/STM32F407VETX_FLASH.ld} || true || NonSecure || || secure_nsclib.o || || None || || || " valueType="string"/>
<option id="com.st.stm32cube.ide.mcu.debug.option.cpuclock.1868502222" name="Cpu clock frequence" superClass="com.st.stm32cube.ide.mcu.debug.option.cpuclock" useByScannerDiscovery="false" value="72" valueType="string"/>
<option id="com.st.stm32cube.ide.mcu.debug.option.cpuclock.1868502222" name="Cpu clock frequence" superClass="com.st.stm32cube.ide.mcu.debug.option.cpuclock" useByScannerDiscovery="false" value="168" valueType="string"/>
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform.1544943081" isAbstract="false" osList="all" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform"/>
<builder buildPath="${workspace_loc:/auxiliary_addition}/Release" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder.1592162593" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder"/>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.678775058" name="MCU GCC Assembler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler">

3
.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",

1
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);

4
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);

4
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);

4
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

15
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)

27
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 */

2
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;

4
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

2
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 */

6
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;

19
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

2
Usr/module/feite_servo/need.txt

@ -128,7 +128,7 @@
9.23
发先所有的操作都有统一的基础形式
发先所有的操作都有统一的基础形式,所以对数据包进行统一
2、控制多个舵机

46
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, &param);
Write_operete(id, cmd, &param);
}
// 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);
// }

94
Usr/module/feite_servo/servo_operation.c

@ -0,0 +1,94 @@
#include "servo_operation.h"
#include <stdbool.h>
#include <stdio.h>
#include <string.h>
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, &reg_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], &reg_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);
}

9
Usr/module/feite_servo/servo_operation.h

@ -0,0 +1,9 @@
#pragma once
#include <stdint.h>
#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);

159
Usr/module/feite_servo/servo_package_process.c

@ -3,29 +3,18 @@
#include <stdio.h>
#include <string.h>
#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); }

39
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);

2
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();
}

51
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

Loading…
Cancel
Save