/**
  ******************************************************************************
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * Copyright (C) 2021 Shanghai Eastsoft Microelectronics Co., Ltd. ALL rights reserved.
  *******************************************************************************
  */

<--------------------------------------------------------------------------------
Version history:
--------------------------------------------------------------------------------->
2023-04-26	V1.0.0	AE TEAM
2023-05-22	V2.0.1	AE TEAM Notes:支持上位机按键“引导程序至App”和“引导程序至Bootloader”，增加验证CRC有效性判断，有效则自动引导程序至app
<--------------------------------------------------------------------------------
Demo introduction:
--------------------------------------------------------------------------------->
本示例功能：UART_Boot，通过UART通信，BootLoader程序引导MCU完成查空、擦除、烧入、校验、及跳转功能。

<--------------------------------------------------------------------------------
测试环境:
--------------------------------------------------------------------------------->
测试板；
(ES32F0930芯片)

辅助软件：
UART-BOOT上位机软件

<--------------------------------------------------------------------------------
测试步骤：
--------------------------------------------------------------------------------->
1) 编译工程，编译通过后将程序下载到目标芯片；
2) 打开上位机软件，选择芯片型号；
3) 配置串口参数：通信口（查看适配的COM端口号），波特率（MCU自适应波特率，模式1），校验位（偶校验），停止位（1），超时（默认值10，可自行修改合适的超时时间）；
4) 点击“打开”按钮，选择待烧录文件；
5）复位芯片，然后进行单次操作或者自动烧录。

<--------------------------------------------------------------------------------
注意：
--------------------------------------------------------------------------------->
1) 测试环境需要共GND。
2) 此UART_Boot demo code预设放于Flash前12K(0x3000)位置，后面120K提供存放用户自行开发的程序。
3) 用户可自行决定应用程序要透过bootloader烧入于哪个位置，透过设定"APP_ADDR"参数即可修改，但必须以4K为单位之位置，因为使用software remap方式须以4K为单位，否则无法正确remap到指定位置。
4) 用户在开发自家的应用程序时，不用特别指定 ROM 地址，Start Address设为0即可，设定如下: 开启Keil -> Options for target -> Target -> IROM1 : Start Address设定为0，因为此demo code会自动将程序烧入于用户指定位置。
4) MCU固件将不断校验CRC_CAL_ADDR处指定长度的CRC32值，若相等则跳转到APP_ADDR处执行app程序
5）在使用跳转至appflash后若需要跳转至bootflash时，需要重新点击启动按键(即重新发送Start命令)，否则跳转bootflash失败，反过来跳转至appflash亦是如此。
6) 在使用UART_Boot工程时需注意编译后的大小，需满足代码空间需求即可。
7) APP程序的crc校验值和crc计算长度由UART_Boot分配，通过数据合并功能将app程序的hex文件以及crc校验信息合并为一个新的hex，上位机烧录时使用新生成的hex文件
8）校验信息存放地址(以UART_Boot_app_demo為例)：CRC_CAL_ADDR：0x0006000(bootloader: 0x3000 + app: 0x3000(根据app大小調整))  校验长度：0x3000(根据app大小设定)  

<--------------------------------------------------------------------------------
System clock:
--------------------------------------------------------------------------------->
HRC 16MHz.

<--------------------------------------------------------------------------------
Pin connection:
--------------------------------------------------------------------------------->
RX:       PC03
TX:       PC04
