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