diff --git a/Core/Bootloader/boot_can.c b/Core/Bootloader/boot_can.c new file mode 100644 index 0000000..5a83457 --- /dev/null +++ b/Core/Bootloader/boot_can.c @@ -0,0 +1,128 @@ +#include "boot_can.h" + +CAN_HandleTypeDef hcan_boot; + +/** + * @brief Инициализация CAN для бутлоадера (по defines) + */ +void MX_BOOT_CAN_Init(void) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + CAN_FilterTypeDef sFilterConfig; + + /* Включаем тактирование */ + __RCC_CAN_BOOT_CLK_ENABLE(); + __RCC_CAN_PORT_CLK_ENABLE(); + + /* Настройка пинов RX/TX */ + GPIO_InitStruct.Pin = CAN_PIN_RX; + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(CAN_PORT, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = CAN_PIN_TX; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + HAL_GPIO_Init(CAN_PORT, &GPIO_InitStruct); + + /* Настройка CAN */ + hcan_boot.Instance = CAN_BOOT; + hcan_boot.Init.Prescaler = CAN_SPEED_PRESCALER; + hcan_boot.Init.Mode = CAN_MODE; + hcan_boot.Init.SyncJumpWidth = CAN_SJW_1TQ; + hcan_boot.Init.TimeSeg1 = CAN_SPEED_BS1; + hcan_boot.Init.TimeSeg2 = CAN_SPEED_BS2; + hcan_boot.Init.TimeTriggeredMode = DISABLE; + hcan_boot.Init.AutoBusOff = DISABLE; + hcan_boot.Init.AutoWakeUp = DISABLE; + hcan_boot.Init.AutoRetransmission = ENABLE; + hcan_boot.Init.ReceiveFifoLocked = DISABLE; + hcan_boot.Init.TransmitFifoPriority = DISABLE; + + if (HAL_CAN_Init(&hcan_boot) != HAL_OK) + { + Error_Handler(); + } + + /* Настройка фильтра: пропускать все сообщения */ + sFilterConfig.FilterBank = 0; + sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; + sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; + sFilterConfig.FilterIdHigh = 0x0000; + sFilterConfig.FilterIdLow = 0x0000; + sFilterConfig.FilterMaskIdHigh = 0x0000; + sFilterConfig.FilterMaskIdLow = 0x0000; + sFilterConfig.FilterFIFOAssignment = CAN_FILTER_FIFO0; + sFilterConfig.FilterActivation = ENABLE; + + if (HAL_CAN_ConfigFilter(&hcan_boot, &sFilterConfig) != HAL_OK) + { + Error_Handler(); + } + + /* Запускаем CAN */ + if (HAL_CAN_Start(&hcan_boot) != HAL_OK) + { + Error_Handler(); + } +} + +// ----------------------------- +// CAN: приём страницы + CRC с таймаутом +// ----------------------------- +void Bootloader_CAN_Receive_Page(Bootloader_t *bl) +{ + uint16_t bytes_received = 0; + uint8_t crc_buf[4]; + CAN_RxHeaderTypeDef canHeader; + uint8_t canData[8]; + uint32_t start_tick = HAL_GetTick(); + + // Приём данных страницы + while(bytes_received < PAGE_SIZE) + { + if(HAL_CAN_GetRxFifoFillLevel(bl->hcan, CAN_RX_FIFO0) > 0) + { + if(HAL_CAN_GetRxMessage(bl->hcan, CAN_RX_FIFO0, &canHeader, canData) == HAL_OK) + { + uint8_t len = canHeader.DLC; + if(bytes_received + len > PAGE_SIZE) + len = PAGE_SIZE - bytes_received; + + memcpy(&bl->fw_buffer[bytes_received], canData, len); + bytes_received += len; + start_tick = HAL_GetTick(); // сброс таймера + } + } + + // проверка таймаута + if(HAL_GetTick() - start_tick >= FW_RECEIVE_TIMEOUT_MS) + { + bl->state = BL_STATE_ERROR; + return; + } + } + + // Приём CRC (следующий CAN пакет) + while(1) + { + if(HAL_CAN_GetRxFifoFillLevel(bl->hcan, CAN_RX_FIFO0) > 0) + { + if(HAL_CAN_GetRxMessage(bl->hcan, CAN_RX_FIFO0, &canHeader, canData) == HAL_OK) + { + // первые 4 байта = CRC + bl->fw_crc = (canData[0] << 24) | (canData[1] << 16) | (canData[2] << 8) | canData[3]; + break; + } + } + + if(HAL_GetTick() - start_tick >= FW_RECEIVE_TIMEOUT_MS) + { + bl->state = BL_STATE_ERROR; + return; + } + } + + bl->fw_len = bytes_received; + bl->state = BL_STATE_IDLE; +} \ No newline at end of file diff --git a/Core/Bootloader/boot_can.h b/Core/Bootloader/boot_can.h new file mode 100644 index 0000000..511a873 --- /dev/null +++ b/Core/Bootloader/boot_can.h @@ -0,0 +1,11 @@ +#ifndef __BOOT_CAN_H +#define __BOOT_CAN_H + +#include "bootloader.h" + +extern CAN_HandleTypeDef hcan_boot; + +void MX_BOOT_CAN_Init(void); +void Bootloader_CAN_Receive_Page(Bootloader_t *bl); + +#endif //__BOOT_CAN_H \ No newline at end of file diff --git a/Core/Bootloader/boot_flash.c b/Core/Bootloader/boot_flash.c new file mode 100644 index 0000000..ec9c743 --- /dev/null +++ b/Core/Bootloader/boot_flash.c @@ -0,0 +1,94 @@ +#include "boot_flash.h" +//uint32_t PAGE_OFFSET = ((uint32_t)((4-1) * 0x0400)); +uint32_t PAGE_NUMB = 127; + + +HAL_StatusTypeDef FLASH_Erase_App(void) // +{ + HAL_StatusTypeDef res; + uint32_t PageError = 0x00; + + res = HAL_FLASH_Unlock(); + + if (res != HAL_OK) return res; + + FLASH_EraseInitTypeDef EraseInitStruct; + + EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;// erase pages + EraseInitStruct.Banks = 1; + EraseInitStruct.PageAddress = MAIN_APP_START_ADR; //address + EraseInitStruct.NbPages = MAIN_APP_NUM_OF_PAGE;// num of erased pages + + res = HAL_FLASHEx_Erase(&EraseInitStruct, &PageError); + + if (res != HAL_OK) return res; + + res = HAL_FLASH_Lock(); + + return res; +} + + + + +uint8_t *FLASH_Read(uint32_t add) +{ + return (uint8_t *)add; +} + +HAL_StatusTypeDef FLASH_Write_Word(uint32_t Address, uint64_t Data) //Куда записывать +{ + HAL_StatusTypeDef res; + + res = HAL_FLASH_Unlock(); + + if (res != HAL_OK) return res; + + res = HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, Address, (uint32_t)(Data)); + + if (res != HAL_OK) return res; + + res = HAL_FLASH_Lock(); + + return res; +} +uint32_t word_data; + + + + +HAL_StatusTypeDef FLASH_Write_Page(uint32_t *Address, uint8_t *Data, int Data_size) +{ + //GPIOB->ODR^=(0x2000); +// GPIOB->ODR|=0x4000; + + HAL_StatusTypeDef res; + int data_cnt = 0; + uint32_t adr; + + + res = HAL_FLASH_Unlock(); + + if (res != HAL_OK) return res; + + for (adr = *Address; adr < *Address + Data_size; adr = adr+4) + { + word_data = ( + Data[data_cnt]| + Data[data_cnt+1]<<8| + Data[data_cnt+2]<<16| + Data[data_cnt+3]<<24); + + res = HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, adr, word_data); + + if (res != HAL_OK) return res; + + data_cnt +=4; + } + + *Address += Data_size; + res = HAL_FLASH_Lock(); + + return res; +} + diff --git a/Core/Bootloader/boot_flash.h b/Core/Bootloader/boot_flash.h new file mode 100644 index 0000000..9e810e7 --- /dev/null +++ b/Core/Bootloader/boot_flash.h @@ -0,0 +1,13 @@ +#ifndef __BOOT_FLASH_H +#define __BOOT_FLASH_H + +#include "bootloader.h" + + + +HAL_StatusTypeDef FLASH_Erase_App(void); +HAL_StatusTypeDef FLASH_Write_Page(uint32_t *Address, uint8_t *Data, int Data_size); +HAL_StatusTypeDef FLASH_Write_Word(uint32_t Address, uint64_t Data); +uint8_t *FLASH_Read(uint32_t add); + +#endif //__BOOT_FLASH_H \ No newline at end of file diff --git a/Core/Bootloader/boot_main.c b/Core/Bootloader/boot_main.c new file mode 100644 index 0000000..5edb88d --- /dev/null +++ b/Core/Bootloader/boot_main.c @@ -0,0 +1,25 @@ +#include "bootloader.h" +Bootloader_t boot = {0}; + +int main() +{ + boot.state = BL_STATE_INIT; + while (1) + { + Bootloader_Task(&boot); + } +} + +/** + * @brief This function handles System tick timer. + */ +void SysTick_Handler(void) +{ + /* USER CODE BEGIN SysTick_IRQn 0 */ + + /* USER CODE END SysTick_IRQn 0 */ + HAL_IncTick(); + /* USER CODE BEGIN SysTick_IRQn 1 */ + + /* USER CODE END SysTick_IRQn 1 */ +} \ No newline at end of file diff --git a/Core/Bootloader/boot_project_setup.h b/Core/Bootloader/boot_project_setup.h new file mode 100644 index 0000000..c13146e --- /dev/null +++ b/Core/Bootloader/boot_project_setup.h @@ -0,0 +1,63 @@ +#ifndef __BOOT_SETUP_H +#define __BOOT_SETUP_H + +#include "stm32f1xx_hal.h" + +// === BOOTLOADER defines === +// KEY defines +#define BOOTLOADER_KEY_ADR (uint32_t)0x08009800 +#define BOOTLOADER_KEY_PAGE 20 +// MAIN APP defines +#define MAIN_APP_START_ADR (uint32_t)0x0800C000 +#define MAIN_APP_PAGE 21 +#define MAIN_APP_NUM_OF_PAGE 250-MAIN_APP_PAGE + + +#define FW_RECEIVE_TIMEOUT_MS 5000 // таймаут приёма страницы +#define PAGE_SIZE 2048 + + +typedef enum { + CMD_ERASE = 0x01, ///< Команда на стирание прошивки + CMD_START_RECEIVE, ///< Команда на старт приема прошивки + CMD_WRITE, ///< Команда на запись блока прошивки + CMD_VERIFY, ///< Команда на проверку прошивки + CMD_GOTOAPP, ///< Команда на переход в приложение + CMD_RESET, ///< Команда на переход в приложение + CMD_GO_TO_BOOT, ///< Команда на переход в приложение +}BootloaderCommand_t; + + + +// === RCC defines === +#define __RCC_UART_BOOT_CLK_ENABLE() __HAL_RCC_USART3_CLK_ENABLE() +#define __RCC_UART_PORT_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE() +#define __RCC_CAN_BOOT_CLK_ENABLE() __HAL_RCC_CAN1_CLK_ENABLE() +#define __RCC_CAN_PORT_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() + + +// === UART defines === +#define UART_BOOT USART3 +#define UART_SPEED 256000 +#define UART_BOOT_IRQn USART3_IRQn + +#define UART_PORT GPIOB // usart port +#define UART_PIN_TX GPIO_PIN_10 +#define UART_PIN_RX GPIO_PIN_11 + + +// === CAN defines === +#define CAN_BOOT CAN1 +#define CAN_MODE CAN_MODE_NORMAL +// Presacler = 1: 500 kbps при 8 MHz +#define CAN_SPEED_PRESCALER 2 +#define CAN_SPEED_BS1 CAN_BS1_13TQ +#define CAN_SPEED_BS2 CAN_BS2_2TQ + +#define CAN_PORT GPIOA // can port +#define CAN_PIN_RX GPIO_PIN_11 +#define CAN_PIN_TX GPIO_PIN_12 + +#define CAN_BOOT_IRQn USB_LP_CAN1_RX0_IRQn + +#endif //__BOOT_SETUP_H \ No newline at end of file diff --git a/Core/Bootloader/boot_uart.c b/Core/Bootloader/boot_uart.c new file mode 100644 index 0000000..23cc1d3 --- /dev/null +++ b/Core/Bootloader/boot_uart.c @@ -0,0 +1,95 @@ +#include "boot_uart.h" + +UART_HandleTypeDef huart_boot; + +/** + * @brief Инициализация UART для бутлоадера + * @note Использует USART3, PB10 (TX), PB11 (RX) + */ +void MX_BOOT_UART_Init(void) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + + /* Включаем тактирование */ + __RCC_UART_BOOT_CLK_ENABLE(); + __RCC_UART_PORT_CLK_ENABLE(); + + /* Настройка GPIO TX/RX */ + GPIO_InitStruct.Pin = UART_PIN_TX | UART_PIN_RX; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + HAL_GPIO_Init(UART_PORT, &GPIO_InitStruct); + + /* Настройка UART */ + huart_boot.Instance = UART_BOOT; + huart_boot.Init.BaudRate = UART_SPEED; + huart_boot.Init.WordLength = UART_WORDLENGTH_8B; + huart_boot.Init.StopBits = UART_STOPBITS_1; + huart_boot.Init.Parity = UART_PARITY_NONE; + huart_boot.Init.Mode = UART_MODE_TX_RX; + huart_boot.Init.HwFlowCtl = UART_HWCONTROL_NONE; + huart_boot.Init.OverSampling = UART_OVERSAMPLING_16; + + if (HAL_UART_Init(&huart_boot) != HAL_OK) + { + Error_Handler(); // твоя функция обработки ошибок + } +} + +// ----------------------------- +// UART: приём страницы + CRC +// ----------------------------- +void Bootloader_UART_Receive_Page(Bootloader_t *bl) +{ + uint16_t bytes_received = 0; + uint8_t crc_buf[4]; + HAL_StatusTypeDef res; + uint32_t start_tick = HAL_GetTick(); // старт таймера + + // Приём данных страницы + while(bytes_received < PAGE_SIZE) + { + uint8_t byte = 0; + res = HAL_UART_Receive(bl->huart, &byte, 1, 100); // блокирующий приём 100ms + + if(res == HAL_OK) + { + bl->fw_buffer[bytes_received++] = byte; + start_tick = HAL_GetTick(); // сброс таймера при успешном приёме + } + else + { + // проверка таймаута + if(HAL_GetTick() - start_tick >= FW_RECEIVE_TIMEOUT_MS) + { + bl->state = BL_STATE_ERROR; // превышен таймаут + return; + } + // иначе просто ждем следующего байта + } + } + + // Приём CRC (4 байта) + for(uint8_t i = 0; i < 4; i++) + { + res = HAL_UART_Receive(bl->huart, &crc_buf[i], 1, 100); + if(res == HAL_OK) + { + start_tick = HAL_GetTick(); // сброс таймера + } + else + { + if(HAL_GetTick() - start_tick >= FW_RECEIVE_TIMEOUT_MS) + { + bl->state = BL_STATE_ERROR; + return; + } + } + } + + // Сохраняем CRC в структуру + bl->fw_crc = (crc_buf[0] << 24) | (crc_buf[1] << 16) | (crc_buf[2] << 8) | crc_buf[3]; + bl->fw_len = bytes_received; + bl->state = BL_STATE_IDLE; +} diff --git a/Core/Bootloader/boot_uart.h b/Core/Bootloader/boot_uart.h new file mode 100644 index 0000000..36e9242 --- /dev/null +++ b/Core/Bootloader/boot_uart.h @@ -0,0 +1,7 @@ +#ifndef __BOOT_UART_H +#define __BOOT_UART_H + +#include "bootloader.h" +extern UART_HandleTypeDef huart_boot; +void MX_BOOT_UART_Init(void); +#endif //__BOOT_UART_H \ No newline at end of file diff --git a/Core/Bootloader/bootloader.c b/Core/Bootloader/bootloader.c new file mode 100644 index 0000000..33afd93 --- /dev/null +++ b/Core/Bootloader/bootloader.c @@ -0,0 +1,306 @@ +#include "bootloader.h" +#include "boot_flash.h" +#include "boot_uart.h" +#include "boot_can.h" + +CAN_TxHeaderTypeDef TxHeader; +CAN_RxHeaderTypeDef RxHeader; +uint32_t TxMailBox = 0; // num of used mail + +void SetKey(void); +uint32_t ReadKey(void); +void ResetKey(void); +void Boot_SystemClock_Config(void); +void JumpToApplocation(void); + +void Bootloader_UART_Receive_Page(Bootloader_t *bl); +void Bootloader_CAN_Receive_Page(Bootloader_t *bl); + +void Bootloader_Init(void) +{ + HAL_Init(); + Boot_SystemClock_Config(); + MX_BOOT_UART_Init(); + MX_BOOT_CAN_Init(); +} + +HAL_StatusTypeDef res_hal; + + +void Bootloader_Task(Bootloader_t *bl) +{ + switch (bl->state) + { + case BL_STATE_INIT: + // Проверяем ключ, чтобы понять запускать приложение или программирование + if (ReadKey() == BL_KEY_APP_WRITTEN) + { + bl->state = BL_STATE_JUMP_TO_APP; + break; // не инициализируем, а сразу прыгаем в приложение + } + else + { + bl->state = BL_STATE_IDLE; + } + + // Инициализация периферии + Bootloader_Init(); + bl->huart = &huart_boot; + bl->hcan = &hcan_boot; + bl->addr = MAIN_APP_START_ADR; + break; + + case BL_STATE_IDLE: + // Ждем команды по UART или CAN + if(bl->state != bl->prev_state) + { + static uint8_t Data[8] = {0}; + static uint32_t TxMail = {0}; + Data[0] = 0xFA; + HAL_CAN_AddTxMessage(bl->hcan, &bl->TxHeader, Data, &TxMail); + HAL_UART_Transmit() + } + if (Receive_FW_Command(bl) == 0xFF) // функция обработки команд, возвращает 1 если ошибка + { + bl->state = BL_STATE_ERROR; + } + break; + + case BL_STATE_ERASE: + ResetKey(); + if (FLASH_Erase_App() == HAL_OK) // твоя функция стирания MAIN_APP_PAGE..NUM + { + bl->state = BL_STATE_IDLE; + } + else + { + bl->state = BL_STATE_ERROR; + } + break; + + case BL_STATE_RECEIVE_UART: + // В этом состоянии мы просто принимаем страницу + CRC + Bootloader_UART_Receive_Page(bl); + break; + case BL_STATE_RECEIVE_CAN: + Bootloader_CAN_Receive_Page(bl); + break; + + case BL_STATE_WRITE: + if (FLASH_Write_Page(&bl->addr, bl->fw_buffer, bl->fw_len) == HAL_OK) // запись блока во Flash + { + bl->state = BL_STATE_IDLE; // ждём следующего блока + } + else + { + bl->state = BL_STATE_ERROR; + } + break; + + case BL_STATE_VERIFY: + if (/*Verify_Flash_CRC(bl->fw_crc)*/0 == HAL_OK) + { + ResetKey(); + SetKey(); // отметка, что прошивка записана + bl->state = BL_STATE_IDLE; + } + else + { + bl->state = BL_STATE_ERROR; + } + break; + + case BL_STATE_JUMP_TO_APP: + JumpToApplocation(); + break; + + case BL_STATE_ERROR: + // обработка ошибок (можно светодиод, повторная инициализация, лог по UART) + Error_Handler(); + break; + + default: + bl->state = BL_STATE_ERROR; + break; + } + bl->prev_state = bl->state; + +} + +/** + * @brief Обработка команд прошивки по UART или CAN + * @param bl: указатель на структуру бутлоадера + * @retval 0x00 - команда принята и обработана, 0xFF - ошибка + */ +uint8_t Receive_FW_Command(Bootloader_t *bl) +{ + BootloaderCommand_t cmd = 0; + HAL_StatusTypeDef res = HAL_ERROR; + + // --------------------------- + // Чтение команды по UART + // --------------------------- + res = HAL_UART_Receive(bl->huart, &cmd, 1, 10); // таймаут 10 ms + if (res == HAL_OK) + { + switch(cmd) + { + case CMD_ERASE: // команда: стереть Flash + bl->state = BL_STATE_ERASE; + return 0x00; + case CMD_START_RECEIVE: // команда: принять блок + bl->state = BL_STATE_RECEIVE_UART; + 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; + return 0x00; + + default: + return 0xFF; // неизвестная команда + } + } + + // --------------------------- + // Чтение команды по CAN + // --------------------------- + CAN_RxHeaderTypeDef canHeader; + uint8_t canData[8]; + if (HAL_CAN_GetRxFifoFillLevel(bl->hcan, CAN_RX_FIFO0) > 0) + { + if (HAL_CAN_GetRxMessage(bl->hcan, CAN_RX_FIFO0, &canHeader, canData) == HAL_OK) + { + cmd = canData[0]; // предполагаем, что команда в первом байте + switch(cmd) + { + case CMD_ERASE: + bl->state = BL_STATE_ERASE; + return 0x00; + case CMD_START_RECEIVE: + // запускаем прием первой страницы + crc, затем после приема всего массива ждем следующей комманды + bl->state = BL_STATE_RECEIVE_CAN; + 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; + return 0x00; + + default: + return 0xFF; + } + } + } + +#ifdef TEST_CAN + TxHeader.StdId = 0x200; // ID OF MESSAGE + TxHeader.ExtId = 0; // STANDART FRAME (NOT EXTENTED) + TxHeader.RTR = CAN_RTR_DATA; // TRANSMIT DATA OR + TxHeader.IDE = CAN_ID_STD; // STANDART FRAME + TxHeader.DLC = 8; // DATA SIZE + TxHeader.TransmitGlobalTime = DISABLE; //THIS MODE IS NOT USED, SO DISABLE + uint8_t asd[8] = "ABCDEFGL"; + res_hal = HAL_CAN_AddTxMessage(&hcan_boot, &TxHeader, asd, &TxMailBox); // add to mail for transmit + HAL_Delay(1000); +#endif + + return 0x00; // если команды нет, ничего не делаем, остаёмся в BL_STATE_IDLE +} + + + + +// reset/set key function +void SetKey(void) +{ + HAL_FLASH_Unlock(); + + HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, BOOTLOADER_KEY_ADR, BL_KEY_APP_WRITTEN); + + HAL_FLASH_Lock(); +} + +uint32_t ReadKey(void) +{ + return (*(__IO uint32_t*)BOOTLOADER_KEY_ADR); +} + +void ResetKey(void) +{ + FLASH_EraseInitTypeDef EraseInitStruct; + HAL_FLASH_Unlock(); + uint32_t PageError = 0x00; + EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;// erase pages + EraseInitStruct.PageAddress = BOOTLOADER_KEY_ADR; //address + EraseInitStruct.NbPages = 0x01;// num of erased pages + + HAL_FLASHEx_Erase(&EraseInitStruct, &PageError); + HAL_FLASH_Lock(); + +} + + + +void JumpToApplocation(void) +{ + // jump to main app + //Задаётся адрес программы со смещением от начала вектора прерываний + uint32_t app_jump_adr; + app_jump_adr=*((volatile uint32_t*)(MAIN_APP_START_ADR+4)); + void(*GoToApp)(void); + + //Деинициализация HAL + HAL_DeInit(); + + GoToApp = (void (*) (void)) app_jump_adr; + //Перенос вектора прерываний на начало зашитой программы + __disable_irq(); + __set_MSP(*((volatile uint32_t*)MAIN_APP_START_ADR)); + __enable_irq(); + //Переход к выполнению зашитой программы + GoToApp(); +} + + + +void Boot_SystemClock_Config(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + + /* Включаем внутренний генератор HSI */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_OFF; // без PLL + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + + /* Настройка шин AHB/APB */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; // HSI = 8 MHz + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // HCLK = 8 MHz + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; // PCLK1 = 8 MHz + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; // PCLK2 = 8 MHz + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) + { + Error_Handler(); + } +} + +void Error_Handler(void) +{ + NVIC_SystemReset(); +} \ No newline at end of file diff --git a/Core/Bootloader/bootloader.h b/Core/Bootloader/bootloader.h new file mode 100644 index 0000000..cd712dd --- /dev/null +++ b/Core/Bootloader/bootloader.h @@ -0,0 +1,49 @@ +#ifndef __BOOTLOADER_H +#define __BOOTLOADER_H + +#include "boot_project_setup.h" +#include "string.h" + + +#define BL_KEY_APP_WRITTEN 0xAAAA5555 + +// ERROR DEFINES + +/** + * @brief Состояние бутлоадера + */ +typedef enum { + BL_STATE_INIT = 0, ///< Состояние: инициализация + BL_STATE_JUMP_TO_APP, ///< Состояние: запуск приложения + BL_STATE_IDLE, ///< Состояние: ожидание команд + BL_STATE_ERASE, ///< Состояние: стирание флеша + BL_STATE_RECEIVE_UART, ///< Состояние: прием прошивки по UART + BL_STATE_RECEIVE_CAN, ///< Состояние: прием прошивки по CAN + BL_STATE_WRITE, ///< Состояние: запись данных + BL_STATE_VERIFY, ///< Состояние: проверка прошивки + BL_STATE_ERROR ///< Состояние: ошибка +} BootloaderState_t; + + +typedef struct { + BootloaderState_t state; ///< текущее состояние бутлоадера + uint32_t addr; ///< текущий адрес прошивки + + uint8_t fw_size; ///< размер прошивки + uint8_t fw_buffer[PAGE_SIZE]; ///< буфер для приема прошивки (UART/CAN) + uint32_t fw_len; ///< длина принятого пакета + uint32_t fw_crc; ///< контрольная сумма прошивки + + UART_HandleTypeDef *huart; ///< хендлер UART + CAN_HandleTypeDef *hcan; ///< хендер CAN + CAN_TxHeaderTypeDef TxHeader; ///< Заголовок CAN сообщения для отправки + BootloaderState_t prev_state; ///< предыдущее состояние бутлоадера +} Bootloader_t; + + +void Bootloader_Task(Bootloader_t *bl); +uint8_t Receive_FW_Command(Bootloader_t *bl); + +void Error_Handler(void); + +#endif //__BOOTLOADER_H \ No newline at end of file diff --git a/Core/Src/main.c b/Core/Src/main.c index 60043d1..f5fa171 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -85,6 +85,10 @@ 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(); /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ @@ -100,7 +104,7 @@ int main(void) SystemClock_Config(); /* USER CODE BEGIN SysInit */ - MX_IWDG_Init(); + //MX_IWDG_Init(); /* USER CODE END SysInit */ /* Initialize all configured peripherals */ diff --git a/MDK-ARM/DebugConfig/bootloader_STM32F103RC_1.0.0.dbgconf b/MDK-ARM/DebugConfig/bootloader_STM32F103RC_1.0.0.dbgconf new file mode 100644 index 0000000..66e10b6 --- /dev/null +++ b/MDK-ARM/DebugConfig/bootloader_STM32F103RC_1.0.0.dbgconf @@ -0,0 +1,36 @@ +// File: STM32F101_102_103_105_107.dbgconf +// Version: 1.0.0 +// Note: refer to STM32F101xx STM32F102xx STM32F103xx STM32F105xx STM32F107xx Reference manual (RM0008) +// STM32F101xx STM32F102xx STM32F103xx STM32F105xx STM32F107xx datasheets + +// <<< Use Configuration Wizard in Context Menu >>> + +// Debug MCU configuration register (DBGMCU_CR) +// Reserved bits must be kept at reset value +// DBG_TIM11_STOP TIM11 counter stopped when core is halted +// DBG_TIM10_STOP TIM10 counter stopped when core is halted +// DBG_TIM9_STOP TIM9 counter stopped when core is halted +// DBG_TIM14_STOP TIM14 counter stopped when core is halted +// DBG_TIM13_STOP TIM13 counter stopped when core is halted +// DBG_TIM12_STOP TIM12 counter stopped when core is halted +// DBG_CAN2_STOP Debug CAN2 stopped when core is halted +// DBG_TIM7_STOP TIM7 counter stopped when core is halted +// DBG_TIM6_STOP TIM6 counter stopped when core is halted +// DBG_TIM5_STOP TIM5 counter stopped when core is halted +// DBG_TIM8_STOP TIM8 counter stopped when core is halted +// DBG_I2C2_SMBUS_TIMEOUT SMBUS timeout mode stopped when core is halted +// DBG_I2C1_SMBUS_TIMEOUT SMBUS timeout mode stopped when core is halted +// DBG_CAN1_STOP Debug CAN1 stopped when Core is halted +// DBG_TIM4_STOP TIM4 counter stopped when core is halted +// DBG_TIM3_STOP TIM3 counter stopped when core is halted +// DBG_TIM2_STOP TIM2 counter stopped when core is halted +// DBG_TIM1_STOP TIM1 counter stopped when core is halted +// DBG_WWDG_STOP Debug window watchdog stopped when core is halted +// DBG_IWDG_STOP Debug independent watchdog stopped when core is halted +// DBG_STANDBY Debug standby mode +// DBG_STOP Debug stop mode +// DBG_SLEEP Debug sleep mode +// +DbgMCU_CR = 0x00000007; + +// <<< end of configuration section >>> diff --git a/MDK-ARM/RTE/_bootloader/RTE_Components.h b/MDK-ARM/RTE/_bootloader/RTE_Components.h new file mode 100644 index 0000000..d1022d7 --- /dev/null +++ b/MDK-ARM/RTE/_bootloader/RTE_Components.h @@ -0,0 +1,21 @@ + +/* + * Auto generated Run-Time-Environment Configuration File + * *** Do not modify ! *** + * + * Project: 'uksvep_2_2_v1' + * Target: 'bootloader' + */ + +#ifndef RTE_COMPONENTS_H +#define RTE_COMPONENTS_H + + +/* + * Define the Device Header File: + */ +#define CMSIS_device_header "stm32f10x.h" + + + +#endif /* RTE_COMPONENTS_H */ diff --git a/MDK-ARM/bootloader.sct b/MDK-ARM/bootloader.sct new file mode 100644 index 0000000..7879f45 --- /dev/null +++ b/MDK-ARM/bootloader.sct @@ -0,0 +1,16 @@ +; ************************************************************* +; *** Scatter-Loading Description File generated by uVision *** +; ************************************************************* + +LR_IROM1 0x08000000 0x0000C000 { ; load region size_region + ER_IROM1 0x08000000 0x0000C000 { ; load address = execution address + *.o (RESET, +First) + *(InRoot$$Sections) + .ANY (+RO) + .ANY (+XO) + } + RW_IRAM1 0x20000000 0x0000C000 { ; RW data + .ANY (+RW +ZI) + } +} + diff --git a/MDK-ARM/uksvep_2_2_v1.uvoptx b/MDK-ARM/uksvep_2_2_v1.uvoptx index 6ff854c..c515ee6 100644 --- a/MDK-ARM/uksvep_2_2_v1.uvoptx +++ b/MDK-ARM/uksvep_2_2_v1.uvoptx @@ -176,6 +176,14 @@ uwTick,0x0A + + + 1 + 0 + 0x0800C000 + 0 + + 0 @@ -234,9 +242,244 @@ + + bootloader + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 18 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + Segger\JL2CM3.dll + + + + 0 + ARMRTXEVENTFLAGS + -L70 -Z18 -C0 -M0 -T1 + + + 0 + DLGTARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + + + + 0 + DLGUARM + + + + 0 + JL2CM3 + -U60145543 -O14 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight JTAG-DP") -D00(3BA00477) -L00(4) -N01("Unknown JTAG device") -D01(06414041) -L01(5) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32F103RC$Flash\STM32F10x_512.FLM) + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_512 -FS08000000 -FL080000 -FP0($$Device:STM32F103RC$Flash\STM32F10x_512.FLM)) + + + + + + 0 + 1 + boot + + + 1 + 1 + Inputs + + + 2 + 1 + duty_cycle,0x0A + + + 3 + 1 + frequency,0x0A + + + 4 + 1 + uwTick,0x0A + + + 5 + 1 + GoToApp + + + 6 + 1 + app_jump_adr + + + + + 1 + 0 + 0x08009800 + 0 + + + + 0 + + + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + + + System Viewer\CAN + 35904 + + + System Viewer\GPIOB + 35905 + + + + 1 + 0 + 0 + 2 + 10000000 + + + + Application/MDK-ARM - 0 + 1 0 0 0 @@ -303,8 +546,8 @@ 0 0 0 - ..\Core\Src\message.c - message.c + ../Core/Src/main.c + main.c 0 0 @@ -315,8 +558,8 @@ 0 0 0 - ../Core/Src/main.c - main.c + ..\Core\Src\message.c + message.c 0 0 @@ -638,6 +881,134 @@ + + Bootloader + 1 + 0 + 0 + 0 + + 5 + 32 + 5 + 0 + 0 + 0 + ..\Core\Bootloader\boot_project_setup.h + boot_project_setup.h + 0 + 0 + + + 5 + 33 + 1 + 0 + 0 + 0 + ..\Core\Bootloader\bootloader.c + bootloader.c + 0 + 0 + + + 5 + 34 + 5 + 0 + 0 + 0 + ..\Core\Bootloader\bootloader.h + bootloader.h + 0 + 0 + + + 5 + 35 + 1 + 0 + 0 + 0 + ..\Core\Bootloader\boot_can.c + boot_can.c + 0 + 0 + + + 5 + 36 + 5 + 0 + 0 + 0 + ..\Core\Bootloader\boot_can.h + boot_can.h + 0 + 0 + + + 5 + 37 + 1 + 0 + 0 + 0 + ..\Core\Bootloader\boot_flash.c + boot_flash.c + 0 + 0 + + + 5 + 38 + 5 + 0 + 0 + 0 + ..\Core\Bootloader\boot_flash.h + boot_flash.h + 0 + 0 + + + 5 + 39 + 1 + 0 + 0 + 0 + ..\Core\Bootloader\boot_uart.c + boot_uart.c + 0 + 0 + + + 5 + 40 + 5 + 0 + 0 + 0 + ..\Core\Bootloader\boot_uart.h + boot_uart.h + 0 + 0 + + + 5 + 41 + 1 + 0 + 0 + 0 + ..\Core\Bootloader\boot_main.c + boot_main.c + 0 + 0 + + + ::CMSIS 0 diff --git a/MDK-ARM/uksvep_2_2_v1.uvprojx b/MDK-ARM/uksvep_2_2_v1.uvprojx index 970b268..91b6564 100644 --- a/MDK-ARM/uksvep_2_2_v1.uvprojx +++ b/MDK-ARM/uksvep_2_2_v1.uvprojx @@ -81,9 +81,9 @@ 0 - 0 - 1 - + 1 + 0 + fromelf.exe --bin --output .\Listings\@L.bin !L 0 0 @@ -277,7 +277,7 @@ 1 - 0x8000000 + 0x800c000 0x40000 @@ -315,7 +315,7 @@ 1 - 1 + 2 0 0 1 @@ -330,7 +330,7 @@ 1 0 0 - 5 + 3 5 1 1 @@ -341,7 +341,7 @@ USE_HAL_DRIVER,STM32F103xE - ../Core/Inc;../Drivers/STM32F1xx_HAL_Driver/Inc;../Drivers/STM32F1xx_HAL_Driver/Inc/Legacy;../Drivers/CMSIS/Device/ST/STM32F1xx/Include;../Drivers/CMSIS/Include + ../Core/Inc;../Drivers/STM32F1xx_HAL_Driver/Inc;../Drivers/STM32F1xx_HAL_Driver/Inc/Legacy;../Drivers/CMSIS/Device/ST/STM32F1xx/Include;../Drivers/CMSIS/Include;..\Core\Bootloader @@ -410,16 +410,16 @@ 1 ..\Core\Src\lampa.c - - message.c - 1 - ..\Core\Src\message.c - main.c 1 ../Core/Src/main.c + + message.c + 1 + ..\Core\Src\message.c + gpio.c 1 @@ -659,6 +659,861 @@ + + Bootloader + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + + + + + + + + + + + + boot_project_setup.h + 5 + ..\Core\Bootloader\boot_project_setup.h + + + bootloader.c + 1 + ..\Core\Bootloader\bootloader.c + + + bootloader.h + 5 + ..\Core\Bootloader\bootloader.h + + + boot_can.c + 1 + ..\Core\Bootloader\boot_can.c + + + boot_can.h + 5 + ..\Core\Bootloader\boot_can.h + + + boot_flash.c + 1 + ..\Core\Bootloader\boot_flash.c + + + boot_flash.h + 5 + ..\Core\Bootloader\boot_flash.h + + + boot_uart.c + 1 + ..\Core\Bootloader\boot_uart.c + + + boot_uart.h + 5 + ..\Core\Bootloader\boot_uart.h + + + boot_main.c + 1 + ..\Core\Bootloader\boot_main.c + + + + + ::CMSIS + + + + + bootloader + 0x4 + ARM-ADS + 6190000::V6.19::ARMCLANG + 6190000::V6.19::ARMCLANG + 1 + + + STM32F103RC + STMicroelectronics + Keil.STM32F1xx_DFP.2.4.0 + http://www.keil.com/pack/ + IRAM(0x20000000-0x2000BFFF) IROM(0x8000000-0x803FFFF) CLOCK(8000000) CPUTYPE("Cortex-M3") TZ + + + + 0 + + + + + + + + + + + $$Device:STM32F103RC$SVD\STM32F103xx.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ + bootloader + 1 + 0 + 1 + 1 + 1 + + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + fromelf.exe --bin --output .\Listings\@L.bin !L + + 0 + 0 + 0 + 0 + + 1 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 0 + + + SARMCM3.DLL + -REMAP + DCM.DLL + -pCM3 + SARMCM3.DLL + + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4101 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M3" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 8 + 0 + 0 + 0 + 0 + 3 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0xc000 + + + 1 + 0x8000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0xc000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0xc000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 2 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 3 + 5 + 1 + 1 + 0 + 0 + 0 + + + USE_HAL_DRIVER,STM32F103xE + + ..\Core\Inc;../Drivers/STM32F1xx_HAL_Driver/Inc;../Drivers/STM32F1xx_HAL_Driver/Inc/Legacy;../Drivers/CMSIS/Device/ST/STM32F1xx/Include;../Drivers/CMSIS/Include;..\Core\Bootloader + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + + + + + + + + + 1 + 0 + 0 + 0 + 1 + 0 + + + + + + + + + + + + + + + Application/MDK-ARM + + + startup_stm32f103xe.s + 2 + startup_stm32f103xe.s + + + + + Application/User/Core + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + + + + + + + + + + + + crc16.c + 1 + ..\Core\Src\crc16.c + + + eeprom.c + 1 + ..\Core\Src\eeprom.c + + + lampa.c + 1 + ..\Core\Src\lampa.c + + + main.c + 1 + ../Core/Src/main.c + + + message.c + 1 + ..\Core\Src\message.c + + + gpio.c + 1 + ../Core/Src/gpio.c + + + can.c + 1 + ../Core/Src/can.c + + + iwdg.c + 1 + ../Core/Src/iwdg.c + + + tim.c + 1 + ../Core/Src/tim.c + + + usart.c + 1 + ../Core/Src/usart.c + + + stm32f1xx_it.c + 1 + ../Core/Src/stm32f1xx_it.c + + + stm32f1xx_hal_msp.c + 1 + ../Core/Src/stm32f1xx_hal_msp.c + + + stm32f1xx_hal_timebase_tim.c + 1 + ../Core/Src/stm32f1xx_hal_timebase_tim.c + + + + + Drivers/STM32F1xx_HAL_Driver + + + stm32f1xx_hal_gpio_ex.c + 1 + ../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c + + + stm32f1xx_hal_can.c + 1 + ../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_can.c + + + stm32f1xx_hal.c + 1 + ../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c + + + stm32f1xx_hal_rcc.c + 1 + ../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc.c + + + stm32f1xx_hal_rcc_ex.c + 1 + ../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc_ex.c + + + stm32f1xx_hal_gpio.c + 1 + ../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio.c + + + stm32f1xx_hal_dma.c + 1 + ../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_dma.c + + + stm32f1xx_hal_cortex.c + 1 + ../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_cortex.c + + + stm32f1xx_hal_pwr.c + 1 + ../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pwr.c + + + stm32f1xx_hal_flash.c + 1 + ../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash.c + + + stm32f1xx_hal_flash_ex.c + 1 + ../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash_ex.c + + + stm32f1xx_hal_exti.c + 1 + ../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_exti.c + + + stm32f1xx_hal_iwdg.c + 1 + ../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_iwdg.c + + + stm32f1xx_hal_tim.c + 1 + ../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim.c + + + stm32f1xx_hal_tim_ex.c + 1 + ../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim_ex.c + + + stm32f1xx_hal_uart.c + 1 + ../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_uart.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + + + Drivers/CMSIS + + + system_stm32f1xx.c + 1 + ../Core/Src/system_stm32f1xx.c + + + + + Bootloader + + + boot_project_setup.h + 5 + ..\Core\Bootloader\boot_project_setup.h + + + bootloader.c + 1 + ..\Core\Bootloader\bootloader.c + + + bootloader.h + 5 + ..\Core\Bootloader\bootloader.h + + + boot_can.c + 1 + ..\Core\Bootloader\boot_can.c + + + boot_can.h + 5 + ..\Core\Bootloader\boot_can.h + + + boot_flash.c + 1 + ..\Core\Bootloader\boot_flash.c + + + boot_flash.h + 5 + ..\Core\Bootloader\boot_flash.h + + + boot_uart.c + 1 + ..\Core\Bootloader\boot_uart.c + + + boot_uart.h + 5 + ..\Core\Bootloader\boot_uart.h + + + boot_main.c + 1 + ..\Core\Bootloader\boot_main.c + + + ::CMSIS @@ -672,6 +1527,7 @@ +