работает но не стабильно
This commit is contained in:
parent
320cce09ec
commit
fbd36705f1
@ -119,6 +119,7 @@ void Bootloader_CAN_Receive_Page(Bootloader_t *bl)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Таймаут
|
||||||
if(HAL_GetTick() - start_tick >= FW_RECEIVE_TIMEOUT_MS)
|
if(HAL_GetTick() - start_tick >= FW_RECEIVE_TIMEOUT_MS)
|
||||||
{
|
{
|
||||||
bl->error.bit.timeout_receive = 1;
|
bl->error.bit.timeout_receive = 1;
|
||||||
|
@ -6,11 +6,7 @@ int main()
|
|||||||
__disable_irq();
|
__disable_irq();
|
||||||
SCB->VTOR = 0x08000000;
|
SCB->VTOR = 0x08000000;
|
||||||
__enable_irq();
|
__enable_irq();
|
||||||
|
|
||||||
/* Включаем тактирование PWR и BKP (APB1) и разрешаем доступ к BKP domain */
|
|
||||||
/* Записываем напрямую в регистры RCC/APB1ENR и PWR->CR */
|
|
||||||
RCC->APB1ENR |= (RCC_APB1ENR_PWREN | RCC_APB1ENR_BKPEN);
|
|
||||||
|
|
||||||
boot.state = BL_STATE_INIT;
|
boot.state = BL_STATE_INIT;
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
@ -88,6 +84,9 @@ void HardFault_Handler(void)
|
|||||||
{
|
{
|
||||||
/* USER CODE BEGIN HardFault_IRQn 0 */
|
/* 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;
|
PWR->CR |= PWR_CR_DBP;
|
||||||
BKP->DR1 = 0xDEAD; // записываем код ошибки
|
BKP->DR1 = 0xDEAD; // записываем код ошибки
|
||||||
BKP->DR2 = BKP->DR2 + 1; // счётчик ошибок
|
BKP->DR2 = BKP->DR2 + 1; // счётчик ошибок
|
||||||
@ -106,6 +105,9 @@ void HardFault_Handler(void)
|
|||||||
void MemManage_Handler(void)
|
void MemManage_Handler(void)
|
||||||
{
|
{
|
||||||
/* USER CODE BEGIN MemoryManagement_IRQn 0 */
|
/* 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;
|
PWR->CR |= PWR_CR_DBP;
|
||||||
BKP->DR1 = 0xBEEF; // записываем код ошибки
|
BKP->DR1 = 0xBEEF; // записываем код ошибки
|
||||||
BKP->DR2 = BKP->DR2 + 1; // счётчик ошибок
|
BKP->DR2 = BKP->DR2 + 1; // счётчик ошибок
|
||||||
|
@ -5,14 +5,38 @@
|
|||||||
|
|
||||||
// === BOOTLOADER defines ===
|
// === BOOTLOADER defines ===
|
||||||
// KEY defines
|
// KEY defines
|
||||||
#define BOOTLOADER_KEY_ADR (uint32_t)0x08009800
|
#define BOOTLOADER_KEY_ADR (uint32_t)0x08009800UL
|
||||||
#define BOOTLOADER_KEY_PAGE 20
|
#define BOOTLOADER_KEY_PAGE 20
|
||||||
|
|
||||||
// MAIN APP defines
|
// 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_PAGE 21
|
||||||
#define MAIN_APP_NUM_OF_PAGE 250-MAIN_APP_PAGE
|
#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
|
// RECEIVE defines
|
||||||
#define FW_RECEIVE_TIMEOUT_MS 5000 // таймаут приёма страницы
|
#define FW_RECEIVE_TIMEOUT_MS 5000 // таймаут приёма страницы
|
||||||
#define PAGE_SIZE 2048 // страницы принимаются размером с page_size (размер страниц флеш должен быть кратен PAGE_SIZE)
|
#define PAGE_SIZE 2048 // страницы принимаются размером с page_size (размер страниц флеш должен быть кратен PAGE_SIZE)
|
||||||
|
@ -2,6 +2,10 @@
|
|||||||
#define __BOOT_UART_H
|
#define __BOOT_UART_H
|
||||||
|
|
||||||
#include "bootloader.h"
|
#include "bootloader.h"
|
||||||
|
|
||||||
extern UART_HandleTypeDef huart_boot;
|
extern UART_HandleTypeDef huart_boot;
|
||||||
|
|
||||||
void MX_BOOT_UART_Init(void);
|
void MX_BOOT_UART_Init(void);
|
||||||
|
void Bootloader_UART_Receive_Page(Bootloader_t *bl);
|
||||||
|
|
||||||
#endif //__BOOT_UART_H
|
#endif //__BOOT_UART_H
|
@ -8,18 +8,18 @@ CAN_TxHeaderTypeDef TxHeaderBoot;
|
|||||||
CAN_RxHeaderTypeDef RxHeaderBoot;
|
CAN_RxHeaderTypeDef RxHeaderBoot;
|
||||||
uint32_t TxMailBoxBoot = 0;
|
uint32_t TxMailBoxBoot = 0;
|
||||||
uint8_t TXDataBoot[8] = {0};
|
uint8_t TXDataBoot[8] = {0};
|
||||||
int receive_uart_flag = 0;
|
|
||||||
|
|
||||||
void SetKey(void);
|
uint32_t ErrCodeBoot = 0;
|
||||||
uint32_t ReadKey(void);
|
uint32_t ErrCntBoot = 0;
|
||||||
void EraseKey(void);
|
|
||||||
|
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 Boot_SystemClock_Config(void);
|
||||||
void JumpToApplocation(void);
|
static HAL_StatusTypeDef Verify_Firmware(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);
|
|
||||||
|
|
||||||
void Bootloader_Init(Bootloader_t *bl)
|
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)
|
void Bootloader_Task(Bootloader_t *bl)
|
||||||
{
|
{
|
||||||
|
int receive_uart_flag;
|
||||||
switch (bl->state)
|
switch (bl->state)
|
||||||
{
|
{
|
||||||
case BL_STATE_INIT:
|
case BL_STATE_INIT:
|
||||||
code = LoadErrorCode();
|
|
||||||
cnt = LoadErrorCnt();
|
|
||||||
|
|
||||||
bl->prev_state = bl->state;
|
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;
|
bl->state = BL_STATE_JUMP_TO_APP;
|
||||||
break; // не инициализируем, а сразу прыгаем в приложение
|
break; // не инициализируем, а сразу прыгаем в приложение
|
||||||
@ -65,35 +103,15 @@ void Bootloader_Task(Bootloader_t *bl)
|
|||||||
bl->TxHeader.DLC = 8;
|
bl->TxHeader.DLC = 8;
|
||||||
bl->TxHeader.StdId = 123;
|
bl->TxHeader.StdId = 123;
|
||||||
bl->addr = MAIN_APP_START_ADR;
|
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;
|
break;
|
||||||
|
|
||||||
case BL_STATE_IDLE:
|
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))
|
if((bl->state != bl->prev_state) && (bl->prev_state != BL_STATE_ERROR))
|
||||||
{
|
{
|
||||||
TXDataBoot[0] = 0x00;
|
TXDataBoot[0] = 0x00;
|
||||||
@ -118,6 +136,7 @@ void Bootloader_Task(Bootloader_t *bl)
|
|||||||
EraseKey();
|
EraseKey();
|
||||||
if (FLASH_Erase_App() == HAL_OK) // твоя функция стирания MAIN_APP_PAGE..NUM
|
if (FLASH_Erase_App() == HAL_OK) // твоя функция стирания MAIN_APP_PAGE..NUM
|
||||||
{
|
{
|
||||||
|
HAL_Delay(50);
|
||||||
bl->state = BL_STATE_IDLE;
|
bl->state = BL_STATE_IDLE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -168,23 +187,19 @@ void Bootloader_Task(Bootloader_t *bl)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BL_STATE_VERIFY:
|
case BL_STATE_JUMP_TO_APP:
|
||||||
bl->prev_state = bl->state;
|
bl->prev_state = bl->state;
|
||||||
if (/*Verify_Flash_CRC(bl->fw_crc)*/0 == HAL_OK)
|
if (Verify_Firmware() == HAL_OK)
|
||||||
{
|
{
|
||||||
EraseKey();
|
EraseKey();
|
||||||
SetKey(); // отметка, что прошивка записана
|
SetKey(); // отметка, что прошивка записана
|
||||||
bl->state = BL_STATE_IDLE;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
bl->error.bit.verify_err = 1;
|
bl->error.bit.verify_err = 1;
|
||||||
bl->state = BL_STATE_ERROR;
|
bl->state = BL_STATE_ERROR;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
|
|
||||||
case BL_STATE_JUMP_TO_APP:
|
|
||||||
bl->prev_state = bl->state;
|
|
||||||
JumpToApplocation();
|
JumpToApplocation();
|
||||||
break;
|
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)
|
switch(cmd)
|
||||||
{
|
{
|
||||||
@ -236,9 +251,6 @@ uint8_t SetBootState(Bootloader_t *bl, BootloaderCommand_t cmd, uint8_t uart_fla
|
|||||||
return 0x00;
|
return 0x00;
|
||||||
case CMD_WRITE: // команда: записать блок
|
case CMD_WRITE: // команда: записать блок
|
||||||
bl->state = BL_STATE_WRITE;
|
bl->state = BL_STATE_WRITE;
|
||||||
return 0x00;
|
|
||||||
case CMD_VERIFY: // команда: проверка прошивки
|
|
||||||
bl->state = BL_STATE_VERIFY;
|
|
||||||
return 0x00;
|
return 0x00;
|
||||||
case CMD_GOTOAPP: // команда: прыжок в приложение
|
case CMD_GOTOAPP: // команда: прыжок в приложение
|
||||||
bl->state = BL_STATE_JUMP_TO_APP;
|
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: указатель на структуру бутлоадера
|
* @param bl: указатель на структуру бутлоадера
|
||||||
* @retval 0x00 - команда принята и обработана, 0xFF - ошибка
|
* @retval 0x00 - команда принята и обработана, 0xFF - ошибка
|
||||||
*/
|
*/
|
||||||
uint8_t Receive_FW_Command(Bootloader_t *bl)
|
static uint8_t Receive_FW_Command(Bootloader_t *bl)
|
||||||
{
|
{
|
||||||
BootloaderCommand_t cmd = 0;
|
BootloaderCommand_t cmd = 0;
|
||||||
HAL_StatusTypeDef res = HAL_ERROR;
|
HAL_StatusTypeDef res = HAL_ERROR;
|
||||||
@ -303,7 +315,7 @@ uint8_t Receive_FW_Command(Bootloader_t *bl)
|
|||||||
return ret_val;
|
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;
|
const uint32_t polynomial = 0x04C11DB7;
|
||||||
uint32_t crc = 0xFFFFFFFF;
|
uint32_t crc = 0xFFFFFFFF;
|
||||||
@ -323,6 +335,36 @@ uint32_t CRC32_Compute(const uint8_t* data, uint32_t length)
|
|||||||
return crc ^ 0xFFFFFFFF;
|
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
|
// key functions
|
||||||
void ResetKey(void)
|
void ResetKey(void)
|
||||||
@ -334,7 +376,15 @@ void ResetKey(void)
|
|||||||
HAL_FLASH_Lock();
|
HAL_FLASH_Lock();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetKey(void)
|
void JumpToBootloader(void)
|
||||||
|
{
|
||||||
|
// jump to boot
|
||||||
|
ResetKey(); // сброс ключа (не erase, просто битый ключ
|
||||||
|
NVIC_SystemReset(); // сброс и переход в бутлоадер (т.к. нет ключа)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void SetKey(void)
|
||||||
{
|
{
|
||||||
HAL_FLASH_Unlock();
|
HAL_FLASH_Unlock();
|
||||||
|
|
||||||
@ -343,12 +393,12 @@ void SetKey(void)
|
|||||||
HAL_FLASH_Lock();
|
HAL_FLASH_Lock();
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t ReadKey(void)
|
static uint32_t ReadKey(void)
|
||||||
{
|
{
|
||||||
return (*(__IO uint32_t*)BOOTLOADER_KEY_ADR);
|
return (*(__IO uint32_t*)BOOTLOADER_KEY_ADR);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EraseKey(void)
|
static void EraseKey(void)
|
||||||
{
|
{
|
||||||
FLASH_EraseInitTypeDef EraseInitStruct;
|
FLASH_EraseInitTypeDef EraseInitStruct;
|
||||||
HAL_FLASH_Unlock();
|
HAL_FLASH_Unlock();
|
||||||
@ -364,7 +414,7 @@ void EraseKey(void)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void JumpToApplocation(void)
|
static void JumpToApplocation(void)
|
||||||
{
|
{
|
||||||
//Деинициализация HAL
|
//Деинициализация HAL
|
||||||
HAL_DeInit();
|
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)
|
__WEAK void Boot_SystemClock_Config(void)
|
||||||
{
|
{
|
||||||
|
@ -6,6 +6,35 @@
|
|||||||
|
|
||||||
|
|
||||||
#define BL_KEY_APP_WRITTEN 0xAAAA5555
|
#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
|
// ERROR DEFINES
|
||||||
/**
|
/**
|
||||||
@ -15,7 +44,6 @@ typedef enum {
|
|||||||
CMD_ERASE = 0x01, ///< Команда на стирание прошивки
|
CMD_ERASE = 0x01, ///< Команда на стирание прошивки
|
||||||
CMD_START_RECEIVE, ///< Команда на старт приема прошивки
|
CMD_START_RECEIVE, ///< Команда на старт приема прошивки
|
||||||
CMD_WRITE, ///< Команда на запись блока прошивки
|
CMD_WRITE, ///< Команда на запись блока прошивки
|
||||||
CMD_VERIFY, ///< Команда на проверку прошивки
|
|
||||||
CMD_GOTOAPP, ///< Команда на переход в приложение
|
CMD_GOTOAPP, ///< Команда на переход в приложение
|
||||||
CMD_RESET, ///< Команда на переход в приложение
|
CMD_RESET, ///< Команда на переход в приложение
|
||||||
CMD_GOTOBOOT, ///< Команда на переход в приложение
|
CMD_GOTOBOOT, ///< Команда на переход в приложение
|
||||||
@ -32,7 +60,6 @@ typedef enum {
|
|||||||
BL_STATE_RECEIVE_UART, ///< Состояние: прием прошивки по UART
|
BL_STATE_RECEIVE_UART, ///< Состояние: прием прошивки по UART
|
||||||
BL_STATE_RECEIVE_CAN, ///< Состояние: прием прошивки по CAN
|
BL_STATE_RECEIVE_CAN, ///< Состояние: прием прошивки по CAN
|
||||||
BL_STATE_WRITE, ///< Состояние: запись данных
|
BL_STATE_WRITE, ///< Состояние: запись данных
|
||||||
BL_STATE_VERIFY, ///< Состояние: проверка прошивки
|
|
||||||
BL_STATE_ERROR, ///< Состояние: ошибка
|
BL_STATE_ERROR, ///< Состояние: ошибка
|
||||||
BL_STATE_RESET, ///< Состояние: сброс контролллера
|
BL_STATE_RESET, ///< Состояние: сброс контролллера
|
||||||
BL_STATE_JUMP_TO_BOOT, ///< Состояние: запуск приложения
|
BL_STATE_JUMP_TO_BOOT, ///< Состояние: запуск приложения
|
||||||
@ -44,14 +71,15 @@ typedef enum {
|
|||||||
typedef union {
|
typedef union {
|
||||||
uint16_t all;
|
uint16_t all;
|
||||||
struct {
|
struct {
|
||||||
|
unsigned hardfault_cycle:1;
|
||||||
|
unsigned memmanage_cycle:1;
|
||||||
|
unsigned watchdog_reset:1;
|
||||||
unsigned unknown_cmd:1;
|
unsigned unknown_cmd:1;
|
||||||
unsigned erase_err:1;
|
unsigned erase_err:1;
|
||||||
unsigned write_err:1;
|
unsigned write_err:1;
|
||||||
unsigned verify_err:1;
|
unsigned verify_err:1;
|
||||||
unsigned timeout_receive:1;
|
unsigned timeout_receive:1;
|
||||||
unsigned crc_err:1;
|
unsigned crc_err:1;
|
||||||
unsigned hardfault_cycle:1;
|
|
||||||
unsigned memmanage_cycle:1;
|
|
||||||
}bit;
|
}bit;
|
||||||
} BootloaderError_t;
|
} BootloaderError_t;
|
||||||
|
|
||||||
@ -79,15 +107,8 @@ extern uint8_t TXDataBoot[8];
|
|||||||
void ResetKey(void);
|
void ResetKey(void);
|
||||||
void JumpToBootloader(void);
|
void JumpToBootloader(void);
|
||||||
|
|
||||||
|
void App_Init(void);
|
||||||
void SaveErrorCode(uint32_t code);
|
|
||||||
uint32_t LoadErrorCode(void);
|
|
||||||
uint32_t LoadErrorCnt(void);
|
|
||||||
void ClearErrorCode(void);
|
|
||||||
|
|
||||||
void Boot_SystemClock_Config(void);
|
|
||||||
void Bootloader_Task(Bootloader_t *bl);
|
void Bootloader_Task(Bootloader_t *bl);
|
||||||
uint8_t Receive_FW_Command(Bootloader_t *bl);
|
|
||||||
|
|
||||||
void Error_Handler(void);
|
void Error_Handler(void);
|
||||||
|
|
||||||
|
@ -29,6 +29,7 @@
|
|||||||
#include "package.h"
|
#include "package.h"
|
||||||
#include "message.h"
|
#include "message.h"
|
||||||
#include "lampa.h"
|
#include "lampa.h"
|
||||||
|
#include "bootloader.h"
|
||||||
/* USER CODE END Includes */
|
/* USER CODE END Includes */
|
||||||
|
|
||||||
/* Private typedef -----------------------------------------------------------*/
|
/* Private typedef -----------------------------------------------------------*/
|
||||||
@ -85,10 +86,7 @@ int main(void)
|
|||||||
static int cancount[2]={1,2},cancell[2]={0,0},candid[2]={0,0};
|
static int cancount[2]={1,2},cancell[2]={0,0},candid[2]={0,0};
|
||||||
static unsigned int masca[8];
|
static unsigned int masca[8];
|
||||||
static uint16_t precom=0;
|
static uint16_t precom=0;
|
||||||
|
App_Init();
|
||||||
__disable_irq();
|
|
||||||
SCB->VTOR = 0x0800C000;
|
|
||||||
__enable_irq();
|
|
||||||
/* USER CODE END 1 */
|
/* USER CODE END 1 */
|
||||||
|
|
||||||
/* MCU Configuration--------------------------------------------------------*/
|
/* MCU Configuration--------------------------------------------------------*/
|
||||||
@ -104,16 +102,15 @@ int main(void)
|
|||||||
SystemClock_Config();
|
SystemClock_Config();
|
||||||
|
|
||||||
/* USER CODE BEGIN SysInit */
|
/* USER CODE BEGIN SysInit */
|
||||||
//MX_IWDG_Init();
|
MX_IWDG_Init();
|
||||||
/* USER CODE END SysInit */
|
/* USER CODE END SysInit */
|
||||||
|
|
||||||
/* Initialize all configured peripherals */
|
/* Initialize all configured peripherals */
|
||||||
MX_GPIO_Init();
|
MX_GPIO_Init();
|
||||||
MX_CAN_Init();
|
MX_CAN_Init();
|
||||||
MX_TIM4_Init();
|
|
||||||
MX_IWDG_Init();
|
|
||||||
MX_UART4_Init();
|
|
||||||
MX_TIM2_Init();
|
MX_TIM2_Init();
|
||||||
|
MX_TIM4_Init();
|
||||||
|
MX_UART4_Init();
|
||||||
/* USER CODE BEGIN 2 */
|
/* USER CODE BEGIN 2 */
|
||||||
HAL_TIM_Base_Start(&htim2);
|
HAL_TIM_Base_Start(&htim2);
|
||||||
LED_0_ON;
|
LED_0_ON;
|
||||||
@ -156,7 +153,7 @@ int main(void)
|
|||||||
/* USER CODE BEGIN WHILE */
|
/* USER CODE BEGIN WHILE */
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
//=== БЛОК ПР<EFBFBD>?НУД<D0A3>?ТЕЛЬНОЙ ПАУЗЫ ===//
|
//=== БЛОК ПРИНУДИТЕЛЬНОЙ ПАУЗЫ ===//
|
||||||
if (flag.force_pause)
|
if (flag.force_pause)
|
||||||
{
|
{
|
||||||
__disable_irq(); // Отключаем все прерывания
|
__disable_irq(); // Отключаем все прерывания
|
||||||
@ -164,7 +161,7 @@ int main(void)
|
|||||||
__enable_irq(); // Включаем прерывания обратно
|
__enable_irq(); // Включаем прерывания обратно
|
||||||
}
|
}
|
||||||
|
|
||||||
//=== ОБРАБОТКА CAN-Ш<EFBFBD>?НЫ ===//
|
//=== ОБРАБОТКА CAN-ШИНЫ ===//
|
||||||
if (CanGO) // Флаг разрешения работы с CAN-шиной
|
if (CanGO) // Флаг разрешения работы с CAN-шиной
|
||||||
{
|
{
|
||||||
CanGO = 0; // Сбрасываем флаг
|
CanGO = 0; // Сбрасываем флаг
|
||||||
@ -303,10 +300,10 @@ int main(void)
|
|||||||
|
|
||||||
Next: // Метка для перехода к следующей части цикла
|
Next: // Метка для перехода к следующей части цикла
|
||||||
|
|
||||||
//=== ЧТЕН<EFBFBD>?Е ВХОДНЫХ С<>?ГНАЛОВ ===//
|
//=== ЧТЕНИЕ ВХОДНЫХ СИГНАЛОВ ===//
|
||||||
ReadEnteres(); // Функция чтения дискретных входов
|
ReadEnteres(); // Функция чтения дискретных входов
|
||||||
|
|
||||||
//=== УПРАВЛЕН<EFBFBD>?Е ВЫХОДНЫМ<D0AB>? С<>?ГНАЛАМ<D090>? ===//
|
//=== УПРАВЛЕНИЕ ВЫХОДНЫМИ СИГНАЛАМИ ===//
|
||||||
if (Errors.all | Alarms.all)
|
if (Errors.all | Alarms.all)
|
||||||
Pvt4_OFF; // Выключение сигнала "Система ВЭП в норме"
|
Pvt4_OFF; // Выключение сигнала "Система ВЭП в норме"
|
||||||
else
|
else
|
||||||
@ -329,7 +326,7 @@ int main(void)
|
|||||||
}
|
}
|
||||||
precom = Commands; // Сохранение текущих команд для следующей итерации
|
precom = Commands; // Сохранение текущих команд для следующей итерации
|
||||||
|
|
||||||
//=== ОБРАБОТКА С<EFBFBD>?СТЕМНЫХ КОМАНД ===//
|
//=== ОБРАБОТКА СИСТЕМНЫХ КОМАНД ===//
|
||||||
if (cDefParam) // Команда сброса параметров по умолчанию
|
if (cDefParam) // Команда сброса параметров по умолчанию
|
||||||
{
|
{
|
||||||
cDefParam = 0;
|
cDefParam = 0;
|
||||||
@ -430,28 +427,28 @@ int Isit(int num, int i, int z)
|
|||||||
{
|
{
|
||||||
int res, pls;
|
int res, pls;
|
||||||
|
|
||||||
//=== ПРОВЕРКА Д<EFBFBD>?АПАЗОНА ===//
|
//=== ПРОВЕРКА ДИАПАЗОНА ===//
|
||||||
// Если номер элемента вне допустимого диапазона (0x00-0x7F)
|
// Если номер элемента вне допустимого диапазона (0x00-0x7F)
|
||||||
if((num < 0) || (num >= 0x80))
|
if((num < 0) || (num >= 0x80))
|
||||||
return 0; // Элемент не активен
|
return 0; // Элемент не активен
|
||||||
|
|
||||||
//=== ПРОВЕРКА МАСК<EFBFBD>? КАНАЛА ===//
|
//=== ПРОВЕРКА МАСКИ КАНАЛА ===//
|
||||||
// Определяем битовую маску для данного элемента
|
// Определяем битовую маску для данного элемента
|
||||||
// num/0x10 - определяем индекс в массиве масок (0-7)
|
// num/0x10 - определяем индекс в массиве масок (0-7)
|
||||||
// num&0x0F - определяем позицию бита в слове (0-15)
|
// num&0x0F - определяем позицию бита в слове (0-15)
|
||||||
res = Maska[i][num / 0x10]; // Получаем маску для группы элементов
|
res = Maska[i][num / 0x10]; // Получаем маску для группы элементов
|
||||||
res &= (1 << (num & 0x0F)); // Проверяем конкретный бит в маске
|
res &= (1 << (num & 0x0F)); // Проверяем конкретный бит в маске
|
||||||
|
|
||||||
//=== ДОПОЛН<EFBFBD>?ТЕЛЬНЫЕ ПРОВЕРК<D0A0>? (если z != 0) ===//
|
//=== ДОПОЛНИТЕЛЬНЫЕ ПРОВЕРКИ (если z != 0) ===//
|
||||||
if(z)
|
if(z)
|
||||||
{
|
{
|
||||||
// Проверка времени ожидания: если превышена половина времени перезапуска
|
// Проверка времени ожидания: если превышена половина времени перезапуска
|
||||||
pls = (espero[num] > CanRestart[i] / 2);
|
pls = (espero[num] > CanRestart[i] / 2);
|
||||||
|
|
||||||
// <EFBFBD>?Л<>? проверка счетчика отправки (если county[num] != 0)
|
// ИЛИ проверка счетчика отправки (если county[num] != 0)
|
||||||
pls = pls || county[num];
|
pls = pls || county[num];
|
||||||
|
|
||||||
// Комбинированная проверка: должен быть установлен в маске <EFBFBD>? выполнять условия
|
// Комбинированная проверка: должен быть установлен в маске И выполнять условия
|
||||||
res = res && pls;
|
res = res && pls;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -481,25 +478,25 @@ void Millisecond()
|
|||||||
#define CANPOWSE 10 // 10 msec - период обновления CAN
|
#define CANPOWSE 10 // 10 msec - период обновления CAN
|
||||||
#define BLINK_TIME 250 // 0.25 sec - период мигания
|
#define BLINK_TIME 250 // 0.25 sec - период мигания
|
||||||
|
|
||||||
//=== ОБНОВЛЕН<EFBFBD>?Е WATCHDOG ===//
|
//=== ОБНОВЛЕНИЕ WATCHDOG ===//
|
||||||
if(!cReset)
|
if(!cReset)
|
||||||
IWDG->KR = 0xAAAA; // Сброс watchdog таймера
|
IWDG->KR = 0xAAAA; // Сброс watchdog таймера
|
||||||
|
|
||||||
//=== ПРОВЕРКА АКТ<EFBFBD>?ВНОСТ<D0A1>? ТАЙМЕРА ===//
|
//=== ПРОВЕРКА АКТИВНОСТИ ТАЙМЕРА ===//
|
||||||
if(!timGo) return; // Если таймер не активен - выход
|
if(!timGo) return; // Если таймер не активен - выход
|
||||||
|
|
||||||
//=== ЧТЕН<EFBFBD>?Е ПЕРЕКЛЮЧАТЕЛЕЙ <20>? КНОПОК ===//
|
//=== ЧТЕНИЕ ПЕРЕКЛЮЧАТЕЛЕЙ И КНОПОК ===//
|
||||||
Jumpers.byt.byte_1 = ReadJumpers(); // Чтение состояния переключателей
|
Jumpers.byt.byte_1 = ReadJumpers(); // Чтение состояния переключателей
|
||||||
Jumpers.bit.bit0 = Buttons.bit.bit0 = TestJumper(); // Чтение состояния кнопки
|
Jumpers.bit.bit0 = Buttons.bit.bit0 = TestJumper(); // Чтение состояния кнопки
|
||||||
|
|
||||||
//=== УПРАВЛЕН<EFBFBD>?Е CAN-Ш<>?НОЙ ===//
|
//=== УПРАВЛЕНИЕ CAN-ШИНОЙ ===//
|
||||||
if(++CanPowse >= CANPOWSE)
|
if(++CanPowse >= CANPOWSE)
|
||||||
{
|
{
|
||||||
CanPowse = 0; // Сброс счетчика
|
CanPowse = 0; // Сброс счетчика
|
||||||
CanGO = 1; // Установка флага разрешения работы CAN
|
CanGO = 1; // Установка флага разрешения работы CAN
|
||||||
}
|
}
|
||||||
|
|
||||||
//=== УПРАВЛЕН<EFBFBD>?Е РЕЖ<D095>?МОМ "ЗАСЫПАН<D090>?Я" ===//
|
//=== УПРАВЛЕНИЕ РЕЖИМОМ "ЗАСЫПАНИЯ" ===//
|
||||||
if(Alarms.bit.bit8) // Разряд батареи
|
if(Alarms.bit.bit8) // Разряд батареи
|
||||||
{
|
{
|
||||||
if (Falling_asleep) Falling_asleep--; // Уменьшение времени до "сна"
|
if (Falling_asleep) Falling_asleep--; // Уменьшение времени до "сна"
|
||||||
@ -507,7 +504,7 @@ void Millisecond()
|
|||||||
else
|
else
|
||||||
Falling_asleep = 1000L * Sleep_time; // Установка времени до "сна"
|
Falling_asleep = 1000L * Sleep_time; // Установка времени до "сна"
|
||||||
|
|
||||||
//=== ОБРАБОТКА ТЕСТОВОГО РЕЖ<EFBFBD>?МА ===//
|
//=== ОБРАБОТКА ТЕСТОВОГО РЕЖИМА ===//
|
||||||
TST = TestJumper() | cTestLamp; // Текущее состояние теста (кнопка или команда)
|
TST = TestJumper() | cTestLamp; // Текущее состояние теста (кнопка или команда)
|
||||||
|
|
||||||
if(TST & !preTest) // Обнаружение фронта нажатия кнопки
|
if(TST & !preTest) // Обнаружение фронта нажатия кнопки
|
||||||
@ -517,7 +514,7 @@ void Millisecond()
|
|||||||
}
|
}
|
||||||
preTest = TST; // Сохранение состояния для следующего вызова
|
preTest = TST; // Сохранение состояния для следующего вызова
|
||||||
|
|
||||||
//=== УПРАВЛЕН<EFBFBD>?Е М<>?ГАН<D090>?ЕМ <20>?НД<D09D>?КАТОРОВ ===//
|
//=== УПРАВЛЕНИЕ МИГАНИЕМ ИНДИКАТОРОВ ===//
|
||||||
if(++count_blink >= BLINK_TIME)
|
if(++count_blink >= BLINK_TIME)
|
||||||
{
|
{
|
||||||
count_blink = 0; // Сброс счетчика
|
count_blink = 0; // Сброс счетчика
|
||||||
@ -526,19 +523,19 @@ void Millisecond()
|
|||||||
blink_alarm = (count_mode & 7) ? 1 : 0; // Мигание 1:7 (12.5%)
|
blink_alarm = (count_mode & 7) ? 1 : 0; // Мигание 1:7 (12.5%)
|
||||||
}
|
}
|
||||||
|
|
||||||
//=== УСТАНОВКА СТАНДАРТНЫХ СОСТОЯН<EFBFBD>?Й <20>?НД<D09D>?КАТОРОВ ===//
|
//=== УСТАНОВКА СТАНДАРТНЫХ СОСТОЯНИЙ ИНДИКАТОРОВ ===//
|
||||||
power_lamp = 1; // Силовая лампа включена
|
power_lamp = 1; // Силовая лампа включена
|
||||||
norm_diod = 1; // Нормальный светодиод включен
|
norm_diod = 1; // Нормальный светодиод включен
|
||||||
work_diod = !blink_over; // Рабочий светодиод синхронизирован с миганием
|
work_diod = !blink_over; // Рабочий светодиод синхронизирован с миганием
|
||||||
|
|
||||||
//=== РЕЖ<EFBFBD>?М ТЕСТ<D0A1>?РОВАН<D090>?Я ===//
|
//=== РЕЖИМ ТЕСТИРОВАНИЯ ===//
|
||||||
if(TST)
|
if(TST)
|
||||||
{
|
{
|
||||||
power_lamp = blink_over; // Мигание силовой лампы
|
power_lamp = blink_over; // Мигание силовой лампы
|
||||||
norm_diod = blink_over; // Мигание нормального светодиода
|
norm_diod = blink_over; // Мигание нормального светодиода
|
||||||
work_diod = blink_over; // Мигание рабочего светодиода
|
work_diod = blink_over; // Мигание рабочего светодиода
|
||||||
}
|
}
|
||||||
//=== РЕЖ<EFBFBD>?М ОСВЕЩЕН<D095>?Я ===//
|
//=== РЕЖИМ ОСВЕЩЕНИЯ ===//
|
||||||
else if(Lightness)
|
else if(Lightness)
|
||||||
{
|
{
|
||||||
power_lamp = norm_diod = 0; // Базовое состояние - выключено
|
power_lamp = norm_diod = 0; // Базовое состояние - выключено
|
||||||
@ -555,20 +552,20 @@ void Millisecond()
|
|||||||
// Уровень освещенности 5: инверсное быстрое мигание (87.5%)
|
// Уровень освещенности 5: инверсное быстрое мигание (87.5%)
|
||||||
if(Lightness == 5) power_lamp = norm_diod = !blink_alarm;
|
if(Lightness == 5) power_lamp = norm_diod = !blink_alarm;
|
||||||
}
|
}
|
||||||
//=== РЕЖ<EFBFBD>?М ОШ<D09E>?БОК ===//
|
//=== РЕЖИМ ОШИБОК ===//
|
||||||
else if(Errors.all)
|
else if(Errors.all)
|
||||||
{
|
{
|
||||||
power_lamp = blink_over; // Мигание при ошибках
|
power_lamp = blink_over; // Мигание при ошибках
|
||||||
norm_diod = blink_over; // Мигание при ошибках
|
norm_diod = blink_over; // Мигание при ошибках
|
||||||
}
|
}
|
||||||
//=== РЕЖ<EFBFBD>?М ТРЕВОГ ===//
|
//=== РЕЖИМ ТРЕВОГ ===//
|
||||||
else if(Alarms.all)
|
else if(Alarms.all)
|
||||||
{
|
{
|
||||||
power_lamp = blink_alarm; // Быстрое мигание при тревогах
|
power_lamp = blink_alarm; // Быстрое мигание при тревогах
|
||||||
norm_diod = blink_alarm; // Быстрое мигание при тревогах
|
norm_diod = blink_alarm; // Быстрое мигание при тревогах
|
||||||
}
|
}
|
||||||
|
|
||||||
//=== Ш<EFBFBD>?М УПРАВЛЕН<D095>?Е ЯРКОСТЬЮ С<>?ЛОВОЙ ЛАМПЫ ===//
|
//=== ШИМ УПРАВЛЕНИЕ ЯРКОСТЬЮ СИЛОВОЙ ЛАМПЫ ===//
|
||||||
if(++count_bright == 10) // maximum_bright (100%)
|
if(++count_bright == 10) // maximum_bright (100%)
|
||||||
{
|
{
|
||||||
count_bright = 0;
|
count_bright = 0;
|
||||||
@ -576,11 +573,11 @@ void Millisecond()
|
|||||||
else Pvt1_OFF; // Выключение
|
else Pvt1_OFF; // Выключение
|
||||||
}
|
}
|
||||||
|
|
||||||
//=== УПРАВЛЕН<EFBFBD>?Е ЯРКОСТЬЮ ===//
|
//=== УПРАВЛЕНИЕ ЯРКОСТЬЮ ===//
|
||||||
if(count_bright == Brightness)
|
if(count_bright == Brightness)
|
||||||
if(!TST) Pvt1_OFF; // Отключение лампочки с регулировкой яркости
|
if(!TST) Pvt1_OFF; // Отключение лампочки с регулировкой яркости
|
||||||
|
|
||||||
//=== УПРАВЛЕН<EFBFBD>?Е СВЕТОД<D09E>?ОДАМ<D090>? ===//
|
//=== УПРАВЛЕНИЕ СВЕТОДИОДАМИ ===//
|
||||||
if(work_diod) LED_2_ON; // Включение рабочего светодиода
|
if(work_diod) LED_2_ON; // Включение рабочего светодиода
|
||||||
else LED_2_OFF; // Выключение рабочего светодиода
|
else LED_2_OFF; // Выключение рабочего светодиода
|
||||||
|
|
||||||
@ -611,7 +608,8 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
|
|||||||
/* USER CODE END Callback 0 */
|
/* USER CODE END Callback 0 */
|
||||||
if (htim->Instance == TIM8) {
|
if (htim->Instance == TIM8) {
|
||||||
HAL_IncTick();
|
HAL_IncTick();
|
||||||
}
|
Millisecond();
|
||||||
|
}
|
||||||
/* USER CODE BEGIN Callback 1 */
|
/* USER CODE BEGIN Callback 1 */
|
||||||
/* USER CODE END Callback 1 */
|
/* USER CODE END Callback 1 */
|
||||||
}
|
}
|
||||||
|
@ -152,18 +152,18 @@
|
|||||||
<Bp>
|
<Bp>
|
||||||
<Number>0</Number>
|
<Number>0</Number>
|
||||||
<Type>0</Type>
|
<Type>0</Type>
|
||||||
<LineNumber>81</LineNumber>
|
<LineNumber>49</LineNumber>
|
||||||
<EnabledFlag>1</EnabledFlag>
|
<EnabledFlag>1</EnabledFlag>
|
||||||
<Address>134288232</Address>
|
<Address>42</Address>
|
||||||
<ByteObject>0</ByteObject>
|
<ByteObject>0</ByteObject>
|
||||||
<HtxType>0</HtxType>
|
<HtxType>0</HtxType>
|
||||||
<ManyObjects>0</ManyObjects>
|
<ManyObjects>0</ManyObjects>
|
||||||
<SizeOfObject>0</SizeOfObject>
|
<SizeOfObject>0</SizeOfObject>
|
||||||
<BreakByAccess>0</BreakByAccess>
|
<BreakByAccess>0</BreakByAccess>
|
||||||
<BreakIfRCount>1</BreakIfRCount>
|
<BreakIfRCount>1</BreakIfRCount>
|
||||||
<Filename>../Core/Src/main.c</Filename>
|
<Filename>..\Core\Bootloader\bootloader.c</Filename>
|
||||||
<ExecCommand></ExecCommand>
|
<ExecCommand></ExecCommand>
|
||||||
<Expression>\\uksvep_2_2_v1\../Core/Src/main.c\81</Expression>
|
<Expression>\\uksvep_2_2_v1\../Core/Bootloader/bootloader.c\49</Expression>
|
||||||
</Bp>
|
</Bp>
|
||||||
</Breakpoint>
|
</Breakpoint>
|
||||||
<WatchWindow1>
|
<WatchWindow1>
|
||||||
@ -212,7 +212,7 @@
|
|||||||
<Mm>
|
<Mm>
|
||||||
<WinNumber>1</WinNumber>
|
<WinNumber>1</WinNumber>
|
||||||
<SubType>0</SubType>
|
<SubType>0</SubType>
|
||||||
<ItemText>0x0800d000</ItemText>
|
<ItemText>0x0800c000</ItemText>
|
||||||
<AccSizeX>0</AccSizeX>
|
<AccSizeX>0</AccSizeX>
|
||||||
</Mm>
|
</Mm>
|
||||||
</MemoryWindow1>
|
</MemoryWindow1>
|
||||||
@ -267,6 +267,10 @@
|
|||||||
<pSingCmdsp></pSingCmdsp>
|
<pSingCmdsp></pSingCmdsp>
|
||||||
<pMultCmdsp></pMultCmdsp>
|
<pMultCmdsp></pMultCmdsp>
|
||||||
<SystemViewers>
|
<SystemViewers>
|
||||||
|
<Entry>
|
||||||
|
<Name>System Viewer\BKP</Name>
|
||||||
|
<WinId>35902</WinId>
|
||||||
|
</Entry>
|
||||||
<Entry>
|
<Entry>
|
||||||
<Name>System Viewer\CAN</Name>
|
<Name>System Viewer\CAN</Name>
|
||||||
<WinId>35904</WinId>
|
<WinId>35904</WinId>
|
||||||
@ -275,6 +279,10 @@
|
|||||||
<Name>System Viewer\GPIOB</Name>
|
<Name>System Viewer\GPIOB</Name>
|
||||||
<WinId>35905</WinId>
|
<WinId>35905</WinId>
|
||||||
</Entry>
|
</Entry>
|
||||||
|
<Entry>
|
||||||
|
<Name>System Viewer\IWDG</Name>
|
||||||
|
<WinId>35903</WinId>
|
||||||
|
</Entry>
|
||||||
</SystemViewers>
|
</SystemViewers>
|
||||||
<DebugDescription>
|
<DebugDescription>
|
||||||
<Enable>1</Enable>
|
<Enable>1</Enable>
|
||||||
@ -417,89 +425,41 @@
|
|||||||
<Bp>
|
<Bp>
|
||||||
<Number>0</Number>
|
<Number>0</Number>
|
||||||
<Type>0</Type>
|
<Type>0</Type>
|
||||||
<LineNumber>210</LineNumber>
|
<LineNumber>1300</LineNumber>
|
||||||
<EnabledFlag>1</EnabledFlag>
|
<EnabledFlag>1</EnabledFlag>
|
||||||
<Address>134220168</Address>
|
<Address>134222002</Address>
|
||||||
<ByteObject>0</ByteObject>
|
<ByteObject>0</ByteObject>
|
||||||
<HtxType>0</HtxType>
|
<HtxType>0</HtxType>
|
||||||
<ManyObjects>0</ManyObjects>
|
<ManyObjects>0</ManyObjects>
|
||||||
<SizeOfObject>0</SizeOfObject>
|
<SizeOfObject>0</SizeOfObject>
|
||||||
<BreakByAccess>0</BreakByAccess>
|
<BreakByAccess>0</BreakByAccess>
|
||||||
<BreakIfRCount>1</BreakIfRCount>
|
<BreakIfRCount>1</BreakIfRCount>
|
||||||
<Filename>..\Core\Bootloader\bootloader.c</Filename>
|
<Filename>../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_can.c</Filename>
|
||||||
<ExecCommand></ExecCommand>
|
<ExecCommand></ExecCommand>
|
||||||
<Expression>\\bootloader\../Core/Bootloader/bootloader.c\210</Expression>
|
<Expression>\\bootloader\../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_can.c\1300</Expression>
|
||||||
</Bp>
|
</Bp>
|
||||||
<Bp>
|
<Bp>
|
||||||
<Number>1</Number>
|
<Number>1</Number>
|
||||||
<Type>0</Type>
|
<Type>0</Type>
|
||||||
<LineNumber>216</LineNumber>
|
<LineNumber>850</LineNumber>
|
||||||
<EnabledFlag>1</EnabledFlag>
|
<EnabledFlag>1</EnabledFlag>
|
||||||
<Address>134220188</Address>
|
<Address>134221508</Address>
|
||||||
<ByteObject>0</ByteObject>
|
<ByteObject>0</ByteObject>
|
||||||
<HtxType>0</HtxType>
|
<HtxType>0</HtxType>
|
||||||
<ManyObjects>0</ManyObjects>
|
<ManyObjects>0</ManyObjects>
|
||||||
<SizeOfObject>0</SizeOfObject>
|
<SizeOfObject>0</SizeOfObject>
|
||||||
<BreakByAccess>0</BreakByAccess>
|
<BreakByAccess>0</BreakByAccess>
|
||||||
<BreakIfRCount>1</BreakIfRCount>
|
<BreakIfRCount>1</BreakIfRCount>
|
||||||
<Filename>..\Core\Bootloader\bootloader.c</Filename>
|
<Filename>../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash.c</Filename>
|
||||||
<ExecCommand></ExecCommand>
|
<ExecCommand></ExecCommand>
|
||||||
<Expression>\\bootloader\../Core/Bootloader/bootloader.c\216</Expression>
|
<Expression>\\bootloader\../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash.c\850</Expression>
|
||||||
</Bp>
|
|
||||||
<Bp>
|
|
||||||
<Number>2</Number>
|
|
||||||
<Type>0</Type>
|
|
||||||
<LineNumber>111</LineNumber>
|
|
||||||
<EnabledFlag>1</EnabledFlag>
|
|
||||||
<Address>134219682</Address>
|
|
||||||
<ByteObject>0</ByteObject>
|
|
||||||
<HtxType>0</HtxType>
|
|
||||||
<ManyObjects>0</ManyObjects>
|
|
||||||
<SizeOfObject>0</SizeOfObject>
|
|
||||||
<BreakByAccess>0</BreakByAccess>
|
|
||||||
<BreakIfRCount>1</BreakIfRCount>
|
|
||||||
<Filename>..\Core\Bootloader\bootloader.c</Filename>
|
|
||||||
<ExecCommand></ExecCommand>
|
|
||||||
<Expression>\\bootloader\../Core/Bootloader/bootloader.c\111</Expression>
|
|
||||||
</Bp>
|
|
||||||
<Bp>
|
|
||||||
<Number>3</Number>
|
|
||||||
<Type>0</Type>
|
|
||||||
<LineNumber>214</LineNumber>
|
|
||||||
<EnabledFlag>1</EnabledFlag>
|
|
||||||
<Address>0</Address>
|
|
||||||
<ByteObject>0</ByteObject>
|
|
||||||
<HtxType>0</HtxType>
|
|
||||||
<ManyObjects>0</ManyObjects>
|
|
||||||
<SizeOfObject>0</SizeOfObject>
|
|
||||||
<BreakByAccess>0</BreakByAccess>
|
|
||||||
<BreakIfRCount>0</BreakIfRCount>
|
|
||||||
<Filename>..\Core\Bootloader\bootloader.c</Filename>
|
|
||||||
<ExecCommand></ExecCommand>
|
|
||||||
<Expression></Expression>
|
|
||||||
</Bp>
|
|
||||||
<Bp>
|
|
||||||
<Number>4</Number>
|
|
||||||
<Type>0</Type>
|
|
||||||
<LineNumber>219</LineNumber>
|
|
||||||
<EnabledFlag>1</EnabledFlag>
|
|
||||||
<Address>0</Address>
|
|
||||||
<ByteObject>0</ByteObject>
|
|
||||||
<HtxType>0</HtxType>
|
|
||||||
<ManyObjects>0</ManyObjects>
|
|
||||||
<SizeOfObject>0</SizeOfObject>
|
|
||||||
<BreakByAccess>0</BreakByAccess>
|
|
||||||
<BreakIfRCount>0</BreakIfRCount>
|
|
||||||
<Filename>..\Core\Bootloader\bootloader.c</Filename>
|
|
||||||
<ExecCommand></ExecCommand>
|
|
||||||
<Expression></Expression>
|
|
||||||
</Bp>
|
</Bp>
|
||||||
</Breakpoint>
|
</Breakpoint>
|
||||||
<WatchWindow1>
|
<WatchWindow1>
|
||||||
<Ww>
|
<Ww>
|
||||||
<count>0</count>
|
<count>0</count>
|
||||||
<WinNumber>1</WinNumber>
|
<WinNumber>1</WinNumber>
|
||||||
<ItemText>boot</ItemText>
|
<ItemText>boot,0x10</ItemText>
|
||||||
</Ww>
|
</Ww>
|
||||||
<Ww>
|
<Ww>
|
||||||
<count>1</count>
|
<count>1</count>
|
||||||
@ -541,7 +501,7 @@
|
|||||||
<Mm>
|
<Mm>
|
||||||
<WinNumber>1</WinNumber>
|
<WinNumber>1</WinNumber>
|
||||||
<SubType>0</SubType>
|
<SubType>0</SubType>
|
||||||
<ItemText>0x0800d000</ItemText>
|
<ItemText>0x08011800</ItemText>
|
||||||
<AccSizeX>0</AccSizeX>
|
<AccSizeX>0</AccSizeX>
|
||||||
</Mm>
|
</Mm>
|
||||||
</MemoryWindow1>
|
</MemoryWindow1>
|
||||||
@ -604,6 +564,10 @@
|
|||||||
<Name>System Viewer\CAN</Name>
|
<Name>System Viewer\CAN</Name>
|
||||||
<WinId>35904</WinId>
|
<WinId>35904</WinId>
|
||||||
</Entry>
|
</Entry>
|
||||||
|
<Entry>
|
||||||
|
<Name>System Viewer\FLASH</Name>
|
||||||
|
<WinId>35900</WinId>
|
||||||
|
</Entry>
|
||||||
<Entry>
|
<Entry>
|
||||||
<Name>System Viewer\GPIOB</Name>
|
<Name>System Viewer\GPIOB</Name>
|
||||||
<WinId>35905</WinId>
|
<WinId>35905</WinId>
|
||||||
|
Loading…
Reference in New Issue
Block a user