diff --git a/.cproject b/.cproject index 4c0e158..41d0e09 100644 --- a/.cproject +++ b/.cproject @@ -36,7 +36,7 @@ - + @@ -117,7 +117,7 @@ - + diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml index c5c6395..5adad92 100644 --- a/.settings/language.settings.xml +++ b/.settings/language.settings.xml @@ -5,7 +5,7 @@ - + @@ -16,7 +16,7 @@ - + diff --git a/Core/Inc/EEPROM.h b/Core/Inc/EEPROM.h index 8d47b68..a88f05e 100644 --- a/Core/Inc/EEPROM.h +++ b/Core/Inc/EEPROM.h @@ -10,21 +10,21 @@ #define START_ADR_SHOT (START_ADR_STAT+STAT_BLOCKSIZE) #define SHOT_BLOCKSIZE 10 -#define MAX_NUMBER_SHOTS 255 +#define MAX_SHOT_COUNT 256 -#define START_ADR_PROGRAM (START_ADR_SHOT + (SHOT_BLOCKSIZE*MAX_NUMBER_SHOTS)) -#define PROGRAM_BLOCKSIZE 203 -#define MAX_NUMBER_PROGRAMS 100 -#define MAX_NUMBER_SHOTS_IN_PROGRAMS \ - (PROGRAM_BLOCKSIZE-sizeof(ProgramHeader)) /sizeof(ProgramShot) // 100 +#define START_ADR_PROGRAM (START_ADR_SHOT + (SHOT_BLOCKSIZE*MAX_SHOT_COUNT)) +#define PROGRAM_BLOCKSIZE 67 +#define MAX_PROGRAM_COUNT 256 +#define MAX_SHOT_COUNT_IN_PROGRAMS \ + (PROGRAM_BLOCKSIZE-sizeof(ProgramHeader)) /sizeof(ProgramShot) // -#define START_ADR_MACRO (START_ADR_PROGRAM + (PROGRAM_BLOCKSIZE*MAX_NUMBER_PROGRAMS)) -#define MACRO_BLOCKSIZE 81 -#define MAX_NUMBER_MACRO 100 -#define MAX_NUMBER_PROGRAMS_IN_MACRO \ - (MACRO_BLOCKSIZE-sizeof(MacroHeader)) /sizeof(MacroProgram) // 20 +#define START_ADR_MACRO (START_ADR_PROGRAM + (PROGRAM_BLOCKSIZE*MAX_PROGRAM_COUNT)) +#define MACRO_BLOCKSIZE 129 +#define MAX_MACRO_COUNT 100 +#define MAX_PROGRAM_COUNT_IN_MACRO \ + (MACRO_BLOCKSIZE-sizeof(MacroHeader)) /sizeof(MacroProgram) // -#define MEMORY_END (START_ADR_MACRO + (MACRO_BLOCKSIZE*MAX_NUMBER_MACRO)) +#define MEMORY_END (START_ADR_MACRO + (MACRO_BLOCKSIZE*MAX_MACRO_COUNT)) typedef enum MemoryStatus { EEPROM_FAIL, @@ -58,7 +58,7 @@ typedef struct ProgramShot { typedef struct Program { ProgramHeader header; - ProgramShot shots[MAX_NUMBER_SHOTS_IN_PROGRAMS]; + ProgramShot shots[MAX_SHOT_COUNT_IN_PROGRAMS]; } Program; typedef struct MacroHeader { @@ -74,7 +74,7 @@ typedef struct MacroProgram { typedef struct Macro { MacroHeader header; - MacroProgram programs[MAX_NUMBER_PROGRAMS_IN_MACRO]; + MacroProgram programs[MAX_PROGRAM_COUNT_IN_MACRO]; } Macro; typedef struct ServoSetting { diff --git a/Core/Inc/GlobalDefines.h b/Core/Inc/GlobalDefines.h deleted file mode 100644 index f084d2f..0000000 --- a/Core/Inc/GlobalDefines.h +++ /dev/null @@ -1,13 +0,0 @@ -/* - * GlobalDefines.h - * - * Created on: Aug 25, 2024 - * Author: DashyFox - */ - -#ifndef INC_GLOBALDEFINES_H_ -#define INC_GLOBALDEFINES_H_ - -#define UART_BUFFER_SIZE 64 - -#endif /* INC_GLOBALDEFINES_H_ */ diff --git a/Core/Inc/Print.h b/Core/Inc/Print.h index b81647a..a973a3d 100644 --- a/Core/Inc/Print.h +++ b/Core/Inc/Print.h @@ -9,3 +9,4 @@ void print(char* str); void int_to_str(int number, char *str, int base); void printNumber(long int number); +void printHexBuffer(uint8_t *buffer, uint16_t size); diff --git a/Core/Inc/RobotFunctions.h b/Core/Inc/RobotFunctions.h index 087ce02..9c875fb 100644 --- a/Core/Inc/RobotFunctions.h +++ b/Core/Inc/RobotFunctions.h @@ -30,6 +30,7 @@ void stopShooting(); void setPos(uint8_t axial, uint8_t horizontal, uint8_t vertical); +void setPosSingle(ServoMap servo, uint8_t value); void setPosDefault(); // 0 .. 100 diff --git a/Core/Inc/UART3_CMD_Handler.h b/Core/Inc/UART3_CMD_Handler.h new file mode 100644 index 0000000..e796d4f --- /dev/null +++ b/Core/Inc/UART3_CMD_Handler.h @@ -0,0 +1,42 @@ +/* + * UART3_CMD_Handler.h + * + * Created on: Sep 12, 2024 + * Author: DashyFox + */ + +#ifndef INC_UART3_CMD_HANDLER_H_ +#define INC_UART3_CMD_HANDLER_H_ + +#include "stm32f1xx_hal.h" + +void UART3_SaveShot(uint8_t *dataPtr, uint8_t len); +void UART3_SaveProgram(uint8_t *dataPtr, uint8_t len); +void UART3_SaveMacro(uint8_t *dataPtr, uint8_t len); +void UART3_StartMacro(uint8_t *dataPtr, uint8_t len); +void UART3_StartProgram(uint8_t *dataPtr, uint8_t len); +void UART3_StartShot(uint8_t *dataPtr, uint8_t len); +void UART3_Stop(uint8_t *dataPtr, uint8_t len); +void UART3_DeleteShot(uint8_t *dataPtr, uint8_t len); +void UART3_DeleteProgram(uint8_t *dataPtr, uint8_t len); +void UART3_DeleteMacro(uint8_t *dataPtr, uint8_t len); +void UART3_DeleteAllData(uint8_t *dataPtr, uint8_t len); +void UART3_GetDeviceStatus(uint8_t *dataPtr, uint8_t len); +void UART3_SetServoOffset(uint8_t *dataPtr, uint8_t len); +void UART3_GetServoOffset(uint8_t *dataPtr, uint8_t len); +void UART3_SetServoMaxAngle(uint8_t *dataPtr, uint8_t len); +void UART3_GetServoMaxAngle(uint8_t *dataPtr, uint8_t len); +void UART3_MoveServoToInitialPosition(uint8_t *dataPtr, uint8_t len); +void UART3_SetStartupDelay(uint8_t *dataPtr, uint8_t len); +void UART3_GetStartupDelay(uint8_t *dataPtr, uint8_t len); +void UART3_SetMinRollerSpeed(uint8_t *dataPtr, uint8_t len); +void UART3_GetMinRollerSpeed(uint8_t *dataPtr, uint8_t len); +void UART3_SetMinScrewSpeed(uint8_t *dataPtr, uint8_t len); +void UART3_GetMinScrewSpeed(uint8_t *dataPtr, uint8_t len); +void UART3_SetServoInvertFlag(uint8_t *dataPtr, uint8_t len); +void UART3_GetServoInvertFlag(uint8_t *dataPtr, uint8_t len); +void UART3_ReadStatistics(uint8_t *dataPtr, uint8_t len); +void UART3_ResetStatistics(uint8_t *dataPtr, uint8_t len); + + +#endif /* INC_UART3_CMD_HANDLER_H_ */ diff --git a/Core/Inc/UART3_Handler.h b/Core/Inc/UART3_Handler.h new file mode 100644 index 0000000..5ce5bdf --- /dev/null +++ b/Core/Inc/UART3_Handler.h @@ -0,0 +1,20 @@ +/* + * UART3_Handler.h + * + * Created on: Sep 12, 2024 + * Author: DashyFox + */ + +#ifndef INC_UART3_HANDLER_H_ +#define INC_UART3_HANDLER_H_ + +#include "stm32f1xx_hal.h" + +#define UART_BUFFER_SIZE 256 + +extern uint8_t uart_rx_buffer[UART_BUFFER_SIZE]; + +void UART3_START(); +void UART3_Handler(); + +#endif /* INC_UART3_HANDLER_H_ */ diff --git a/Core/Inc/stm32f1xx_hal_conf.h b/Core/Inc/stm32f1xx_hal_conf.h index 5c6da48..c8ba3e0 100644 --- a/Core/Inc/stm32f1xx_hal_conf.h +++ b/Core/Inc/stm32f1xx_hal_conf.h @@ -42,7 +42,7 @@ /*#define HAL_CORTEX_MODULE_ENABLED */ /*#define HAL_CRC_MODULE_ENABLED */ /*#define HAL_DAC_MODULE_ENABLED */ -/*#define HAL_DMA_MODULE_ENABLED */ +#define HAL_DMA_MODULE_ENABLED /*#define HAL_ETH_MODULE_ENABLED */ /*#define HAL_FLASH_MODULE_ENABLED */ #define HAL_GPIO_MODULE_ENABLED diff --git a/Core/Inc/stm32f1xx_it.h b/Core/Inc/stm32f1xx_it.h index 80d82c3..b8be754 100644 --- a/Core/Inc/stm32f1xx_it.h +++ b/Core/Inc/stm32f1xx_it.h @@ -57,6 +57,7 @@ void PendSV_Handler(void); void SysTick_Handler(void); void EXTI0_IRQHandler(void); void EXTI1_IRQHandler(void); +void DMA1_Channel3_IRQHandler(void); void USB_LP_CAN1_RX0_IRQHandler(void); void TIM3_IRQHandler(void); void I2C1_EV_IRQHandler(void); diff --git a/Core/Src/EEPROM.c b/Core/Src/EEPROM.c index c29a6dd..d3d5694 100644 --- a/Core/Src/EEPROM.c +++ b/Core/Src/EEPROM.c @@ -43,7 +43,7 @@ MemoryStatus getShot(unsigned char number, Shot *shot) { MemoryStatus saveProg(unsigned char number, Program *prog) { MemoryStatus result = EEPROM_OK; - for (uint16_t i = 0; i < MAX_NUMBER_SHOTS_IN_PROGRAMS; ++i) { + for (uint16_t i = 0; i < MAX_SHOT_COUNT_IN_PROGRAMS; ++i) { Shot shot; MemoryStatus stat = getShot(prog->shots[i].id, &shot); if (!(stat == EEPROM_OK || stat == EEPROM_MISSING_ELEMENT)) { @@ -77,7 +77,7 @@ MemoryStatus getProg(unsigned char number, Program *prog) { MemoryStatus saveMacro(unsigned char number, Macro *macro) { MemoryStatus result = EEPROM_OK; - for (uint16_t i = 0; i < MAX_NUMBER_PROGRAMS_IN_MACRO; ++i) { + for (uint16_t i = 0; i < MAX_PROGRAM_COUNT_IN_MACRO; ++i) { Program prog; MemoryStatus stat = getProg(macro->programs[i].id, &prog); if (!(stat == EEPROM_OK || stat == EEPROM_MISSING_ELEMENT)) { @@ -246,9 +246,9 @@ MemoryStatus FLASH_WriteBlock(uint16_t startAddr, uint8_t number, HAL_StatusTypeDef result; // Проверка на корректность входных данных - if ((startAddr == START_ADR_SHOT && number > MAX_NUMBER_SHOTS) - || (startAddr == START_ADR_PROGRAM && number > MAX_NUMBER_PROGRAMS) - || (startAddr == START_ADR_MACRO && number > MAX_NUMBER_MACRO)) { + if ((startAddr == START_ADR_SHOT && number >= MAX_SHOT_COUNT) + || (startAddr == START_ADR_PROGRAM && number >= MAX_PROGRAM_COUNT) + || (startAddr == START_ADR_MACRO && number >= MAX_MACRO_COUNT)) { return EEPROM_OUT_OF_RANGE; } @@ -278,9 +278,9 @@ MemoryStatus FLASH_ReadBlock(uint16_t startAddr, uint8_t number, HAL_StatusTypeDef result; // Проверка на корректность входных данных - if ((startAddr == START_ADR_SHOT && number > MAX_NUMBER_SHOTS) - || (startAddr == START_ADR_PROGRAM && number > MAX_NUMBER_PROGRAMS) - || (startAddr == START_ADR_MACRO && number > MAX_NUMBER_MACRO)) { + if ((startAddr == START_ADR_SHOT && number > MAX_SHOT_COUNT) + || (startAddr == START_ADR_PROGRAM && number > MAX_PROGRAM_COUNT) + || (startAddr == START_ADR_MACRO && number > MAX_MACRO_COUNT)) { return EEPROM_OUT_OF_RANGE; } diff --git a/Core/Src/Print.c b/Core/Src/Print.c index 7fae9d8..52ca6aa 100644 --- a/Core/Src/Print.c +++ b/Core/Src/Print.c @@ -6,53 +6,75 @@ */ #include "Print.h" -void print(char* str){ +void print(char *str) { unsigned int size = 0; - while (str[size] != '\0') - { + while (str[size] != '\0') { size++; } - CDC_Transmit_FS((unsigned char*)str, size); + CDC_Transmit_FS((unsigned char*) str, size); } -void int_to_str(int number, char *str, int base) -{ - static const char digits[] = "0123456789ABCDEF"; - char buffer[32]; - char *ptr = buffer + sizeof(buffer) - 1; - int is_negative = 0; +void int_to_str(int number, char *str, int base) { + static const char digits[] = "0123456789ABCDEF"; + char buffer[32]; + char *ptr = buffer + sizeof(buffer) - 1; + int is_negative = 0; - if (number < 0 && base == 10) { - is_negative = 1; - number = -number; - } + if (number < 0 && base == 10) { + is_negative = 1; + number = -number; + } - *ptr = '\0'; - do { - *--ptr = digits[number % base]; - number /= base; - } while (number); + *ptr = '\0'; + do { + *--ptr = digits[number % base]; + number /= base; + } while (number); - if (is_negative) { - *--ptr = '-'; - } + if (is_negative) { + *--ptr = '-'; + } - // Дополнение ведущим нулем для шестнадцатеричных чисел - if (base == 16 && (buffer + sizeof(buffer) - 1 - ptr) == 1) { - *--ptr = '0'; - } + // Дополнение ведущим нулем для шестнадцатеричных чисел + if (base == 16 && (buffer + sizeof(buffer) - 1 - ptr) == 1) { + *--ptr = '0'; + } - strcpy(str, ptr); + strcpy(str, ptr); } -void printNumber(long int number) -{ - char buffer[BUFFER_SIZE]; +void printNumber(long int number) { + char buffer[BUFFER_SIZE]; - // Преобразование числа в строку - int_to_str(number, buffer, 10); // 10 — это основание системы счисления (десятичная система) - strcat(buffer, "\r\n"); // Добавление новой строки + // Преобразование числа в строку + int_to_str(number, buffer, 10); // 10 — это основание системы счисления (десятичная система) + strcat(buffer, "\r\n"); // Добавление новой строки - // Отправка строки через USB CDC - CDC_Transmit_FS((uint8_t*)buffer, strlen(buffer)); + // Отправка строки через USB CDC + CDC_Transmit_FS((uint8_t*) buffer, strlen(buffer)); +} + +void printHexBuffer(uint8_t *buffer, uint16_t size) { + char hex_str[3 * size + 3]; // Строка для хранения шестнадцатеричных значений (2 символа на байт, пробелы и переносы строк) + int index = 0; + + for (uint16_t i = 0; i < size; i++) { + // Преобразуем каждый байт в шестнадцатеричный формат + index += sprintf(&hex_str[index], "%02X ", buffer[i]); + + // Добавляем перенос строки после каждых 8 байт + if ((i + 1) % 32 == 0) { + hex_str[index++] = '\n'; + } else if ((i + 1) % 8 == 0) { + hex_str[index++] = ' '; + } + } + + // Добавляем два переноса строки в конце + hex_str[index++] = '\n'; + hex_str[index++] = '\n'; + hex_str[index] = '\0'; // Завершаем строку символом конца строки + + // Отправляем строку через UART (CDC) + CDC_Transmit_FS((uint8_t*) hex_str, strlen(hex_str)); } diff --git a/Core/Src/RobotFunctions.c b/Core/Src/RobotFunctions.c index 8583842..608ee33 100644 --- a/Core/Src/RobotFunctions.c +++ b/Core/Src/RobotFunctions.c @@ -36,24 +36,17 @@ typedef struct Current { Current current; HardwareInit_t hwSettings = { - /*DelayTimes*/ { - /*preRun*/ 0 - }, - /*ServoSetting*/{ - {0, 0, 90, 180}, - {0, 0, 90, 180}, - {0, 0, 90, 180} - }, - /*Motors*/{ - 0, 0 - } -}; +/*DelayTimes*/{ +/*preRun*/0 }, +/*ServoSetting*/{ { 0, 0, 90, 180 }, { 0, 0, 90, 180 }, { 0, 0, 90, 180 } }, +/*Motors*/{ 0, 0 } }; extern int16_t Vz1; extern int16_t Vz2; -int16_t map(int16_t x, int16_t in_min, int16_t in_max, int16_t out_min, int16_t out_max) { - return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; +int16_t map(int16_t x, int16_t in_min, int16_t in_max, int16_t out_min, + int16_t out_max) { + return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; } void doShot(Shot *shot) { @@ -67,36 +60,43 @@ void doShot(Shot *shot) { void startShooting() { switch (current.mode) { - case ShotMode: - print("StartShooting\n"); - if(current.shot.isExist){ - print("Fire!\n"); + case ShotMode: + print("StartShooting\n"); + if (current.shot.isExist) { + print("Fire!\n"); - print("isExist ");printNumber(current.shot.isExist); - print("countRepeatShot; ");printNumber(current.shot.countRepeatShot); - print("speedRollerTop; ");printNumber(current.shot.speedRollerTop); - print("speedRollerBottom; ");printNumber(current.shot.speedRollerBottom); - print("speedScrew; ");printNumber(current.shot.speedScrew); - print("rotationAxial; ");printNumber(current.shot.rotationAxial); - print("rotationHorizontal; ");printNumber(current.shot.rotationHorizontal); - print("rotationVertical; ");printNumber(current.shot.rotationVertical); + print("isExist "); + printNumber(current.shot.isExist); + print("countRepeatShot; "); + printNumber(current.shot.countRepeatShot); + print("speedRollerTop; "); + printNumber(current.shot.speedRollerTop); + print("speedRollerBottom; "); + printNumber(current.shot.speedRollerBottom); + print("speedScrew; "); + printNumber(current.shot.speedScrew); + print("rotationAxial; "); + printNumber(current.shot.rotationAxial); + print("rotationHorizontal; "); + printNumber(current.shot.rotationHorizontal); + print("rotationVertical; "); + printNumber(current.shot.rotationVertical); + isShooting = 1; + doShot(¤t.shot); + } else { + print("Current Shot is NULL\n"); + // TODO: sound_ERR(); ledFX_ERR(); + } + break; + case ProgramMode: - isShooting = 1; - doShot(¤t.shot); - } else { - print("Current Shot is NULL\n"); - // TODO: sound_ERR(); ledFX_ERR(); - } - break; - case ProgramMode: + break; + case MacroMode: - break; - case MacroMode: - - break; - default: - break; + break; + default: + break; } } @@ -126,49 +126,53 @@ uint8_t prepareShot(uint8_t number) { } } +void setPosSingle(ServoMap servo, uint8_t value) { + if (hwSettings.servos[servo].invert) + value = 180 - value; + SetServo(servo, value); +} void setPos(uint8_t axial, uint8_t horizontal, uint8_t vertical) { - - //todo: -// hwSettings.servos[SERVO_AXIAL].invert - - SetServo(SERVO_AXIAL, axial); // Axial - SetServo(SERVO_HORIZONTAL, horizontal); // Horizontal - SetServo(SERVO_VERTICAL, vertical); // Vertical + setPosSingle(SERVO_AXIAL, axial); + setPosSingle(SERVO_HORIZONTAL, horizontal); + setPosSingle(SERVO_VERTICAL, vertical); } void setPosDefault() { - SetServo(SERVO_AXIAL, hwSettings.servos[SERVO_AXIAL].def); // Axial - SetServo(SERVO_HORIZONTAL, hwSettings.servos[SERVO_HORIZONTAL].def); // Horizontal - SetServo(SERVO_VERTICAL, hwSettings.servos[SERVO_VERTICAL].def); // Vertical + setPos( + hwSettings.servos[SERVO_AXIAL].def, + hwSettings.servos[SERVO_HORIZONTAL].def, + hwSettings.servos[SERVO_VERTICAL].def + ); } // 0 .. 100 void setScrewkSpeed(uint8_t speed) { // if(speed < 0) speed = 0; - if(speed > 100) speed = 100; + if (speed > 100) + speed = 100; speed = map(speed, 0, 100, hwSettings.motors.speed_Screw_min, 100); TIM1->CCR1 = 0; - TIM1->CCR2 = (uint16_t)(40 * speed); + TIM1->CCR2 = (uint16_t) (40 * speed); } //(-v) 0 .. 100(stop) .. 200(+v) void setRollersSpeed(uint8_t up, uint8_t down) { - if(up < 100){ - up = map(up, 0, 100, 0, 100-hwSettings.motors.speed_Screw_min); + if (up < 100) { + up = map(up, 0, 100, 0, 100 - hwSettings.motors.speed_Screw_min); } else { - up = map(up, 0, 100, 0, 100+hwSettings.motors.speed_Screw_min); + up = map(up, 0, 100, 0, 100 + hwSettings.motors.speed_Screw_min); } - if(down < 100){ - map(down, 0, 100, 0, 100-hwSettings.motors.speed_Screw_min); + if (down < 100) { + map(down, 0, 100, 0, 100 - hwSettings.motors.speed_Screw_min); } else { - map(down, 0, 100, 0, 100+hwSettings.motors.speed_Screw_min); + map(down, 0, 100, 0, 100 + hwSettings.motors.speed_Screw_min); } - Vz1 = 200-up; // invert + Vz1 = 200 - up; // invert Vz2 = down; } // shot sequence diff --git a/Core/Src/UART3_CMD_Handler.c b/Core/Src/UART3_CMD_Handler.c new file mode 100644 index 0000000..48fbb6a --- /dev/null +++ b/Core/Src/UART3_CMD_Handler.c @@ -0,0 +1,239 @@ +/* + * UART3_CMD_Handler.c + * + * Created on: Sep 12, 2024 + * Author: DashyFox + */ + +#include "UART3_CMD_Handler.h" +#include "Print.h" + +extern void SendResponse(uint8_t command, uint8_t result, uint8_t *data, + uint8_t data_length); + +uint8_t checkLen(uint8_t cmd, uint8_t current_length, uint8_t required_length) { + if (current_length >= required_length) { + print("Invalid length for command"); + printNumber(cmd); + print("\n"); + return 0; + } + return 1; +} + +void UART3_SaveShot(uint8_t *dataPtr, uint8_t len) { + const uint8_t MIN_PARAM_LENGTH = 0; + if (!checkLen(dataPtr[0], len, MIN_PARAM_LENGTH)) + return; + + SendResponse(dataPtr[0], 0, NULL, 0); +} + +void UART3_SaveProgram(uint8_t *dataPtr, uint8_t len) { + const uint8_t MIN_PARAM_LENGTH = 0; + if (!checkLen(dataPtr[0], len, MIN_PARAM_LENGTH)) + return; + + SendResponse(dataPtr[0], 0, NULL, 0); +} + +void UART3_SaveMacro(uint8_t *dataPtr, uint8_t len) { + const uint8_t MIN_PARAM_LENGTH = 0; + if (!checkLen(dataPtr[0], len, MIN_PARAM_LENGTH)) + return; + + SendResponse(dataPtr[0], 0, NULL, 0); +} + +void UART3_StartMacro(uint8_t *dataPtr, uint8_t len) { + const uint8_t MIN_PARAM_LENGTH = 0; + if (!checkLen(dataPtr[0], len, MIN_PARAM_LENGTH)) + return; + + SendResponse(dataPtr[0], 0, NULL, 0); +} + +void UART3_StartProgram(uint8_t *dataPtr, uint8_t len) { + const uint8_t MIN_PARAM_LENGTH = 0; + if (!checkLen(dataPtr[0], len, MIN_PARAM_LENGTH)) + return; + + SendResponse(dataPtr[0], 0, NULL, 0); +} + +void UART3_StartShot(uint8_t *dataPtr, uint8_t len) { + const uint8_t MIN_PARAM_LENGTH = 0; + if (!checkLen(dataPtr[0], len, MIN_PARAM_LENGTH)) + return; + + SendResponse(dataPtr[0], 0, NULL, 0); +} + +void UART3_Stop(uint8_t *dataPtr, uint8_t len) { + const uint8_t MIN_PARAM_LENGTH = 0; + if (!checkLen(dataPtr[0], len, MIN_PARAM_LENGTH)) + return; + + SendResponse(dataPtr[0], 0, NULL, 0); +} + +void UART3_DeleteShot(uint8_t *dataPtr, uint8_t len) { + const uint8_t MIN_PARAM_LENGTH = 0; + if (!checkLen(dataPtr[0], len, MIN_PARAM_LENGTH)) + return; + + SendResponse(dataPtr[0], 0, NULL, 0); +} + +void UART3_DeleteProgram(uint8_t *dataPtr, uint8_t len) { + const uint8_t MIN_PARAM_LENGTH = 0; + if (!checkLen(dataPtr[0], len, MIN_PARAM_LENGTH)) + return; + + SendResponse(dataPtr[0], 0, NULL, 0); +} + +void UART3_DeleteMacro(uint8_t *dataPtr, uint8_t len) { + const uint8_t MIN_PARAM_LENGTH = 0; + if (!checkLen(dataPtr[0], len, MIN_PARAM_LENGTH)) + return; + + SendResponse(dataPtr[0], 0, NULL, 0); +} + +void UART3_DeleteAllData(uint8_t *dataPtr, uint8_t len) { + const uint8_t MIN_PARAM_LENGTH = 0; + if (!checkLen(dataPtr[0], len, MIN_PARAM_LENGTH)) + return; + + SendResponse(dataPtr[0], 0, NULL, 0); +} + +void UART3_GetDeviceStatus(uint8_t *dataPtr, uint8_t len) { + const uint8_t MIN_PARAM_LENGTH = 0; + if (!checkLen(dataPtr[0], len, MIN_PARAM_LENGTH)) + return; + + SendResponse(dataPtr[0], 0, NULL, 0); +} + +void UART3_SetServoOffset(uint8_t *dataPtr, uint8_t len) { + const uint8_t MIN_PARAM_LENGTH = 0; + if (!checkLen(dataPtr[0], len, MIN_PARAM_LENGTH)) + return; + + SendResponse(dataPtr[0], 0, NULL, 0); +} + +void UART3_GetServoOffset(uint8_t *dataPtr, uint8_t len) { + const uint8_t MIN_PARAM_LENGTH = 0; + if (!checkLen(dataPtr[0], len, MIN_PARAM_LENGTH)) + return; + + SendResponse(dataPtr[0], 0, NULL, 0); +} + +void UART3_SetServoMaxAngle(uint8_t *dataPtr, uint8_t len) { + const uint8_t MIN_PARAM_LENGTH = 0; + if (!checkLen(dataPtr[0], len, MIN_PARAM_LENGTH)) + return; + + SendResponse(dataPtr[0], 0, NULL, 0); +} + +void UART3_GetServoMaxAngle(uint8_t *dataPtr, uint8_t len) { + const uint8_t MIN_PARAM_LENGTH = 0; + if (!checkLen(dataPtr[0], len, MIN_PARAM_LENGTH)) + return; + + SendResponse(dataPtr[0], 0, NULL, 0); +} + +void UART3_MoveServoToInitialPosition(uint8_t *dataPtr, uint8_t len) { + const uint8_t MIN_PARAM_LENGTH = 0; + if (!checkLen(dataPtr[0], len, MIN_PARAM_LENGTH)) + return; + + SendResponse(dataPtr[0], 0, NULL, 0); +} + +void UART3_SetStartupDelay(uint8_t *dataPtr, uint8_t len) { + const uint8_t MIN_PARAM_LENGTH = 0; + if (!checkLen(dataPtr[0], len, MIN_PARAM_LENGTH)) + return; + + SendResponse(dataPtr[0], 0, NULL, 0); +} + +void UART3_GetStartupDelay(uint8_t *dataPtr, uint8_t len) { + const uint8_t MIN_PARAM_LENGTH = 0; + if (!checkLen(dataPtr[0], len, MIN_PARAM_LENGTH)) + return; + + SendResponse(dataPtr[0], 0, NULL, 0); +} + +void UART3_SetMinRollerSpeed(uint8_t *dataPtr, uint8_t len) { + const uint8_t MIN_PARAM_LENGTH = 0; + if (!checkLen(dataPtr[0], len, MIN_PARAM_LENGTH)) + return; + + SendResponse(dataPtr[0], 0, NULL, 0); +} + +void UART3_GetMinRollerSpeed(uint8_t *dataPtr, uint8_t len) { + const uint8_t MIN_PARAM_LENGTH = 0; + if (!checkLen(dataPtr[0], len, MIN_PARAM_LENGTH)) + return; + + SendResponse(dataPtr[0], 0, NULL, 0); +} + +void UART3_SetMinScrewSpeed(uint8_t *dataPtr, uint8_t len) { + const uint8_t MIN_PARAM_LENGTH = 0; + if (!checkLen(dataPtr[0], len, MIN_PARAM_LENGTH)) + return; + + SendResponse(dataPtr[0], 0, NULL, 0); +} + +void UART3_GetMinScrewSpeed(uint8_t *dataPtr, uint8_t len) { + const uint8_t MIN_PARAM_LENGTH = 0; + if (!checkLen(dataPtr[0], len, MIN_PARAM_LENGTH)) + return; + + SendResponse(dataPtr[0], 0, NULL, 0); +} + +void UART3_SetServoInvertFlag(uint8_t *dataPtr, uint8_t len) { + const uint8_t MIN_PARAM_LENGTH = 0; + if (!checkLen(dataPtr[0], len, MIN_PARAM_LENGTH)) + return; + + SendResponse(dataPtr[0], 0, NULL, 0); +} + +void UART3_GetServoInvertFlag(uint8_t *dataPtr, uint8_t len) { + const uint8_t MIN_PARAM_LENGTH = 0; + if (!checkLen(dataPtr[0], len, MIN_PARAM_LENGTH)) + return; + + SendResponse(dataPtr[0], 0, NULL, 0); +} + +void UART3_ReadStatistics(uint8_t *dataPtr, uint8_t len) { + const uint8_t MIN_PARAM_LENGTH = 0; + if (!checkLen(dataPtr[0], len, MIN_PARAM_LENGTH)) + return; + + SendResponse(dataPtr[0], 0, NULL, 0); +} + +void UART3_ResetStatistics(uint8_t *dataPtr, uint8_t len) { + const uint8_t MIN_PARAM_LENGTH = 0; + if (!checkLen(dataPtr[0], len, MIN_PARAM_LENGTH)) + return; + + SendResponse(dataPtr[0], 0, NULL, 0); +} + diff --git a/Core/Src/UART3_Handler.c b/Core/Src/UART3_Handler.c new file mode 100644 index 0000000..170fcaa --- /dev/null +++ b/Core/Src/UART3_Handler.c @@ -0,0 +1,295 @@ +/* + * UART3_Handler.c + * + * Created on: Sep 12, 2024 + * Author: DashyFox + */ + +#include "UART3_Handler.h" +#include "UART3_CMD_Handler.h" +#include "Print.h" +#include "SimpleTimer.h" + +uint8_t uart_rx_buffer[UART_BUFFER_SIZE]; +uint8_t uart_rx_buffer_out[UART_BUFFER_SIZE]; +volatile uint8_t uart_rx_comlite = 0; + +extern UART_HandleTypeDef huart3; + +void UART3_CMD_Handler(uint8_t *dataPtr, uint8_t len); + + + +void UART3_START() { + HAL_UART_Receive_DMA(&huart3, uart_rx_buffer, UART_BUFFER_SIZE); +} + +//void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { +// if (huart->Instance == USART3) { +// uartTimer = millis(); +// packet_index++; +// +// CDC_Transmit_FS(uart_rx_buffer, UART_BUFFER_SIZE); +// +// if (packet_index < UART_BUFFER_SIZE) { +// HAL_UART_Receive_DMA(&huart3, &uart_rx_buffer[packet_index], 1); +// } +// } +//} + +volatile uint32_t last_rx_time = 0; +volatile uint32_t rx_complete_timeout = 10; +volatile uint32_t old_pos = 0; +volatile uint16_t rx_index = 0; +extern DMA_HandleTypeDef hdma_usart3_rx; +void handle_rx_complete(uint8_t *data, uint16_t len) +{ + // Проверка, если данных пришло меньше двух байт + if (len < 2) { + char error_msg[64]; + snprintf(error_msg, sizeof(error_msg), + "Received less than 2 bytes: len = %d\n", len); + CDC_Transmit_FS((uint8_t*) error_msg, strlen(error_msg)); + return; + } + + // Распечатать пришедший буфер с указанием номеров байт + char byte_msg[128]; + snprintf(byte_msg, sizeof(byte_msg), "Received buffer (%d bytes):\n", len); + CDC_Transmit_FS((uint8_t*) byte_msg, strlen(byte_msg)); + + for (uint16_t i = 0; i < len; i++) { + char byte_info[32]; + snprintf(byte_info, sizeof(byte_info), "Byte %d: 0x%02X\n", i, data[i]); + CDC_Transmit_FS((uint8_t*) byte_info, strlen(byte_info)); + } + + // Проверка правильности пакета (первый байт должен быть 0xF0) + if (data[0] != 0xF0) { + char error_msg[64]; + snprintf(error_msg, sizeof(error_msg), + "Wrong fix 0xF0: received 0x%02X\n", data[0]); + CDC_Transmit_FS((uint8_t*) error_msg, strlen(error_msg)); + return; + } + + // Проверка длины пакета + uint8_t length = data[1]; + if (length + 3 > UART_BUFFER_SIZE) { + char error_msg[128]; + snprintf(error_msg, sizeof(error_msg), + "Packet length exceeds buffer size: received length = %d, max size = %d\n", + length + 3, UART_BUFFER_SIZE); + CDC_Transmit_FS((uint8_t*) error_msg, strlen(error_msg)); + return; + } + + // Проверка контрольной суммы + uint16_t checksum = 0; + for (uint8_t i = 0; i < length + 2; i++) { + checksum += data[i]; + } + checksum %= 0xFF; + + if (checksum != data[length + 2]) { + char error_msg[64]; + snprintf(error_msg, sizeof(error_msg), + "Wrong checksum: calculated 0x%02X, received 0x%02X\n", + checksum, data[length + 2]); + CDC_Transmit_FS((uint8_t*) error_msg, strlen(error_msg)); + return; + } + + CDC_Transmit_FS((uint8_t*)"\n\n", 2); + + // Если пакет корректен, передать управление обработчику команд + uint8_t *data_ptr = &data[2]; + UART3_CMD_Handler(data_ptr, length); +} + + +void handle_rx_data(uint8_t* data, uint16_t len) +{ + if (len > 0) + { + if(!rx_index){ + memset(uart_rx_buffer_out, 0x00, UART_BUFFER_SIZE); + } + memcpy(uart_rx_buffer_out+rx_index, data, len); + rx_index += len; + +// uint8_t ff = 0xFF; +// CDC_Transmit_FS(&ff, 1); + } +} + +void process_uart_data(uint32_t old_pos, uint32_t new_pos) +{ + if (new_pos > old_pos) + { + // Обрабатываем данные между old_pos и new_pos + handle_rx_data(&uart_rx_buffer[old_pos], new_pos - old_pos); + } + else + { + // Обрабатываем данные от old_pos до конца буфера и от начала до new_pos + handle_rx_data(&uart_rx_buffer[old_pos], UART_BUFFER_SIZE - old_pos); + handle_rx_data(&uart_rx_buffer[0], new_pos); + } +} +volatile uint8_t rx_in_progress = 0; +void check_uart3_timeout(void) +{ + +} + +void UART3_Handler() { + // Текущая позиция в буфере (DMA передаёт значение обратного счётчика) + uint32_t pos = UART_BUFFER_SIZE - __HAL_DMA_GET_COUNTER(&hdma_usart3_rx); + + if (pos != old_pos) + { + // Если есть новые данные, обновляем таймер + last_rx_time = millis(); + rx_in_progress = 1; + process_uart_data(old_pos, pos); // Обрабатываем новые данные + old_pos = pos; // Обновляем позицию + } + else if (rx_in_progress && (millis() - last_rx_time) > rx_complete_timeout) + { + handle_rx_complete(uart_rx_buffer_out, rx_index); + rx_index = 0; + last_rx_time = millis(); + rx_in_progress = 0; + } +} + +void SendResponse(uint8_t command, uint8_t result, uint8_t *data, + uint8_t data_length) { + uint8_t response_buffer[64]; + uint8_t index = 0; + + response_buffer[index++] = 0xF0; + response_buffer[index++] = data_length + 3; + response_buffer[index++] = command; + response_buffer[index++] = result; + + if (data != NULL && data_length > 0) { + for (uint8_t i = 0; i < data_length; i++) { + response_buffer[index++] = data[i]; + } + } + + uint8_t checksum = 0; + for (uint8_t i = 0; i < index; i++) { + checksum += response_buffer[i]; + } + checksum %= 0xFF; + + response_buffer[index++] = checksum; + HAL_UART_Transmit(&huart3, response_buffer, index, HAL_MAX_DELAY); +} + +void UART3_CMD_Handler(uint8_t *dataPtr, uint8_t len) { + uint8_t command = dataPtr[0]; + + print("Received command: "); + printNumber(command); + print("\nParameters: ["); + + for (uint8_t i = 1; i < len; i++) { + printNumber(dataPtr[i]); + if (i < len - 1) { + print(", "); + } + } + print("]\n"); + + switch (command) { + case 10: + UART3_SaveShot(dataPtr, len); + break; + case 11: + UART3_SaveProgram(dataPtr, len); + break; + case 12: + UART3_SaveMacro(dataPtr, len); + break; + case 100: + UART3_StartMacro(dataPtr, len); + break; + case 101: + UART3_StartProgram(dataPtr, len); + break; + case 102: + UART3_StartShot(dataPtr, len); + break; + case 110: + UART3_Stop(dataPtr, len); + break; + case 13: + UART3_DeleteShot(dataPtr, len); + break; + case 14: + UART3_DeleteProgram(dataPtr, len); + break; + case 15: + UART3_DeleteMacro(dataPtr, len); + break; + case 120: + UART3_DeleteAllData(dataPtr, len); + break; + case 180: + UART3_GetDeviceStatus(dataPtr, len); + break; + case 200: + UART3_SetServoOffset(dataPtr, len); + break; + case 204: + UART3_GetServoOffset(dataPtr, len); + break; + case 201: + UART3_SetServoMaxAngle(dataPtr, len); + break; + case 202: + UART3_GetServoMaxAngle(dataPtr, len); + break; + case 203: + UART3_MoveServoToInitialPosition(dataPtr, len); + break; + case 206: + UART3_SetStartupDelay(dataPtr, len); + break; + case 207: + UART3_GetStartupDelay(dataPtr, len); + break; + case 210: + UART3_SetMinRollerSpeed(dataPtr, len); + break; + case 211: + UART3_GetMinRollerSpeed(dataPtr, len); + break; + case 212: + UART3_SetMinScrewSpeed(dataPtr, len); + break; + case 213: + UART3_GetMinScrewSpeed(dataPtr, len); + break; + case 214: + UART3_SetServoInvertFlag(dataPtr, len); + break; + case 215: + UART3_GetServoInvertFlag(dataPtr, len); + break; + case 181: + UART3_ReadStatistics(dataPtr, len); + break; + case 121: + UART3_ResetStatistics(dataPtr, len); + break; + default: + print("Unknown command"); + break; + } +} + diff --git a/Core/Src/main.c b/Core/Src/main.c index 2eca5ea..d4830e3 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -23,8 +23,6 @@ /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ -#include "GlobalDefines.h" - #include "usbd_cdc_if.h" #include "pca9685.h" #include "IR.h" @@ -34,6 +32,7 @@ #include "SimpleTimer.h" #include "RobotFunctions.h" #include "ShiftReg.h" +#include "UART3_Handler.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ @@ -59,6 +58,7 @@ TIM_HandleTypeDef htim2; TIM_HandleTypeDef htim3; UART_HandleTypeDef huart3; +DMA_HandleTypeDef hdma_usart3_rx; /* USER CODE BEGIN PV */ @@ -68,8 +68,6 @@ uint8_t velosety[600]; uint8_t rxcomlite = 0; uint8_t initcomlete = 0; -uint8_t uart_rx_buffer[UART_BUFFER_SIZE]; - unsigned char Shiftreg[3]; uint8_t rejim[60]; // 0 - chislo rejimov, 1-6 - rejim1, 7-12 - rejim2... @@ -84,10 +82,6 @@ uint16_t vi = 0; uint16_t timing1 = 0; uint16_t timing2 = 0; -struct Shot BufShots[MAX_NUMBER_SHOTS]; -struct Program BufPrograms; -struct Macro BufMacro; - extern PCD_HandleTypeDef hpcd_USB_FS; /* USER CODE END PV */ @@ -95,6 +89,7 @@ extern PCD_HandleTypeDef hpcd_USB_FS; /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); static void MX_GPIO_Init(void); +static void MX_DMA_Init(void); static void MX_I2C1_Init(void); static void MX_TIM1_Init(void); static void MX_TIM2_Init(void); @@ -126,7 +121,7 @@ int main(void) HAL_Init(); /* USER CODE BEGIN Init */ - + HAL_Delay(10); /* USER CODE END Init */ /* Configure the system clock */ @@ -142,10 +137,12 @@ int main(void) __HAL_RCC_USB_FORCE_RESET(); HAL_Delay(10); __HAL_RCC_USB_RELEASE_RESET(); + HAL_Delay(10); /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); + MX_DMA_Init(); MX_I2C1_Init(); MX_USB_DEVICE_Init(); MX_TIM1_Init(); @@ -153,29 +150,20 @@ int main(void) MX_TIM3_Init(); MX_USART3_UART_Init(); /* USER CODE BEGIN 2 */ + HAL_Delay(10); + __HAL_RCC_USART3_CLK_ENABLE(); + HAL_Delay(10); + __HAL_RCC_DMA1_CLK_ENABLE(); + HAL_Delay(10); HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1); //PA8 HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2); //PA9 - HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1); //PA0 HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2); //PA1 HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_3); //PA2 HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_4); //PA3 initPCA9685(); - - //BufShots[0].countRepeatShot = 5; - //BufShots[0].speedRollerTop = 120; - //BufShots[0].speedRollerBottom = 130; - //BufShots[0].speedScrew = 50; - //BufShots[0].rotationAxial = 90; - //BufShots[0].rotationHorizontal = 90; - //BufShots[0].rotationVertical = 90; - - // SaveShot(0, &BufShots[0]); - - // BufShots[1] = GetShot(0); - Shiftreg[0] = 0x00; Shiftreg[1] = 0x44; Shiftreg[2] = 0x00; SetShiftReg(Shiftreg); HAL_Delay(10); Shiftreg[0] = 0x00; Shiftreg[1] = 0x66; Shiftreg[2] = 0x00; SetShiftReg(Shiftreg); HAL_Delay(10); @@ -198,6 +186,7 @@ initcomlete = 1; HAL_TIM_Base_Start_IT(&htim3); HAL_NVIC_EnableIRQ(TIM3_IRQn); + UART3_START(); /* USER CODE END 2 */ @@ -226,148 +215,7 @@ initcomlete = 1; { IR_CMD_Handler(); - -// if (rxcomlite == 1) -// { -// -// txdata[0] = 'O'; -// txdata[1] = 'K'; -// txdata[2] = '?'; -// -// switch (rxdata[0]) -// { -// -// case 1: -// { -// SetServo(0, rxdata[1]); -// txdata[0] = 'O'; -// txdata[1] = 'K'; -// txdata[2] = '1'; -//// CDC_Transmit_FS(txdata, 3); -// break; -// } -// -// case 2: -// { -// SetServo(1, rxdata[1]); -// txdata[0] = 'O'; -// txdata[1] = 'K'; -// txdata[2] = '2'; -//// CDC_Transmit_FS(txdata, 3); -// break; -// } -// -// case 3: -// { -// SetServo(2, rxdata[1]); -// txdata[0] = 'O'; -// txdata[1] = 'K'; -// txdata[2] = '3'; -//// CDC_Transmit_FS(txdata, 3); -// break; -// } -// -// case 4: -// { -// SetServo(0, rxdata[1]); -// SetServo(1, rxdata[2]); -// SetServo(2, rxdata[3]); -// -// Vz1 = rxdata[4]; // rolic verh 0..200 -// Vz2 = rxdata[5]; // rolic niz 0..200 -// vi = 0; -// -// // shnek 0..100 -// if (rxdata[6] < 101) -// { -// TIM1->CCR1 = 0; -// TIM1->CCR2 = (uint16_t)(40 * rxdata[6]); -// } -// else -// { -// TIM1->CCR1 = 0; -// TIM1->CCR2 = 4000; -// } -// -// txdata[0] = 'O'; -// txdata[1] = 'K'; -// txdata[2] = '4'; -//// CDC_Transmit_FS(txdata, 3); -// break; -// } -// -// case 5: -// { -// txdata[0] = LOBYTE(timing1); -// txdata[1] = HIBYTE(timing1); -//// CDC_Transmit_FS(txdata, 3); -// break; -// } -// case 6: -// { -//// CDC_Transmit_FS(velosety, 600); -// break; -// } -// -// case 7: -// { -// rejim[0] = rxdata[1]; -// // copy to buffer -// for (uint8_t i = 0; i < rejim[0]; i++) -// { -// rejim[(i * 6) + 1] = rxdata[(i * 6) + 2]; -// rejim[(i * 6) + 2] = rxdata[(i * 6) + 3]; -// rejim[(i * 6) + 3] = rxdata[(i * 6) + 4]; -// rejim[(i * 6) + 4] = rxdata[(i * 6) + 5]; -// rejim[(i * 6) + 5] = rxdata[(i * 6) + 6]; -// rejim[(i * 6) + 6] = rxdata[(i * 6) + 7]; -// } -// // set rejim #1 -// SetServo(0, rejim[1]); -// SetServo(1, rejim[2]); -// SetServo(2, rejim[3]); -// Vz1 = rejim[4]; -// Vz2 = rejim[5]; -// TIM1->CCR1 = 0; -// TIM1->CCR2 = (uint16_t)(40 * rejim[6]); -// // set avto -// rejim_number = 1; -// avto = 1; -// break; -// } -// case 8: -// { // stop avto -// avto = 0; -// rejim_number = 1; -// // stop mecanics -// SetServo(0, 90); -// SetServo(1, 90); -// SetServo(2, 90); -// Vz1 = 100; -// Vz2 = 100; -// TIM1->CCR1 = 0; -// TIM1->CCR2 = 0; -// -// break; -// } -// -// case 9: -// { -// txdata[0] = avto; -// txdata[1] = rejim_number; -//// CDC_Transmit_FS(txdata, 3); -// -// break; -// } -// -// default: -// break; -// } -// -// rxcomlite = 0; -// -// // // HAL_Delay(1000); -// } + UART3_Handler(); forTimer(blinkTimer, 500) { @@ -693,7 +541,7 @@ static void MX_USART3_UART_Init(void) /* USER CODE END USART3_Init 1 */ huart3.Instance = USART3; - huart3.Init.BaudRate = 115200; + huart3.Init.BaudRate = 9600; huart3.Init.WordLength = UART_WORDLENGTH_8B; huart3.Init.StopBits = UART_STOPBITS_1; huart3.Init.Parity = UART_PARITY_NONE; @@ -705,14 +553,30 @@ static void MX_USART3_UART_Init(void) Error_Handler(); } /* USER CODE BEGIN USART3_Init 2 */ - if (HAL_UART_Receive_IT(&huart3, uart_rx_buffer, UART_BUFFER_SIZE) != HAL_OK) - { - Error_Handler(); - } +// if (HAL_UART_Receive_IT(&huart3, uart_rx_buffer, UART_BUFFER_SIZE) != HAL_OK) +// { +// Error_Handler(); +// } /* USER CODE END USART3_Init 2 */ } +/** + * Enable DMA controller clock + */ +static void MX_DMA_Init(void) +{ + + /* DMA controller clock enable */ + __HAL_RCC_DMA1_CLK_ENABLE(); + + /* DMA interrupt init */ + /* DMA1_Channel3_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(DMA1_Channel3_IRQn, 2, 0); + HAL_NVIC_EnableIRQ(DMA1_Channel3_IRQn); + +} + /** * @brief GPIO Initialization Function * @param None @@ -763,10 +627,10 @@ static void MX_GPIO_Init(void) HAL_GPIO_Init(IR_EXT_GPIO_Port, &GPIO_InitStruct); /* EXTI interrupt init*/ - HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0); + HAL_NVIC_SetPriority(EXTI0_IRQn, 7, 0); HAL_NVIC_EnableIRQ(EXTI0_IRQn); - HAL_NVIC_SetPriority(EXTI1_IRQn, 0, 0); + HAL_NVIC_SetPriority(EXTI1_IRQn, 7, 0); HAL_NVIC_EnableIRQ(EXTI1_IRQn); /* USER CODE BEGIN MX_GPIO_Init_2 */ diff --git a/Core/Src/stm32f1xx_hal_msp.c b/Core/Src/stm32f1xx_hal_msp.c index ac61953..cfcbe37 100644 --- a/Core/Src/stm32f1xx_hal_msp.c +++ b/Core/Src/stm32f1xx_hal_msp.c @@ -24,6 +24,7 @@ /* USER CODE BEGIN Includes */ /* USER CODE END Includes */ +extern DMA_HandleTypeDef hdma_usart3_rx; /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN TD */ @@ -348,8 +349,25 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart) GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(RX_GPIO_Port, &GPIO_InitStruct); + /* USART3 DMA Init */ + /* USART3_RX Init */ + hdma_usart3_rx.Instance = DMA1_Channel3; + 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_CIRCULAR; + hdma_usart3_rx.Init.Priority = DMA_PRIORITY_HIGH; + if (HAL_DMA_Init(&hdma_usart3_rx) != HAL_OK) + { + Error_Handler(); + } + + __HAL_LINKDMA(huart,hdmarx,hdma_usart3_rx); + /* USART3 interrupt Init */ - HAL_NVIC_SetPriority(USART3_IRQn, 0, 0); + HAL_NVIC_SetPriority(USART3_IRQn, 3, 0); HAL_NVIC_EnableIRQ(USART3_IRQn); /* USER CODE BEGIN USART3_MspInit 1 */ @@ -381,6 +399,9 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart) */ HAL_GPIO_DeInit(GPIOB, TX_Pin|RX_Pin); + /* USART3 DMA DeInit */ + HAL_DMA_DeInit(huart->hdmarx); + /* USART3 interrupt DeInit */ HAL_NVIC_DisableIRQ(USART3_IRQn); /* USER CODE BEGIN USART3_MspDeInit 1 */ diff --git a/Core/Src/stm32f1xx_it.c b/Core/Src/stm32f1xx_it.c index 719ad2d..ef2592e 100644 --- a/Core/Src/stm32f1xx_it.c +++ b/Core/Src/stm32f1xx_it.c @@ -28,8 +28,10 @@ #include "usb_device.h" #include "usbd_cdc_if.h" -#include "GlobalDefines.h" #include "Print.h" + +#include "UART3_Handler.h" +#include "SimpleTimer.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ @@ -50,17 +52,22 @@ /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN PV */ +extern uint8_t uart_rx_buffer[UART_BUFFER_SIZE]; +extern volatile uint16_t packet_index; +extern volatile uint32_t uartTimer; +extern volatile uint8_t uart_rx_in_progress; + uint8_t myi; extern uint16_t vi; // ������� ���������� ������ ��� �� 0..599 -uint16_t v1[30]; // ������ ��������� (�������) [0] - ����� ���������, [1-29] - ������ +uint16_t v1[30]; // ������ ��������� (�������) [0] - ����� ���������, [1-29] - ������ uint16_t v2[30]; uint32_t vt1 = 0; // ����������� �������� (�� ������� ���������) (�������) uint32_t vt2 = 0; -uint16_t vs1[4] = {0, 0, 0, 0}; // ������ ����������� �������� �� 3 ��������� -uint16_t vs2[4] = {0, 0, 0, 0}; //[0] - ������� �������� �������� - //[1-3] - �������� �� vt +uint16_t vs1[4] = { 0, 0, 0, 0 }; // ������ ����������� �������� �� 3 ��������� +uint16_t vs2[4] = { 0, 0, 0, 0 }; //[0] - ������� �������� �������� +//[1-3] - �������� �� vt uint32_t vsk1 = 0; // ���������� ������� �������� (�������) uint32_t vsk2 = 0; @@ -71,7 +78,7 @@ uint16_t Vupr1 = 0; // ������� ��� �������� uint16_t Vzad2 = 0; // ������� �������� ������� ������ uint16_t Vupr2 = 0; // ������� ��� ������� ������ -extern uint8_t rejim[60]; // 0 - chislo rejimov, 1-6 - rejim1, 7-12 - rejim2... +extern uint8_t rejim[60]; // 0 - chislo rejimov, 1-6 - rejim1, 7-12 - rejim2... extern uint8_t avto; // vkl/otkl avtomaticheskoi raboti extern uint8_t rejim_number; // nomer tekyshego rejima @@ -93,86 +100,72 @@ int32_t computePID2(uint16_t input, uint16_t setpoint); /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ -int32_t computePID1(uint16_t input, uint16_t setpoint) -{ - static int32_t integral = 0, prevErr = 0; // ������������ ������������ � ���������� ������ +int32_t computePID1(uint16_t input, uint16_t setpoint) { + static int32_t integral = 0, prevErr = 0; // ������������ ������������ � ���������� ������ - int32_t err = setpoint - input; // 1.������ + int32_t err = setpoint - input; // 1.������ - integral = integral + err / 20; // 2.������������ ������������ dt = 0.01, ki = 5; + integral = integral + err / 20; // 2.������������ ������������ dt = 0.01, ki = 5; - if (integral > 4000) - { - integral = 4000; - } - if (integral < 0) - { - integral = 0; - } + if (integral > 4000) { + integral = 4000; + } + if (integral < 0) { + integral = 0; + } - int32_t D = (err - prevErr); // 3.���������������� ������������ dt = 0.01, kd = 0.01 - if (D > 4000) - { - D = 4000; - } - if (D < 0) - { - D = 0; - } + int32_t D = (err - prevErr); // 3.���������������� ������������ dt = 0.01, kd = 0.01 + if (D > 4000) { + D = 4000; + } + if (D < 0) { + D = 0; + } - prevErr = err; - // - int32_t Rout = ((err * 3) >> 1) + integral + D; // 4. �=1,5 + �=5 + �=0.01 - if (Rout > 4000) - { - Rout = 4000; - } // - if (Rout < 0) - { - Rout = 0; - } // + prevErr = err; + // + int32_t Rout = ((err * 3) >> 1) + integral + D; // 4. �=1,5 + �=5 + �=0.01 + if (Rout > 4000) { + Rout = 4000; + } // + if (Rout < 0) { + Rout = 0; + } // - return Rout; + return Rout; } -int32_t computePID2(uint16_t input, uint16_t setpoint) -{ - static int32_t integral = 0, prevErr = 0; // ������������ ������������ � ���������� ������ - int32_t err = setpoint - input; // 1.������ +int32_t computePID2(uint16_t input, uint16_t setpoint) { + static int32_t integral = 0, prevErr = 0; // ������������ ������������ � ���������� ������ + int32_t err = setpoint - input; // 1.������ - integral = integral + err / 20; // 2.������������ ������������ dt = 0.01, ki = 5; - if (integral > 4000) - { - integral = 4000; - } - if (integral < 0) - { - integral = 0; - } + integral = integral + err / 20; // 2.������������ ������������ dt = 0.01, ki = 5; + if (integral > 4000) { + integral = 4000; + } + if (integral < 0) { + integral = 0; + } - int32_t D = (err - prevErr); // 3.���������������� ������������ dt = 0.01, kd = 0.01 - if (D > 4000) - { - D = 4000; - } - if (D < 0) - { - D = 0; - } + int32_t D = (err - prevErr); // 3.���������������� ������������ dt = 0.01, kd = 0.01 + if (D > 4000) { + D = 4000; + } + if (D < 0) { + D = 0; + } - prevErr = err; - // - int32_t Rout = ((err * 3) >> 1) + integral + D; // 4. �=1,5 + �=5 + �=0.01 - if (Rout > 4000) - { - Rout = 4000; - } // - if (Rout < 0) - { - Rout = 0; - } // + prevErr = err; + // + int32_t Rout = ((err * 3) >> 1) + integral + D; // 4. �=1,5 + �=5 + �=0.01 + if (Rout > 4000) { + Rout = 4000; + } // + if (Rout < 0) { + Rout = 0; + } // - return Rout; + return Rout; } /* USER CODE END 0 */ @@ -180,6 +173,7 @@ int32_t computePID2(uint16_t input, uint16_t setpoint) extern PCD_HandleTypeDef hpcd_USB_FS; extern I2C_HandleTypeDef hi2c1; extern TIM_HandleTypeDef htim3; +extern DMA_HandleTypeDef hdma_usart3_rx; extern UART_HandleTypeDef huart3; /* USER CODE BEGIN EV */ extern uint8_t uart_rx_buffer[UART_BUFFER_SIZE]; @@ -197,9 +191,8 @@ void NMI_Handler(void) /* USER CODE END NonMaskableInt_IRQn 0 */ /* USER CODE BEGIN NonMaskableInt_IRQn 1 */ - while (1) - { - } + while (1) { + } /* USER CODE END NonMaskableInt_IRQn 1 */ } @@ -309,175 +302,152 @@ void SysTick_Handler(void) { /* USER CODE BEGIN SysTick_IRQn 0 */ - // ��������� ������� ��������� ��������� 1 - if (v1[0] > 0) - { // ��������� ���� �� ���������� ������ � ������ ��������� - // ������� ������� �������� - vt1 = 0; - for (uint8_t i = 1; i <= v1[0]; i++) - { - vt1 += v1[i]; - } - vt1 = vt1 / v1[0]; - // ���� �� ����� ������ ���, �� ����� ��������� ���������� �������� - // �������� - } - else - { - vt1 = timing1; - } - v1[0] = 0; // �������� ������� ��������� ������� ��������� - // ������ ������ �������� ������ + // ��������� ������� ��������� ��������� 1 + if (v1[0] > 0) { // ��������� ���� �� ���������� ������ � ������ ��������� + // ������� ������� �������� + vt1 = 0; + for (uint8_t i = 1; i <= v1[0]; i++) { + vt1 += v1[i]; + } + vt1 = vt1 / v1[0]; + // ���� �� ����� ������ ���, �� ����� ��������� ���������� �������� + // �������� + } else { + vt1 = timing1; + } + v1[0] = 0; // �������� ������� ��������� ������� ��������� + // ������ ������ �������� ������ - // ��������� ������� ��������� ��������� 2 - if (v2[0] > 0) - { // ��������� ���� �� ���������� ������ � ������ ��������� - // ������� ������� �������� - vt2 = 0; - for (uint8_t i = 1; i <= v2[0]; i++) - { - vt2 += v2[i]; - } - vt2 = vt2 / v2[0]; - // ���� �� ����� ������ ���, �� ����� ��������� ���������� �������� - // �������� - } - else - { - vt2 = timing2; - } - v2[0] = 0; // �������� ������� ��������� ������� ��������� - // ������ ������ �������� ������ + // ��������� ������� ��������� ��������� 2 + if (v2[0] > 0) { // ��������� ���� �� ���������� ������ � ������ ��������� + // ������� ������� �������� + vt2 = 0; + for (uint8_t i = 1; i <= v2[0]; i++) { + vt2 += v2[i]; + } + vt2 = vt2 / v2[0]; + // ���� �� ����� ������ ���, �� ����� ��������� ���������� �������� + // �������� + } else { + vt2 = timing2; + } + v2[0] = 0; // �������� ������� ��������� ������� ��������� + // ������ ������ �������� ������ - // ���������� ������� �� 3 - if (vs1[0] < 3) - { - vs1[vs1[0] + 1] = (uint16_t)vt1; - vs1[0]++; - } - else - { - vs1[0] = 0; - vs1[vs1[0] + 1] = (uint16_t)vt1; - vs1[0]++; - } + // ���������� ������� �� 3 + if (vs1[0] < 3) { + vs1[vs1[0] + 1] = (uint16_t) vt1; + vs1[0]++; + } else { + vs1[0] = 0; + vs1[vs1[0] + 1] = (uint16_t) vt1; + vs1[0]++; + } - vsk1 = (vs1[1] + vs1[2] + vs1[3]) / 3; + vsk1 = (vs1[1] + vs1[2] + vs1[3]) / 3; - if (vs2[0] < 3) - { - vs2[vs2[0] + 1] = (uint16_t)vt2; - vs2[0]++; - } - else - { - vs2[0] = 0; - vs2[vs2[0] + 1] = (uint16_t)vt2; - vs2[0]++; - } + if (vs2[0] < 3) { + vs2[vs2[0] + 1] = (uint16_t) vt2; + vs2[0]++; + } else { + vs2[0] = 0; + vs2[vs2[0] + 1] = (uint16_t) vt2; + vs2[0]++; + } - vsk2 = (vs2[1] + vs2[2] + vs2[3]) / 3; + vsk2 = (vs2[1] + vs2[2] + vs2[3]) / 3; - // ������� ������� ����� ���������� � �������� 60*1000000/(�*10) - if (vsk1 != 0) - { - vsk1 = 6000000 / vsk1; - } - else - { - vsk1 = 0; - } - if (vsk1 > 10000) vsk1 = 10000; - if (vsk1 < 150) vsk1 = 0; + // ������� ������� ����� ���������� � �������� 60*1000000/(�*10) + if (vsk1 != 0) { + vsk1 = 6000000 / vsk1; + } else { + vsk1 = 0; + } + if (vsk1 > 10000) + vsk1 = 10000; + if (vsk1 < 150) + vsk1 = 0; - if (vsk2 != 0) - { - vsk2 = 6000000 / vsk2; - } - else - { - vsk2 = 0; - } - if (vsk2 > 10000) - vsk2 = 10000; - if (vsk2 < 150) - vsk2 = 0; + if (vsk2 != 0) { + vsk2 = 6000000 / vsk2; + } else { + vsk2 = 0; + } + if (vsk2 > 10000) + vsk2 = 10000; + if (vsk2 < 150) + vsk2 = 0; - // ������� ��������� �������� 0 - 200 � -8000 ... 8000 ��./���. - if (Vz1 < 0) {Vz1 = 0;} - if (Vz1 > 200) {Vz1 = 200;} - if (Vz2 < 0) {Vz2 = 0;} - if (Vz2 > 200) {Vz2 = 200;} + // ������� ��������� �������� 0 - 200 � -8000 ... 8000 ��./���. + if (Vz1 < 0) { + Vz1 = 0; + } + if (Vz1 > 200) { + Vz1 = 200; + } + if (Vz2 < 0) { + Vz2 = 0; + } + if (Vz2 > 200) { + Vz2 = 200; + } - if (Vz1 > 100) - { - Vzad1 = (Vz1 - 100) * 80; - } - else - { - Vzad1 = (100 - Vz1) * 80; - } - if (Vz2 > 100) - { - Vzad2 = (Vz2 - 100) * 80; - } - else - { - Vzad2 = (100 - Vz2) * 80; - } + if (Vz1 > 100) { + Vzad1 = (Vz1 - 100) * 80; + } else { + Vzad1 = (100 - Vz1) * 80; + } + if (Vz2 > 100) { + Vzad2 = (Vz2 - 100) * 80; + } else { + Vzad2 = (100 - Vz2) * 80; + } - // ��������� - Vupr1 = (uint16_t)computePID1(vsk1, Vzad1); - Vupr2 = (uint16_t)computePID2(vsk2, Vzad2); + // ��������� + Vupr1 = (uint16_t) computePID1(vsk1, Vzad1); + Vupr2 = (uint16_t) computePID2(vsk2, Vzad2); - if (Vz1 > 100) - { - TIM2->CCR2 = 0; - TIM2->CCR1 = Vupr1; - } - else - { - TIM2->CCR1 = 0; - TIM2->CCR2 = Vupr1; - } + if (Vz1 > 100) { + TIM2->CCR2 = 0; + TIM2->CCR1 = Vupr1; + } else { + TIM2->CCR1 = 0; + TIM2->CCR2 = Vupr1; + } - if (Vz2 > 100) - { - TIM2->CCR3 = 0; - TIM2->CCR4 = Vupr2; - } - else - { - TIM2->CCR4 = 0; - TIM2->CCR3 = Vupr2; - } + if (Vz2 > 100) { + TIM2->CCR3 = 0; + TIM2->CCR4 = Vupr2; + } else { + TIM2->CCR4 = 0; + TIM2->CCR3 = Vupr2; + } // TIM2->CCR4 = 0xffff; // TIM2->CCR3 = 0xffff; // TIM2->CCR1 = 0xffff; // TIM2->CCR2 = 0xffff; - // ������ ���������� �������� � ����� ��� �� - if (vi < 600) - { - velosety[vi] = LOBYTE(timing1); - velosety[vi + 1] = HIBYTE(timing1); - velosety[vi + 2] = LOBYTE(vsk1); - velosety[vi + 3] = HIBYTE(vsk1); - velosety[vi + 4] = LOBYTE(vsk2); - velosety[vi + 5] = HIBYTE(vsk2); - vi = vi + 6; - } + // ������ ���������� �������� � ����� ��� �� + if (vi < 600) { + velosety[vi] = LOBYTE(timing1); + velosety[vi + 1] = HIBYTE(timing1); + velosety[vi + 2] = LOBYTE(vsk1); + velosety[vi + 3] = HIBYTE(vsk1); + velosety[vi + 4] = LOBYTE(vsk2); + velosety[vi + 5] = HIBYTE(vsk2); + vi = vi + 6; + } - // else - // {vi = 0; - // velosety[vi] = LOBYTE(timing1); - // velosety[vi+1] = HIBYTE(timing1); - // velosety[vi+2] = LOBYTE(vt); - // velosety[vi+3] = HIBYTE(vt); - // velosety[vi+4] = LOBYTE(vsk); - // velosety[vi+5] = HIBYTE(vsk); - // vi = vi + 6; } + // else + // {vi = 0; + // velosety[vi] = LOBYTE(timing1); + // velosety[vi+1] = HIBYTE(timing1); + // velosety[vi+2] = LOBYTE(vt); + // velosety[vi+3] = HIBYTE(vt); + // velosety[vi+4] = LOBYTE(vsk); + // velosety[vi+5] = HIBYTE(vsk); + // vi = vi + 6; } /* USER CODE END SysTick_IRQn 0 */ HAL_IncTick(); @@ -528,7 +498,7 @@ void EXTI0_IRQHandler(void) void EXTI1_IRQHandler(void) { /* USER CODE BEGIN EXTI1_IRQn 0 */ - IR_handler(); + IR_handler(); /* USER CODE END EXTI1_IRQn 0 */ HAL_GPIO_EXTI_IRQHandler(IR_EXT_Pin); /* USER CODE BEGIN EXTI1_IRQn 1 */ @@ -536,6 +506,20 @@ void EXTI1_IRQHandler(void) /* USER CODE END EXTI1_IRQn 1 */ } +/** + * @brief This function handles DMA1 channel3 global interrupt. + */ +void DMA1_Channel3_IRQHandler(void) +{ + /* USER CODE BEGIN DMA1_Channel3_IRQn 0 */ + + /* USER CODE END DMA1_Channel3_IRQn 0 */ + HAL_DMA_IRQHandler(&hdma_usart3_rx); + /* USER CODE BEGIN DMA1_Channel3_IRQn 1 */ + + /* USER CODE END DMA1_Channel3_IRQn 1 */ +} + /** * @brief This function handles USB low priority or CAN RX0 interrupts. */ @@ -557,82 +541,67 @@ void TIM3_IRQHandler(void) { /* USER CODE BEGIN TIM3_IRQn 0 */ - static uint32_t prev_capture1 = 0; - static uint32_t prev_capture2 = 0; + static uint32_t prev_capture1 = 0; + static uint32_t prev_capture2 = 0; - uint32_t current_capture1 = 0; - uint32_t current_capture2 = 0; - uint32_t elapsed_time1 = 0; - uint32_t elapsed_time2 = 0; + uint32_t current_capture1 = 0; + uint32_t current_capture2 = 0; + uint32_t elapsed_time1 = 0; + uint32_t elapsed_time2 = 0; - /* USER CODE BEGIN TIM3_IRQn 0 */ + /* USER CODE BEGIN TIM3_IRQn 0 */ - // Обработка переполнения таймера - if (TIM3->SR & TIM_SR_UIF) - { - current_capture1 = 0xFFFFFFFF; - current_capture2 = 0xFFFFFFFF; - // Сброс флага переполнения - TIM3->SR &= ~TIM_SR_UIF; - } + // Обработка переполнения таймера + if (TIM3->SR & TIM_SR_UIF) { + current_capture1 = 0xFFFFFFFF; + current_capture2 = 0xFFFFFFFF; + // Сброс флага переполнения + TIM3->SR &= ~TIM_SR_UIF; + } - // Обработка захвата сигнала для канала 1 - if (TIM3->SR & TIM_SR_CC1IF) - { - current_capture1 = TIM3->CCR1; + // Обработка захвата сигнала для канала 1 + if (TIM3->SR & TIM_SR_CC1IF) { + current_capture1 = TIM3->CCR1; - if (current_capture1 >= prev_capture1) - { - elapsed_time1 = current_capture1 - prev_capture1; - } - else - { - // Учёт переполнения таймера - elapsed_time1 = (65000 - prev_capture1) + current_capture1 + 1; - } + if (current_capture1 >= prev_capture1) { + elapsed_time1 = current_capture1 - prev_capture1; + } else { + // Учёт переполнения таймера + elapsed_time1 = (65000 - prev_capture1) + current_capture1 + 1; + } - // Ограничение значения для сохранения в 16-битную переменную - if (elapsed_time1 > 65535) - { - timing1 = 65535; // Максимальное значение - } - else - { - timing1 = (uint16_t)elapsed_time1; - } + // Ограничение значения для сохранения в 16-битную переменную + if (elapsed_time1 > 65535) { + timing1 = 65535; // Максимальное значение + } else { + timing1 = (uint16_t) elapsed_time1; + } - prev_capture1 = current_capture1; - TIM3->SR &= ~TIM_SR_CC1IF; // Сброс флага захвата сигнала - } + prev_capture1 = current_capture1; + TIM3->SR &= ~TIM_SR_CC1IF; // Сброс флага захвата сигнала + } - // Обработка захвата сигнала для канала 2 - if (TIM3->SR & TIM_SR_CC2IF) - { - current_capture2 = TIM3->CCR2; + // Обработка захвата сигнала для канала 2 + if (TIM3->SR & TIM_SR_CC2IF) { + current_capture2 = TIM3->CCR2; - if (current_capture2 >= prev_capture2) - { - elapsed_time2 = current_capture2 - prev_capture2; - } - else - { - // Учёт переполнения таймера - elapsed_time2 = (65000 - prev_capture2) + current_capture2 + 1; - } + if (current_capture2 >= prev_capture2) { + elapsed_time2 = current_capture2 - prev_capture2; + } else { + // Учёт переполнения таймера + elapsed_time2 = (65000 - prev_capture2) + current_capture2 + 1; + } - // Ограничение значения для сохранения в 16-битную переменную - if (elapsed_time2 > 65535) - { - timing2 = 65535; // Максимальное значение - } - else - { - timing2 = (uint16_t)elapsed_time2; - } + // Ограничение значения для сохранения в 16-битную переменную + if (elapsed_time2 > 65535) { + timing2 = 65535; // Максимальное значение + } else { + timing2 = (uint16_t) elapsed_time2; + } - prev_capture2 = current_capture2; - TIM3->SR &= ~TIM_SR_CC2IF; // Сброс флага захвата сигнала - } + prev_capture2 = current_capture2; + TIM3->SR &= ~TIM_SR_CC2IF; // Сброс флага захвата сигнала + } /* USER CODE END TIM3_IRQn 0 */ HAL_TIM_IRQHandler(&htim3); @@ -675,15 +644,19 @@ void I2C1_ER_IRQHandler(void) void USART3_IRQHandler(void) { /* USER CODE BEGIN USART3_IRQn 0 */ - HAL_UART_Receive_IT(&huart3, uart_rx_buffer, UART_BUFFER_SIZE); - // CDC_Transmit_FS(uart_rx_buffer, UART_BUFFER_SIZE); - - +// if (USART3->SR & USART_SR_RXNE) { +// uartTimer = millis(); +// uart_rx_in_progress = 1; +// uint8_t received_byte = (uint8_t) (USART3->DR & 0xFF); +// uart_rx_buffer[uart_rx_index++] = received_byte; +// if (uart_rx_index >= UART_BUFFER_SIZE) { +// uart_rx_index = 0; +// } +// } /* USER CODE END USART3_IRQn 0 */ HAL_UART_IRQHandler(&huart3); /* USER CODE BEGIN USART3_IRQn 1 */ - /* USER CODE END USART3_IRQn 1 */ } diff --git a/StackSport.ioc b/StackSport.ioc index f6d6e04..cc8055b 100644 --- a/StackSport.ioc +++ b/StackSport.ioc @@ -2,22 +2,34 @@ CAD.formats= CAD.pinconfig= CAD.provider= +Dma.Request0=USART3_RX +Dma.RequestsNb=1 +Dma.USART3_RX.0.Direction=DMA_PERIPH_TO_MEMORY +Dma.USART3_RX.0.Instance=DMA1_Channel3 +Dma.USART3_RX.0.MemDataAlignment=DMA_MDATAALIGN_BYTE +Dma.USART3_RX.0.MemInc=DMA_MINC_ENABLE +Dma.USART3_RX.0.Mode=DMA_CIRCULAR +Dma.USART3_RX.0.PeriphDataAlignment=DMA_PDATAALIGN_BYTE +Dma.USART3_RX.0.PeriphInc=DMA_PINC_DISABLE +Dma.USART3_RX.0.Priority=DMA_PRIORITY_HIGH +Dma.USART3_RX.0.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority File.Version=6 GPIO.groupedBy=Group By Peripherals KeepUserPlacement=false Mcu.CPN=STM32F103C8T6 Mcu.Family=STM32F1 -Mcu.IP0=I2C1 -Mcu.IP1=NVIC -Mcu.IP2=RCC -Mcu.IP3=SYS -Mcu.IP4=TIM1 -Mcu.IP5=TIM2 -Mcu.IP6=TIM3 -Mcu.IP7=USART3 -Mcu.IP8=USB -Mcu.IP9=USB_DEVICE -Mcu.IPNb=10 +Mcu.IP0=DMA +Mcu.IP1=I2C1 +Mcu.IP10=USB_DEVICE +Mcu.IP2=NVIC +Mcu.IP3=RCC +Mcu.IP4=SYS +Mcu.IP5=TIM1 +Mcu.IP6=TIM2 +Mcu.IP7=TIM3 +Mcu.IP8=USART3 +Mcu.IP9=USB +Mcu.IPNb=11 Mcu.Name=STM32F103C(8-B)Tx Mcu.Package=LQFP48 Mcu.Pin0=PC13-TAMPER-RTC @@ -55,22 +67,23 @@ Mcu.UserName=STM32F103C8Tx MxCube.Version=6.12.0 MxDb.Version=DB.6.0.120 NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.DMA1_Channel3_IRQn=true\:2\:0\:true\:false\:true\:false\:true\:true NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false -NVIC.EXTI0_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true -NVIC.EXTI1_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true +NVIC.EXTI0_IRQn=true\:7\:0\:true\:false\:true\:true\:true\:true +NVIC.EXTI1_IRQn=true\:7\:0\:true\:false\:true\:true\:true\:true NVIC.ForceEnableDMAVector=true NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false NVIC.I2C1_ER_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true -NVIC.I2C1_EV_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true +NVIC.I2C1_EV_IRQn=true\:0\:0\:true\:false\:true\:true\:true\:true NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:true\:false\:true\:false -NVIC.TIM3_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true -NVIC.USART3_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true -NVIC.USB_LP_CAN1_RX0_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:true +NVIC.TIM3_IRQn=true\:0\:0\:true\:false\:true\:true\:true\:true +NVIC.USART3_IRQn=true\:3\:0\:true\:false\:true\:true\:true\:true +NVIC.USB_LP_CAN1_RX0_IRQn=true\:1\:0\:true\:false\:true\:false\:true\:true NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false PA0-WKUP.GPIOParameters=GPIO_Speed,GPIO_Label PA0-WKUP.GPIO_Label=RPWM_UP @@ -187,7 +200,7 @@ ProjectManager.ToolChainLocation= 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_I2C1_Init-I2C1-false-HAL-true,4-MX_USB_DEVICE_Init-USB_DEVICE-false-HAL-false,5-MX_TIM1_Init-TIM1-false-HAL-true,6-MX_TIM2_Init-TIM2-false-HAL-true,7-MX_TIM3_Init-TIM3-false-HAL-true,8-MX_USART3_UART_Init-USART3-false-HAL-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_I2C1_Init-I2C1-false-HAL-true,5-MX_USB_DEVICE_Init-USB_DEVICE-false-HAL-false,6-MX_TIM1_Init-TIM1-false-HAL-true,7-MX_TIM2_Init-TIM2-false-HAL-true,8-MX_TIM3_Init-TIM3-false-HAL-true,9-MX_USART3_UART_Init-USART3-false-HAL-true RCC.ADCFreqValue=24000000 RCC.AHBFreq_Value=48000000 RCC.APB1CLKDivider=RCC_HCLK_DIV2 @@ -243,7 +256,8 @@ TIM3.Channel-Input_Capture2_from_TI2=TIM_CHANNEL_2 TIM3.IPParameters=Channel-Input_Capture1_from_TI1,Channel-Input_Capture2_from_TI2,Prescaler,Period TIM3.Period=65000 TIM3.Prescaler=47 -USART3.IPParameters=VirtualMode +USART3.BaudRate=9600 +USART3.IPParameters=VirtualMode,BaudRate USART3.VirtualMode=VM_ASYNC USB_DEVICE.APP_RX_DATA_SIZE=64 USB_DEVICE.APP_TX_DATA_SIZE=64 diff --git a/USB_DEVICE/App/usbd_cdc_if.c b/USB_DEVICE/App/usbd_cdc_if.c index dc235ba..104c453 100644 --- a/USB_DEVICE/App/usbd_cdc_if.c +++ b/USB_DEVICE/App/usbd_cdc_if.c @@ -1,21 +1,21 @@ /* USER CODE BEGIN Header */ /** - ****************************************************************************** - * @file : usbd_cdc_if.c - * @version : v2.0_Cube - * @brief : Usb device for Virtual Com Port. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ + ****************************************************************************** + * @file : usbd_cdc_if.c + * @version : v2.0_Cube + * @brief : Usb device for Virtual Com Port. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ @@ -150,10 +150,10 @@ USBD_CDC_ItfTypeDef USBD_Interface_fops_FS = static int8_t CDC_Init_FS(void) { /* USER CODE BEGIN 3 */ - /* Set Application Buffers */ - USBD_CDC_SetTxBuffer(&hUsbDeviceFS, UserTxBufferFS, 0); - USBD_CDC_SetRxBuffer(&hUsbDeviceFS, UserRxBufferFS); - return (USBD_OK); + /* Set Application Buffers */ + USBD_CDC_SetTxBuffer(&hUsbDeviceFS, UserTxBufferFS, 0); + USBD_CDC_SetRxBuffer(&hUsbDeviceFS, UserRxBufferFS); + return (USBD_OK); /* USER CODE END 3 */ } @@ -164,7 +164,7 @@ static int8_t CDC_Init_FS(void) static int8_t CDC_DeInit_FS(void) { /* USER CODE BEGIN 4 */ - return (USBD_OK); + return (USBD_OK); /* USER CODE END 4 */ } @@ -178,66 +178,65 @@ static int8_t CDC_DeInit_FS(void) static int8_t CDC_Control_FS(uint8_t cmd, uint8_t* pbuf, uint16_t length) { /* USER CODE BEGIN 5 */ - switch(cmd) - { - case CDC_SEND_ENCAPSULATED_COMMAND: + switch (cmd) { + case CDC_SEND_ENCAPSULATED_COMMAND: - break; + break; - case CDC_GET_ENCAPSULATED_RESPONSE: + case CDC_GET_ENCAPSULATED_RESPONSE: - break; + break; - case CDC_SET_COMM_FEATURE: + case CDC_SET_COMM_FEATURE: - break; + break; - case CDC_GET_COMM_FEATURE: + case CDC_GET_COMM_FEATURE: - break; + break; - case CDC_CLEAR_COMM_FEATURE: + case CDC_CLEAR_COMM_FEATURE: - break; + break; - /*******************************************************************************/ - /* Line Coding Structure */ - /*-----------------------------------------------------------------------------*/ - /* Offset | Field | Size | Value | Description */ - /* 0 | dwDTERate | 4 | Number |Data terminal rate, in bits per second*/ - /* 4 | bCharFormat | 1 | Number | Stop bits */ - /* 0 - 1 Stop bit */ - /* 1 - 1.5 Stop bits */ - /* 2 - 2 Stop bits */ - /* 5 | bParityType | 1 | Number | Parity */ - /* 0 - None */ - /* 1 - Odd */ - /* 2 - Even */ - /* 3 - Mark */ - /* 4 - Space */ - /* 6 | bDataBits | 1 | Number Data bits (5, 6, 7, 8 or 16). */ - /*******************************************************************************/ - case CDC_SET_LINE_CODING: + /*******************************************************************************/ + /* Line Coding Structure */ + /*-----------------------------------------------------------------------------*/ + /* Offset | Field | Size | Value | Description */ + /* 0 | dwDTERate | 4 | Number |Data terminal rate, in bits per second*/ + /* 4 | bCharFormat | 1 | Number | Stop bits */ + /* 0 - 1 Stop bit */ + /* 1 - 1.5 Stop bits */ + /* 2 - 2 Stop bits */ + /* 5 | bParityType | 1 | Number | Parity */ + /* 0 - None */ + /* 1 - Odd */ + /* 2 - Even */ + /* 3 - Mark */ + /* 4 - Space */ + /* 6 | bDataBits | 1 | Number Data bits (5, 6, 7, 8 or 16). */ + /*******************************************************************************/ + case CDC_SET_LINE_CODING: - break; + break; - case CDC_GET_LINE_CODING: + case CDC_GET_LINE_CODING: - break; + break; - case CDC_SET_CONTROL_LINE_STATE: + case CDC_SET_CONTROL_LINE_STATE: - break; + break; - case CDC_SEND_BREAK: + case CDC_SEND_BREAK: - break; + break; - default: - break; - } + default: + break; + } - return (USBD_OK); + return (USBD_OK); /* USER CODE END 5 */ } @@ -259,9 +258,9 @@ static int8_t CDC_Control_FS(uint8_t cmd, uint8_t* pbuf, uint16_t length) static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len) { /* USER CODE BEGIN 6 */ - USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]); - USBD_CDC_ReceivePacket(&hUsbDeviceFS); - return (USBD_OK); + USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]); + USBD_CDC_ReceivePacket(&hUsbDeviceFS); + return (USBD_OK); /* USER CODE END 6 */ } @@ -280,13 +279,20 @@ uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len) { uint8_t result = USBD_OK; /* USER CODE BEGIN 7 */ - USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDeviceFS.pClassData; - if (hcdc->TxState != 0){ - return USBD_BUSY; - } - USBD_CDC_SetTxBuffer(&hUsbDeviceFS, Buf, Len); - result = USBD_CDC_TransmitPacket(&hUsbDeviceFS); - while(hcdc->TxState != 0); + USBD_CDC_HandleTypeDef *hcdc = + (USBD_CDC_HandleTypeDef*) hUsbDeviceFS.pClassData; + if (hcdc->TxState != 0) { + return USBD_BUSY; + } + USBD_CDC_SetTxBuffer(&hUsbDeviceFS, Buf, Len); + result = USBD_CDC_TransmitPacket(&hUsbDeviceFS); + volatile uint32_t timeout = 5000; + while (hcdc->TxState != 0) { + if (!timeout) { + return USBD_FAIL; + } + timeout--; + } /* USER CODE END 7 */ return result; } diff --git a/USB_DEVICE/Target/usbd_conf.c b/USB_DEVICE/Target/usbd_conf.c index dc3d435..fe0c46d 100644 --- a/USB_DEVICE/Target/usbd_conf.c +++ b/USB_DEVICE/Target/usbd_conf.c @@ -77,7 +77,7 @@ void HAL_PCD_MspInit(PCD_HandleTypeDef* pcdHandle) __HAL_RCC_USB_CLK_ENABLE(); /* Peripheral interrupt init */ - HAL_NVIC_SetPriority(USB_LP_CAN1_RX0_IRQn, 0, 0); + HAL_NVIC_SetPriority(USB_LP_CAN1_RX0_IRQn, 1, 0); HAL_NVIC_EnableIRQ(USB_LP_CAN1_RX0_IRQn); /* USER CODE BEGIN USB_MspInit 1 */