From fbd36705f1b80d9118f61b451706e333a564b986 Mon Sep 17 00:00:00 2001 From: Razvalyaev Date: Fri, 12 Sep 2025 12:22:17 +0300 Subject: [PATCH] =?UTF-8?q?=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D0=B5?= =?UTF-8?q?=D1=82=20=D0=BD=D0=BE=20=D0=BD=D0=B5=20=D1=81=D1=82=D0=B0=D0=B1?= =?UTF-8?q?=D0=B8=D0=BB=D1=8C=D0=BD=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Core/Bootloader/boot_can.c | 1 + Core/Bootloader/boot_main.c | 12 +- Core/Bootloader/boot_project_setup.h | 28 +++- Core/Bootloader/boot_uart.h | 4 + Core/Bootloader/bootloader.c | 197 +++++++++++++++------------ Core/Bootloader/bootloader.h | 45 ++++-- Core/Src/main.c | 66 +++++---- MDK-ARM/uksvep_2_2_v1.uvoptx | 90 ++++-------- 8 files changed, 240 insertions(+), 203 deletions(-) diff --git a/Core/Bootloader/boot_can.c b/Core/Bootloader/boot_can.c index 77d73c7..19528b1 100644 --- a/Core/Bootloader/boot_can.c +++ b/Core/Bootloader/boot_can.c @@ -119,6 +119,7 @@ void Bootloader_CAN_Receive_Page(Bootloader_t *bl) } } + // Таймаут if(HAL_GetTick() - start_tick >= FW_RECEIVE_TIMEOUT_MS) { bl->error.bit.timeout_receive = 1; diff --git a/Core/Bootloader/boot_main.c b/Core/Bootloader/boot_main.c index dad8f4e..3af2bdf 100644 --- a/Core/Bootloader/boot_main.c +++ b/Core/Bootloader/boot_main.c @@ -6,11 +6,7 @@ int main() __disable_irq(); SCB->VTOR = 0x08000000; __enable_irq(); - - /* Включаем тактирование PWR и BKP (APB1) и разрешаем доступ к BKP domain */ - /* Записываем напрямую в регистры RCC/APB1ENR и PWR->CR */ - RCC->APB1ENR |= (RCC_APB1ENR_PWREN | RCC_APB1ENR_BKPEN); - + boot.state = BL_STATE_INIT; while (1) { @@ -88,6 +84,9 @@ void HardFault_Handler(void) { /* USER CODE BEGIN HardFault_IRQn 0 */ + /* Включаем тактирование PWR и BKP (APB1) и разрешаем доступ к BKP domain */ + /* Записываем напрямую в регистры RCC/APB1ENR и PWR->CR */ + RCC->APB1ENR |= (RCC_APB1ENR_PWREN | RCC_APB1ENR_BKPEN); PWR->CR |= PWR_CR_DBP; BKP->DR1 = 0xDEAD; // записываем код ошибки BKP->DR2 = BKP->DR2 + 1; // счётчик ошибок @@ -106,6 +105,9 @@ void HardFault_Handler(void) void MemManage_Handler(void) { /* USER CODE BEGIN MemoryManagement_IRQn 0 */ + /* Включаем тактирование PWR и BKP (APB1) и разрешаем доступ к BKP domain */ + /* Записываем напрямую в регистры RCC/APB1ENR и PWR->CR */ + RCC->APB1ENR |= (RCC_APB1ENR_PWREN | RCC_APB1ENR_BKPEN); PWR->CR |= PWR_CR_DBP; BKP->DR1 = 0xBEEF; // записываем код ошибки BKP->DR2 = BKP->DR2 + 1; // счётчик ошибок diff --git a/Core/Bootloader/boot_project_setup.h b/Core/Bootloader/boot_project_setup.h index a23bfae..27e975a 100644 --- a/Core/Bootloader/boot_project_setup.h +++ b/Core/Bootloader/boot_project_setup.h @@ -5,14 +5,38 @@ // === BOOTLOADER defines === // KEY defines -#define BOOTLOADER_KEY_ADR (uint32_t)0x08009800 +#define BOOTLOADER_KEY_ADR (uint32_t)0x08009800UL #define BOOTLOADER_KEY_PAGE 20 // MAIN APP defines -#define MAIN_APP_START_ADR (uint32_t)0x0800C000 +#define MAIN_APP_START_ADR (uint32_t)0x0800C000UL #define MAIN_APP_PAGE 21 #define MAIN_APP_NUM_OF_PAGE 250-MAIN_APP_PAGE + + +/* Flash boundaries: подставьте реальные границы флеш-памяти вашего MCU */ +#ifndef FLASH_START_ADR +#define FLASH_START_ADR 0x08000000UL +#endif +#ifndef FLASH_END_ADR +/* пример: 512KB flash -> 0x08080000. Поменяйте под ваш MCU */ +#define FLASH_END_ADR 0x080FFFFFUL +#endif + +/* SRAM boundaries: подставьте реальные адреса SRAM вашей MCU */ +#ifndef SRAM_START_ADR +#define SRAM_START_ADR 0x20000000UL +#endif +#ifndef SRAM_END_ADR +/* пример: 128KB SRAM -> 0x2001FFFF. Поменяйте под ваш MCU */ +#define SRAM_END_ADR 0x2003FFFFUL +#endif + + + + + // RECEIVE defines #define FW_RECEIVE_TIMEOUT_MS 5000 // таймаут приёма страницы #define PAGE_SIZE 2048 // страницы принимаются размером с page_size (размер страниц флеш должен быть кратен PAGE_SIZE) diff --git a/Core/Bootloader/boot_uart.h b/Core/Bootloader/boot_uart.h index 36e9242..ef79f41 100644 --- a/Core/Bootloader/boot_uart.h +++ b/Core/Bootloader/boot_uart.h @@ -2,6 +2,10 @@ #define __BOOT_UART_H #include "bootloader.h" + extern UART_HandleTypeDef huart_boot; + void MX_BOOT_UART_Init(void); +void Bootloader_UART_Receive_Page(Bootloader_t *bl); + #endif //__BOOT_UART_H \ No newline at end of file diff --git a/Core/Bootloader/bootloader.c b/Core/Bootloader/bootloader.c index 59b8b2f..e76de62 100644 --- a/Core/Bootloader/bootloader.c +++ b/Core/Bootloader/bootloader.c @@ -8,18 +8,18 @@ CAN_TxHeaderTypeDef TxHeaderBoot; CAN_RxHeaderTypeDef RxHeaderBoot; uint32_t TxMailBoxBoot = 0; uint8_t TXDataBoot[8] = {0}; -int receive_uart_flag = 0; -void SetKey(void); -uint32_t ReadKey(void); -void EraseKey(void); +uint32_t ErrCodeBoot = 0; +uint32_t ErrCntBoot = 0; + +static uint8_t Receive_FW_Command(Bootloader_t *bl); +static void SetKey(void); +static uint32_t ReadKey(void); +static void EraseKey(void); +static void JumpToApplocation(void); +static uint32_t CRC32_Compute(const uint8_t* data, uint32_t length); void Boot_SystemClock_Config(void); -void JumpToApplocation(void); - -void Bootloader_UART_Receive_Page(Bootloader_t *bl); -void Bootloader_CAN_Receive_Page(Bootloader_t *bl); - -uint32_t CRC32_Compute(const uint8_t* data, uint32_t length); +static HAL_StatusTypeDef Verify_Firmware(void); void Bootloader_Init(Bootloader_t *bl) { @@ -31,24 +31,62 @@ void Bootloader_Init(Bootloader_t *bl) } +void App_Init(void) +{ + __disable_irq(); + SCB->VTOR = 0x0800C000; + __enable_irq(); +} +void Bootloader_StartCheck(Bootloader_t *bl) +{ + + // Проверка watchdog reset (IWDGRSTF или WWDGRSTF в RCC->CSR) + if (__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST) || __HAL_RCC_GET_FLAG(RCC_FLAG_WWDGRST)) + { + //SaveErrorCode(0x0D0D); + __HAL_RCC_CLEAR_RESET_FLAGS(); // Очистить флаги сброса, чтобы не повторялось + } + + ErrCodeBoot = GetErrorCode(); + ErrCntBoot = GetErrorCnt(); + if(ErrCntBoot > 5) + { + ClearErrorCode(); + if(ErrCodeBoot == 0xDEAD) // HardFault + { + ResetKey(); + bl->error.bit.hardfault_cycle = 1; + bl->state = BL_STATE_ERROR; + } + else if(ErrCodeBoot == 0xBEEF) // MemManage + { + ResetKey(); + bl->error.bit.memmanage_cycle = 1; + bl->state = BL_STATE_ERROR; + } + /*else if(ErrCodeBoot == 0x0D0D) пока хз надо ли + { + ResetKey(); + bl->error.bit.watchdog_reset = 1; // Добавь бит в структуру BootloaderError_ + bl->state = BL_STATE_ERROR; + }*/ + } +} + -uint32_t code = 0; -uint32_t cnt = 0; void Bootloader_Task(Bootloader_t *bl) { - + int receive_uart_flag; switch (bl->state) { case BL_STATE_INIT: - code = LoadErrorCode(); - cnt = LoadErrorCnt(); - bl->prev_state = bl->state; + Bootloader_StartCheck(bl); // Проверяем ключ, чтобы понять запускать приложение или программирование - if ((ReadKey() == BL_KEY_APP_WRITTEN) && (cnt <= 5)) + if ((ReadKey() == BL_KEY_APP_WRITTEN)) { bl->state = BL_STATE_JUMP_TO_APP; break; // не инициализируем, а сразу прыгаем в приложение @@ -65,35 +103,15 @@ void Bootloader_Task(Bootloader_t *bl) bl->TxHeader.DLC = 8; bl->TxHeader.StdId = 123; bl->addr = MAIN_APP_START_ADR; - - if(cnt > 5) - { - ClearErrorCode(); - if(code == 0xDEAD) // HardFault - { - ResetKey(); - bl->error.bit.hardfault_cycle = 1; - TXDataBoot[0] = 0xAA; - TXDataBoot[1] = (bl->error.all >> 8) & 0xFF; - TXDataBoot[2] = bl->error.all & 0xFF; - res_hal = HAL_CAN_AddTxMessage(bl->hcan, &bl->TxHeader, TXDataBoot, &TxMailBoxBoot); - res_hal = HAL_UART_Transmit(bl->huart, TXDataBoot, 1, 100); - } - else if(code == 0xBEEF) // MemManage - { - ResetKey(); - bl->error.bit.memmanage_cycle = 1; - TXDataBoot[0] = 0x55; - TXDataBoot[1] = (bl->error.all >> 8) & 0xFF; - TXDataBoot[2] = bl->error.all & 0xFF; - res_hal = HAL_CAN_AddTxMessage(bl->hcan, &bl->TxHeader, TXDataBoot, &TxMailBoxBoot); - res_hal = HAL_UART_Transmit(bl->huart, TXDataBoot, 1, 100); - } - } - break; case BL_STATE_IDLE: + if(bl->error.all) + { + bl->prev_state = bl->state; + bl->state = BL_STATE_ERROR; + break; + } if((bl->state != bl->prev_state) && (bl->prev_state != BL_STATE_ERROR)) { TXDataBoot[0] = 0x00; @@ -118,6 +136,7 @@ void Bootloader_Task(Bootloader_t *bl) EraseKey(); if (FLASH_Erase_App() == HAL_OK) // твоя функция стирания MAIN_APP_PAGE..NUM { + HAL_Delay(50); bl->state = BL_STATE_IDLE; } else @@ -168,23 +187,19 @@ void Bootloader_Task(Bootloader_t *bl) } break; - case BL_STATE_VERIFY: + case BL_STATE_JUMP_TO_APP: bl->prev_state = bl->state; - if (/*Verify_Flash_CRC(bl->fw_crc)*/0 == HAL_OK) + if (Verify_Firmware() == HAL_OK) { EraseKey(); SetKey(); // отметка, что прошивка записана - bl->state = BL_STATE_IDLE; } else { bl->error.bit.verify_err = 1; bl->state = BL_STATE_ERROR; + break; } - break; - - case BL_STATE_JUMP_TO_APP: - bl->prev_state = bl->state; JumpToApplocation(); break; @@ -221,7 +236,7 @@ void Bootloader_Task(Bootloader_t *bl) } -uint8_t SetBootState(Bootloader_t *bl, BootloaderCommand_t cmd, uint8_t uart_flag) +static uint8_t SetBootState(Bootloader_t *bl, BootloaderCommand_t cmd, uint8_t uart_flag) { switch(cmd) { @@ -236,9 +251,6 @@ uint8_t SetBootState(Bootloader_t *bl, BootloaderCommand_t cmd, uint8_t uart_fla return 0x00; case CMD_WRITE: // команда: записать блок bl->state = BL_STATE_WRITE; - return 0x00; - case CMD_VERIFY: // команда: проверка прошивки - bl->state = BL_STATE_VERIFY; return 0x00; case CMD_GOTOAPP: // команда: прыжок в приложение bl->state = BL_STATE_JUMP_TO_APP; @@ -260,7 +272,7 @@ uint8_t SetBootState(Bootloader_t *bl, BootloaderCommand_t cmd, uint8_t uart_fla * @param bl: указатель на структуру бутлоадера * @retval 0x00 - команда принята и обработана, 0xFF - ошибка */ -uint8_t Receive_FW_Command(Bootloader_t *bl) +static uint8_t Receive_FW_Command(Bootloader_t *bl) { BootloaderCommand_t cmd = 0; HAL_StatusTypeDef res = HAL_ERROR; @@ -303,7 +315,7 @@ uint8_t Receive_FW_Command(Bootloader_t *bl) return ret_val; } -uint32_t CRC32_Compute(const uint8_t* data, uint32_t length) +static uint32_t CRC32_Compute(const uint8_t* data, uint32_t length) { const uint32_t polynomial = 0x04C11DB7; uint32_t crc = 0xFFFFFFFF; @@ -323,6 +335,36 @@ uint32_t CRC32_Compute(const uint8_t* data, uint32_t length) return crc ^ 0xFFFFFFFF; } +static HAL_StatusTypeDef Verify_Firmware(void) +{ + uint32_t msp = *((volatile uint32_t*)(MAIN_APP_START_ADR)); + uint32_t reset = *((volatile uint32_t*)(MAIN_APP_START_ADR + 4)); + + /* 1) Проверка MSP: должен быть указателем в SRAM */ + if ((msp < SRAM_START_ADR) || (msp > SRAM_END_ADR)) + { + /* Некорректный стек — прошивка невалидна */ + return HAL_ERROR; + } + + /* 2) Проверка reset handler: + - бит0 должен быть 1 (Thumb) + - адрес без бита0 должен лежать в пределах flash (MAIN_APP_START_ADR .. FLASH_END_ADR) + */ + if ((reset & 0x1) == 0) + { + /* Не Thumb-при-старте — подозрительно */ + return HAL_ERROR; + } + + uint32_t reset_addr = (reset & (~1U)); /* выравненный адрес */ + if ((reset_addr < FLASH_START_ADR) || (reset_addr > FLASH_END_ADR)) + { + /* Reset handler вне flash */ + return HAL_ERROR; + } + return HAL_OK; +} // key functions void ResetKey(void) @@ -334,7 +376,15 @@ void ResetKey(void) HAL_FLASH_Lock(); } -void SetKey(void) +void JumpToBootloader(void) +{ + // jump to boot + ResetKey(); // сброс ключа (не erase, просто битый ключ + NVIC_SystemReset(); // сброс и переход в бутлоадер (т.к. нет ключа) +} + + +static void SetKey(void) { HAL_FLASH_Unlock(); @@ -343,12 +393,12 @@ void SetKey(void) HAL_FLASH_Lock(); } -uint32_t ReadKey(void) +static uint32_t ReadKey(void) { return (*(__IO uint32_t*)BOOTLOADER_KEY_ADR); } -void EraseKey(void) +static void EraseKey(void) { FLASH_EraseInitTypeDef EraseInitStruct; HAL_FLASH_Unlock(); @@ -364,7 +414,7 @@ void EraseKey(void) -void JumpToApplocation(void) +static void JumpToApplocation(void) { //Деинициализация HAL HAL_DeInit(); @@ -387,33 +437,6 @@ void JumpToApplocation(void) } -void JumpToBootloader(void) -{ - // jump to boot - ResetKey(); // сброс ключа (не erase, просто битый ключ - NVIC_SystemReset(); // сброс и переход в бутлоадер (т.к. нет ключа) -} - - -// Сохранение кода ошибки -// Чтение после ресета -uint32_t LoadErrorCode(void) -{ - return BKP->DR1; -} - -uint32_t LoadErrorCnt(void) -{ - return BKP->DR2; -} - -void ClearErrorCode(void) -{ - PWR->CR |= PWR_CR_DBP; - BKP->DR1 = 0; - BKP->DR2 = 0; -} - __WEAK void Boot_SystemClock_Config(void) { diff --git a/Core/Bootloader/bootloader.h b/Core/Bootloader/bootloader.h index 619884e..fc908f2 100644 --- a/Core/Bootloader/bootloader.h +++ b/Core/Bootloader/bootloader.h @@ -6,6 +6,35 @@ #define BL_KEY_APP_WRITTEN 0xAAAA5555 +/* --- Настройка: подставьте значения для вашей MCU --- */ +/* Адрес начала приложения (используется в вашем коде) */ +#ifndef MAIN_APP_START_ADR +#error "MAIN_APP_START_ADR must be defined" +#endif + +/* Если нужен другой полином/поведение CRC, используйте вашу функцию CRC32_Compute. + В вашем коде уже есть CRC32_Compute, поэтому будем её использовать. */ + + + +#define GetErrorCode() BKP->DR1 +#define GetErrorCnt() BKP->DR2 + + +#define SaveErrorCode(code) do{ \ + RCC->APB1ENR |= (RCC_APB1ENR_PWREN | RCC_APB1ENR_BKPEN); \ + PWR->CR |= PWR_CR_DBP; \ + GetErrorCode() = code; \ + GetErrorCnt() = GetErrorCnt() + 1; \ +}while(0u); + +#define ClearErrorCode(code) do{ \ + RCC->APB1ENR |= (RCC_APB1ENR_PWREN | RCC_APB1ENR_BKPEN); \ + PWR->CR |= PWR_CR_DBP; \ + GetErrorCode() = 0; \ + GetErrorCnt() = 0; \ +}while(0u); + // ERROR DEFINES /** @@ -15,7 +44,6 @@ typedef enum { CMD_ERASE = 0x01, ///< Команда на стирание прошивки CMD_START_RECEIVE, ///< Команда на старт приема прошивки CMD_WRITE, ///< Команда на запись блока прошивки - CMD_VERIFY, ///< Команда на проверку прошивки CMD_GOTOAPP, ///< Команда на переход в приложение CMD_RESET, ///< Команда на переход в приложение CMD_GOTOBOOT, ///< Команда на переход в приложение @@ -32,7 +60,6 @@ typedef enum { BL_STATE_RECEIVE_UART, ///< Состояние: прием прошивки по UART BL_STATE_RECEIVE_CAN, ///< Состояние: прием прошивки по CAN BL_STATE_WRITE, ///< Состояние: запись данных - BL_STATE_VERIFY, ///< Состояние: проверка прошивки BL_STATE_ERROR, ///< Состояние: ошибка BL_STATE_RESET, ///< Состояние: сброс контролллера BL_STATE_JUMP_TO_BOOT, ///< Состояние: запуск приложения @@ -44,14 +71,15 @@ typedef enum { typedef union { uint16_t all; struct { + unsigned hardfault_cycle:1; + unsigned memmanage_cycle:1; + unsigned watchdog_reset:1; unsigned unknown_cmd:1; unsigned erase_err:1; unsigned write_err:1; unsigned verify_err:1; unsigned timeout_receive:1; unsigned crc_err:1; - unsigned hardfault_cycle:1; - unsigned memmanage_cycle:1; }bit; } BootloaderError_t; @@ -79,15 +107,8 @@ extern uint8_t TXDataBoot[8]; void ResetKey(void); void JumpToBootloader(void); - -void SaveErrorCode(uint32_t code); -uint32_t LoadErrorCode(void); -uint32_t LoadErrorCnt(void); -void ClearErrorCode(void); - -void Boot_SystemClock_Config(void); +void App_Init(void); void Bootloader_Task(Bootloader_t *bl); -uint8_t Receive_FW_Command(Bootloader_t *bl); void Error_Handler(void); diff --git a/Core/Src/main.c b/Core/Src/main.c index f5fa171..dd60a1e 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -29,6 +29,7 @@ #include "package.h" #include "message.h" #include "lampa.h" +#include "bootloader.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ @@ -85,10 +86,7 @@ int main(void) static int cancount[2]={1,2},cancell[2]={0,0},candid[2]={0,0}; static unsigned int masca[8]; static uint16_t precom=0; - - __disable_irq(); - SCB->VTOR = 0x0800C000; - __enable_irq(); + App_Init(); /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ @@ -104,16 +102,15 @@ int main(void) SystemClock_Config(); /* USER CODE BEGIN SysInit */ - //MX_IWDG_Init(); + MX_IWDG_Init(); /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_CAN_Init(); - MX_TIM4_Init(); - MX_IWDG_Init(); - MX_UART4_Init(); MX_TIM2_Init(); + MX_TIM4_Init(); + MX_UART4_Init(); /* USER CODE BEGIN 2 */ HAL_TIM_Base_Start(&htim2); LED_0_ON; @@ -156,7 +153,7 @@ int main(void) /* USER CODE BEGIN WHILE */ while (1) { - //=== БЛОК ПР?НУД?ТЕЛЬНОЙ ПАУЗЫ ===// + //=== БЛОК ПРИНУДИТЕЛЬНОЙ ПАУЗЫ ===// if (flag.force_pause) { __disable_irq(); // Отключаем все прерывания @@ -164,7 +161,7 @@ int main(void) __enable_irq(); // Включаем прерывания обратно } - //=== ОБРАБОТКА CAN-Ш?НЫ ===// + //=== ОБРАБОТКА CAN-ШИНЫ ===// if (CanGO) // Флаг разрешения работы с CAN-шиной { CanGO = 0; // Сбрасываем флаг @@ -303,10 +300,10 @@ int main(void) Next: // Метка для перехода к следующей части цикла - //=== ЧТЕН?Е ВХОДНЫХ С?ГНАЛОВ ===// + //=== ЧТЕНИЕ ВХОДНЫХ СИГНАЛОВ ===// ReadEnteres(); // Функция чтения дискретных входов - //=== УПРАВЛЕН?Е ВЫХОДНЫМ? С?ГНАЛАМ? ===// + //=== УПРАВЛЕНИЕ ВЫХОДНЫМИ СИГНАЛАМИ ===// if (Errors.all | Alarms.all) Pvt4_OFF; // Выключение сигнала "Система ВЭП в норме" else @@ -329,7 +326,7 @@ int main(void) } precom = Commands; // Сохранение текущих команд для следующей итерации - //=== ОБРАБОТКА С?СТЕМНЫХ КОМАНД ===// + //=== ОБРАБОТКА СИСТЕМНЫХ КОМАНД ===// if (cDefParam) // Команда сброса параметров по умолчанию { cDefParam = 0; @@ -430,28 +427,28 @@ int Isit(int num, int i, int z) { int res, pls; - //=== ПРОВЕРКА Д?АПАЗОНА ===// + //=== ПРОВЕРКА ДИАПАЗОНА ===// // Если номер элемента вне допустимого диапазона (0x00-0x7F) if((num < 0) || (num >= 0x80)) return 0; // Элемент не активен - //=== ПРОВЕРКА МАСК? КАНАЛА ===// + //=== ПРОВЕРКА МАСКИ КАНАЛА ===// // Определяем битовую маску для данного элемента // num/0x10 - определяем индекс в массиве масок (0-7) // num&0x0F - определяем позицию бита в слове (0-15) res = Maska[i][num / 0x10]; // Получаем маску для группы элементов res &= (1 << (num & 0x0F)); // Проверяем конкретный бит в маске - //=== ДОПОЛН?ТЕЛЬНЫЕ ПРОВЕРК? (если z != 0) ===// + //=== ДОПОЛНИТЕЛЬНЫЕ ПРОВЕРКИ (если z != 0) ===// if(z) { // Проверка времени ожидания: если превышена половина времени перезапуска pls = (espero[num] > CanRestart[i] / 2); - // ?Л? проверка счетчика отправки (если county[num] != 0) + // ИЛИ проверка счетчика отправки (если county[num] != 0) pls = pls || county[num]; - // Комбинированная проверка: должен быть установлен в маске ? выполнять условия + // Комбинированная проверка: должен быть установлен в маске И выполнять условия res = res && pls; } @@ -481,25 +478,25 @@ void Millisecond() #define CANPOWSE 10 // 10 msec - период обновления CAN #define BLINK_TIME 250 // 0.25 sec - период мигания - //=== ОБНОВЛЕН?Е WATCHDOG ===// + //=== ОБНОВЛЕНИЕ WATCHDOG ===// if(!cReset) IWDG->KR = 0xAAAA; // Сброс watchdog таймера - //=== ПРОВЕРКА АКТ?ВНОСТ? ТАЙМЕРА ===// + //=== ПРОВЕРКА АКТИВНОСТИ ТАЙМЕРА ===// if(!timGo) return; // Если таймер не активен - выход - //=== ЧТЕН?Е ПЕРЕКЛЮЧАТЕЛЕЙ ? КНОПОК ===// + //=== ЧТЕНИЕ ПЕРЕКЛЮЧАТЕЛЕЙ И КНОПОК ===// Jumpers.byt.byte_1 = ReadJumpers(); // Чтение состояния переключателей Jumpers.bit.bit0 = Buttons.bit.bit0 = TestJumper(); // Чтение состояния кнопки - //=== УПРАВЛЕН?Е CAN-Ш?НОЙ ===// + //=== УПРАВЛЕНИЕ CAN-ШИНОЙ ===// if(++CanPowse >= CANPOWSE) { CanPowse = 0; // Сброс счетчика CanGO = 1; // Установка флага разрешения работы CAN } - //=== УПРАВЛЕН?Е РЕЖ?МОМ "ЗАСЫПАН?Я" ===// + //=== УПРАВЛЕНИЕ РЕЖИМОМ "ЗАСЫПАНИЯ" ===// if(Alarms.bit.bit8) // Разряд батареи { if (Falling_asleep) Falling_asleep--; // Уменьшение времени до "сна" @@ -507,7 +504,7 @@ void Millisecond() else Falling_asleep = 1000L * Sleep_time; // Установка времени до "сна" - //=== ОБРАБОТКА ТЕСТОВОГО РЕЖ?МА ===// + //=== ОБРАБОТКА ТЕСТОВОГО РЕЖИМА ===// TST = TestJumper() | cTestLamp; // Текущее состояние теста (кнопка или команда) if(TST & !preTest) // Обнаружение фронта нажатия кнопки @@ -517,7 +514,7 @@ void Millisecond() } preTest = TST; // Сохранение состояния для следующего вызова - //=== УПРАВЛЕН?Е М?ГАН?ЕМ ?НД?КАТОРОВ ===// + //=== УПРАВЛЕНИЕ МИГАНИЕМ ИНДИКАТОРОВ ===// if(++count_blink >= BLINK_TIME) { count_blink = 0; // Сброс счетчика @@ -526,19 +523,19 @@ void Millisecond() blink_alarm = (count_mode & 7) ? 1 : 0; // Мигание 1:7 (12.5%) } - //=== УСТАНОВКА СТАНДАРТНЫХ СОСТОЯН?Й ?НД?КАТОРОВ ===// + //=== УСТАНОВКА СТАНДАРТНЫХ СОСТОЯНИЙ ИНДИКАТОРОВ ===// power_lamp = 1; // Силовая лампа включена norm_diod = 1; // Нормальный светодиод включен work_diod = !blink_over; // Рабочий светодиод синхронизирован с миганием - //=== РЕЖ?М ТЕСТ?РОВАН?Я ===// + //=== РЕЖИМ ТЕСТИРОВАНИЯ ===// if(TST) { power_lamp = blink_over; // Мигание силовой лампы norm_diod = blink_over; // Мигание нормального светодиода work_diod = blink_over; // Мигание рабочего светодиода } - //=== РЕЖ?М ОСВЕЩЕН?Я ===// + //=== РЕЖИМ ОСВЕЩЕНИЯ ===// else if(Lightness) { power_lamp = norm_diod = 0; // Базовое состояние - выключено @@ -555,20 +552,20 @@ void Millisecond() // Уровень освещенности 5: инверсное быстрое мигание (87.5%) if(Lightness == 5) power_lamp = norm_diod = !blink_alarm; } - //=== РЕЖ?М ОШ?БОК ===// + //=== РЕЖИМ ОШИБОК ===// else if(Errors.all) { power_lamp = blink_over; // Мигание при ошибках norm_diod = blink_over; // Мигание при ошибках } - //=== РЕЖ?М ТРЕВОГ ===// + //=== РЕЖИМ ТРЕВОГ ===// else if(Alarms.all) { power_lamp = blink_alarm; // Быстрое мигание при тревогах norm_diod = blink_alarm; // Быстрое мигание при тревогах } - //=== Ш?М УПРАВЛЕН?Е ЯРКОСТЬЮ С?ЛОВОЙ ЛАМПЫ ===// + //=== ШИМ УПРАВЛЕНИЕ ЯРКОСТЬЮ СИЛОВОЙ ЛАМПЫ ===// if(++count_bright == 10) // maximum_bright (100%) { count_bright = 0; @@ -576,11 +573,11 @@ void Millisecond() else Pvt1_OFF; // Выключение } - //=== УПРАВЛЕН?Е ЯРКОСТЬЮ ===// + //=== УПРАВЛЕНИЕ ЯРКОСТЬЮ ===// if(count_bright == Brightness) if(!TST) Pvt1_OFF; // Отключение лампочки с регулировкой яркости - //=== УПРАВЛЕН?Е СВЕТОД?ОДАМ? ===// + //=== УПРАВЛЕНИЕ СВЕТОДИОДАМИ ===// if(work_diod) LED_2_ON; // Включение рабочего светодиода else LED_2_OFF; // Выключение рабочего светодиода @@ -611,7 +608,8 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) /* USER CODE END Callback 0 */ if (htim->Instance == TIM8) { HAL_IncTick(); - } + Millisecond(); + } /* USER CODE BEGIN Callback 1 */ /* USER CODE END Callback 1 */ } diff --git a/MDK-ARM/uksvep_2_2_v1.uvoptx b/MDK-ARM/uksvep_2_2_v1.uvoptx index ce0ab68..10150ff 100644 --- a/MDK-ARM/uksvep_2_2_v1.uvoptx +++ b/MDK-ARM/uksvep_2_2_v1.uvoptx @@ -152,18 +152,18 @@ 0 0 - 81 + 49 1 -
134288232
+
42
0 0 0 0 0 1 - ../Core/Src/main.c + ..\Core\Bootloader\bootloader.c - \\uksvep_2_2_v1\../Core/Src/main.c\81 + \\uksvep_2_2_v1\../Core/Bootloader/bootloader.c\49
@@ -212,7 +212,7 @@ 1 0 - 0x0800d000 + 0x0800c000 0 @@ -267,6 +267,10 @@ + + System Viewer\BKP + 35902 + System Viewer\CAN 35904 @@ -275,6 +279,10 @@ System Viewer\GPIOB 35905 + + System Viewer\IWDG + 35903 + 1 @@ -417,89 +425,41 @@ 0 0 - 210 + 1300 1 -
134220168
+
134222002
0 0 0 0 0 1 - ..\Core\Bootloader\bootloader.c + ../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_can.c - \\bootloader\../Core/Bootloader/bootloader.c\210 + \\bootloader\../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_can.c\1300
1 0 - 216 + 850 1 -
134220188
+
134221508
0 0 0 0 0 1 - ..\Core\Bootloader\bootloader.c + ../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash.c - \\bootloader\../Core/Bootloader/bootloader.c\216 -
- - 2 - 0 - 111 - 1 -
134219682
- 0 - 0 - 0 - 0 - 0 - 1 - ..\Core\Bootloader\bootloader.c - - \\bootloader\../Core/Bootloader/bootloader.c\111 -
- - 3 - 0 - 214 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - ..\Core\Bootloader\bootloader.c - - -
- - 4 - 0 - 219 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - ..\Core\Bootloader\bootloader.c - - + \\bootloader\../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash.c\850
0 1 - boot + boot,0x10 1 @@ -541,7 +501,7 @@ 1 0 - 0x0800d000 + 0x08011800 0 @@ -604,6 +564,10 @@ System Viewer\CAN 35904 + + System Viewer\FLASH + 35900 + System Viewer\GPIOB 35905