#ifndef __BOOT_SETUP_H
#define __BOOT_SETUP_H

#include "stm32f1xx_hal.h"

// ======================== BOOTLOADER CONFIG ========================

// ---------- MAIN APPLICATION defines ----------
// Адрес и страницы Flash для основного приложения
// MAIN_APP_START_ADR – начало кода основного приложения
#define MAIN_APP_START_ADR    (uint32_t)0x0800C000UL
#define MAIN_APP_PAGE         21                        // страница, с которой начинается приложение
#define MAIN_APP_NUM_OF_PAGE  250-MAIN_APP_PAGE         // количество страниц, отведённых под приложение

// ---------- KEY defines ----------
// Адрес и страница Flash для хранения ключа бутлоадера
// Ключ используется для проверки, записано ли приложение корректно
#define BOOTLOADER_KEY_ADR    (uint32_t)0x08009800UL   // физический адрес ключа
#define BOOTLOADER_KEY_PAGE   20                        // страница флеш, на которой хранится ключ

// ---------- RECEIVE defines ----------
// Настройки приёма прошивки
#define FW_RECEIVE_TIMEOUT_MS 500   // таймаут приёма одного байта прошивки (мс)
#define PAGE_SIZE             2048  // размер блока (страницы) прошивки для приёма и записи в Flash
                                    // должен быть таким, чтобы размер страниц Flash был кратен ему

// ---------- LED defines ----------
#define LED_BOOT_Pin          GPIO_PIN_5
#define LED_BOOT_GPIO_Port    GPIOB

// ======================== RCC (CLOCK) defines ========================

// Макросы для включения тактирования периферии бутлоадера
#define __RCC_LED_BOOT_CLK_ENABLE()    __HAL_RCC_GPIOB_CLK_ENABLE()   // тактирование UART
#define __RCC_UART_BOOT_CLK_ENABLE()   __HAL_RCC_UART4_CLK_ENABLE()   // тактирование UART
#define __RCC_UART_PORT_CLK_ENABLE()   __HAL_RCC_GPIOC_CLK_ENABLE()   // тактирование порта UART
#define __RCC_CAN_BOOT_CLK_ENABLE()    __HAL_RCC_CAN1_CLK_ENABLE()    // тактирование CAN
#define __RCC_CAN_PORT_CLK_ENABLE()    __HAL_RCC_GPIOA_CLK_ENABLE()   // тактирование порта CAN

// ======================== UART defines ========================

// Аппаратный UART и скорость передачи
#define UART_BOOT          UART4
#define UART_SPEED         115200

// Порт и пины UART
#define UART_PORT          GPIOC
#define UART_PIN_TX        GPIO_PIN_10
#define UART_PIN_RX        GPIO_PIN_11

// ======================== CAN defines ========================

// Аппаратный CAN и режим работы
#define CAN_BOOT           CAN1
#define CAN_MODE           CAN_MODE_NORMAL

//      Настройка скорости CAN при 8 MHz
// ------------|-----------|-----------|-----------
//  CAN speed  | Prescaler | BS1       | BS2
// ------------|-----------|-----------|-----------
//  125 kbps   | 4         | 13TQ      | 2TQ
//  250 kbps   | 2         | 13TQ      | 2TQ
//  500 kbps   | 1         | 13TQ      | 2TQ
#define CAN_SPEED_PRESCALER  4
#define CAN_SPEED_BS1        CAN_BS1_13TQ
#define CAN_SPEED_BS2        CAN_BS2_2TQ

// Порт и пины CAN
#define CAN_PORT           GPIOA
#define CAN_PIN_RX         GPIO_PIN_11
#define CAN_PIN_TX         GPIO_PIN_12

#endif //__BOOT_SETUP_H
