shuichan_old/STM32F103_BootLoader/Src/main.c

194 lines
5.5 KiB
C
Raw Normal View History

/**
* BootLoader <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* 1. <EFBFBD>ϵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>Ӳ<EFBFBD><EFBFBD>
* 2. <EFBFBD><EFBFBD><EFBFBD><EFBFBD> W25Q64 <EFBFBD>ⲿ Flash <EFBFBD>е<EFBFBD> OTA <EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD>
* 3. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD>״̬ѡ<EFBFBD><EFBFBD>:
* - DOWNLOADED: <EFBFBD>¹̼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>أ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ǰ APP1 <EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD>¹̼<EFBFBD>
* - INSTALLED: <EFBFBD>Ѱ<EFBFBD>װ<EFBFBD>¹̼<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD> APP ȷ<EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* - ROLLBACK: <EFBFBD>ѻ<EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD>ɹ̼<EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת
* - <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD>־: ֱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת APP1 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* 4. BootLoader <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> VTOR ƫ<EFBFBD><EFBFBD>(Ĭ<EFBFBD><EFBFBD>0x08000000)
*
* Flash <EFBFBD><EFBFBD><EFBFBD><EFBFBD> (STM32F103RCT6 256KB):
* 0x08000000 <EFBFBD><EFBFBD> BootLoader (32KB)
* 0x08008000 <EFBFBD><EFBFBD> APP1 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (224KB)
*
* W25Q64 <EFBFBD>ⲿ Flash <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* 0x000000 <EFBFBD><EFBFBD> <EFBFBD><EFBFBD> A: <EFBFBD>ɹ̼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (256KB)
* 0x040000 <EFBFBD><EFBFBD> <EFBFBD><EFBFBD> B: <EFBFBD>¹̼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (256KB)
* 0x080000 <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD> A (4KB)
* 0x081000 <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD> B (4KB)
*/
#include "main.h"
#include "ota_boot.h"
#include "../HardWare/W25Q64/w25q64.h"
#include "../HardWare/LOG/log.h"
/* <20><><EFBFBD>ھ<EFBFBD><DABE><EFBFBD> */
UART_HandleTypeDef huart1; /* USART1: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD> */
UART_HandleTypeDef huart3; /* USART3: OTA <20><><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8> */
DMA_HandleTypeDef hdma_usart3_rx; /* USART3 RX DMA */
IWDG_HandleTypeDef hiwdg; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ź<EFBFBD><C5B9><EFBFBD><EFBFBD><EFBFBD>ֹ<EFBFBD><D6B9>д/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̿<EFBFBD><CCBF><EFBFBD> */
/* OTA Э<><D0AD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD> */
uint8_t Rx_Flag = 0; /* <20>յ<EFBFBD>һ֡<D2BB><D6A1><EFBFBD>ݱ<EFBFBD>־ */
uint16_t Rx_Len = 0; /* <20><>ǰ֡<C7B0><D6A1><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD> */
uint8_t Rx_Buf[Rx_Max] = {0}; /* DMA <20><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD> */
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_DMA_Init(void);
static void MX_USART1_UART_Init(void);
static void MX_USART3_UART_Init(void);
static void MX_IWDG_Init(void);
/**
* @brief BootLoader <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* Ӳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DMA <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ӡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD> <EFBFBD>ȴ<EFBFBD>1<EFBFBD><EFBFBD>OTA<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ģʽ <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>תAPP1
*
* @note BootLoader <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> VTOR ƫ<EFBFBD><EFBFBD>(Ĭ<EFBFBD><EFBFBD>0x08000000)
*/
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_DMA_Init();
MX_USART1_UART_Init();
MX_USART3_UART_Init();
/* USART3: <20><><EFBFBD><EFBFBD> DMA + IDLE <20>жϽ<D0B6><CFBD><EFBFBD> OTA <20><><EFBFBD><EFBFBD>֡ */
HAL_UART_Receive_DMA(&huart3, Rx_Buf, Rx_Max);
__HAL_UART_ENABLE_IT(&huart3, UART_IT_IDLE);
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ź<EFBFBD><C5B9><EFBFBD><EFBFBD><EFBFBD>ת APP <20><><EFBFBD><EFBFBD> APP <20><><EFBFBD><EFBFBD>ι<EFBFBD><CEB9> */
MX_IWDG_Init();
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߼<EFBFBD> */
if (W25Q64_Init() != 0) {
log_error("[BL] W25Q64 <20><>ʼ<EFBFBD><CABC>ʧ<EFBFBD>ܣ<EFBFBD>");
}
Start_BootLoader();
}
/**
* @brief ϵͳʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: HSE(8MHz) <EFBFBD><EFBFBD> PLL<EFBFBD><EFBFBD>9 <EFBFBD><EFBFBD> 72MHz SYSCLK
*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) Error_Handler();
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) Error_Handler();
}
/**
* @brief USART1 <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, PA9(TX)/PA10(RX), 115200-8N1
*/
static void MX_USART1_UART_Init(void)
{
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK) Error_Handler();
}
/**
* @brief USART3 <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>: OTA <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD>, PB10(TX)/PB11(RX), 921600-8N1, DMA+IDLE
* @note <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> APP <EFBFBD><EFBFBD> 4G ģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(AT+IPR=921600)<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>
*/
static void MX_USART3_UART_Init(void)
{
huart3.Instance = USART3;
huart3.Init.BaudRate = 921600;
huart3.Init.WordLength = UART_WORDLENGTH_8B;
huart3.Init.StopBits = UART_STOPBITS_1;
huart3.Init.Parity = UART_PARITY_NONE;
huart3.Init.Mode = UART_MODE_TX_RX;
huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart3.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart3) != HAL_OK) Error_Handler();
}
/**
* @brief DMA <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>: USART3 RX ʹ<EFBFBD><EFBFBD> DMA1 ͨ<EFBFBD><EFBFBD>3
*/
static void MX_DMA_Init(void)
{
__HAL_RCC_DMA1_CLK_ENABLE();
HAL_NVIC_SetPriority(DMA1_Channel3_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel3_IRQn);
}
/**
* @brief GPIO <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>: GPIOA/USART1, GPIOB/USART3 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>, GPIOD/<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef g = {0};
__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_AFIO_CLK_ENABLE();
/* <20>ر<EFBFBD> JTAG<41><47><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SWD<57><44><EFBFBD>ͷ<EFBFBD> PA15/PB3/PB4 <20><> W25Q64 */
__HAL_AFIO_REMAP_SWJ_NOJTAG();
/* PC13(LED2)<29><><EFBFBD>ⲿ<EFBFBD><E2B2BF><EFBFBD>Ź<EFBFBD> TPL5010 <20><> DONE ι<><CEB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
g.Pin = GPIO_PIN_13;
g.Mode = GPIO_MODE_OUTPUT_PP;
g.Pull = GPIO_NOPULL;
g.Speed = GPIO_SPEED_FREQ_LOW; /* PC13 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD>ܵ<EFBFBD><DCB5><EFBFBD> */
HAL_GPIO_Init(GPIOC, &g);
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ź<EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>: LSI(~40kHz) / 256<EFBFBD><EFBFBD>Ƶ / <EFBFBD><EFBFBD><EFBFBD><EFBFBD>4095 <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ʱԼ26s
* @note LSI ʵ<EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD> 30~60kHz Ư<EFBFBD>ƣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>̳<EFBFBD>ʱԼ 17s<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>W25Q64 æ<EFBFBD>ȴ<EFBFBD> 5s<EFBFBD><EFBFBD>ԶС<EFBFBD>ڸ<EFBFBD>ֵ
*/
static void MX_IWDG_Init(void)
{
hiwdg.Instance = IWDG;
hiwdg.Init.Prescaler = IWDG_PRESCALER_256;
hiwdg.Init.Reload = 4095;
if (HAL_IWDG_Init(&hiwdg) != HAL_OK) Error_Handler();
}
void Error_Handler(void)
{
/* <20><>ʼ<EFBFBD><CABC>ʧ<EFBFBD>ܣ<EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFA3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
__disable_irq();
while (1)
{
}
}