Compare commits
4 Commits
develop
...
48b789c0c4
| Author | SHA1 | Date | |
|---|---|---|---|
| 48b789c0c4 | |||
| 48ed25015d | |||
| ffaf7a55a6 | |||
| 2761c37103 |
+2
-2
@@ -27,14 +27,14 @@
|
||||
> #define GATEWAY_SVR_ADDR2 103 // 服务器 IP[2]
|
||||
> #define GATEWAY_SVR_ADDR3 147 // 服务器 IP[3]
|
||||
> #define $18083 // 服务器端口
|
||||
> #define GATEWAY_LORA_FREQ CH0 // Lora 中心频率(CH0~CH45,470.1MHz~492.6MHz)
|
||||
> #define GATEWAY_LORA_FREQ CH0 // Lora 中心频率(CH0~CH119,433.1MHz~492.6MHz)
|
||||
> ```
|
||||
>
|
||||
> | 项 | 当前值 | 说明 |
|
||||
> | --- | --- | --- |
|
||||
> | 服务器 IP | 39.106.103.147 | CAT1 上传的默认服务器地址 |
|
||||
> | 服务器端口 | 8083 | CAT1 上传的默认端口 |
|
||||
> | GATEWAY_LORA_FREQ | CH0 | Lora 中心频率,按现场干扰/组网需要从 CH0~CH45 中选择 |
|
||||
> | GATEWAY_LORA_FREQ | CH6 | Lora 中心频率,按现场干扰/组网需要从 CH0~CH119 中选择 |
|
||||
>
|
||||
> ### ③ 默认通道配置(bsp.h:76-79)
|
||||
>
|
||||
|
||||
+158
-58
@@ -36,54 +36,129 @@ typedef enum {
|
||||
CH_CAT1,
|
||||
}Channel_m;
|
||||
|
||||
/*Lora频率:470100000ul + 500000*N,N=0~45,共46个信道(470.1MHz~492.6MHz),用于配置Lora频率更方便*/
|
||||
/*Lora频率:433100000ul + 500000*N,N=0~119,共120个信道(433.1MHz~492.6MHz),用于配置Lora频率更方便 [lora-wide宽频版]*/
|
||||
typedef enum {
|
||||
CH0 = (470100000ul + 0), //470.1MHz
|
||||
CH1 = (470100000ul + 500000),
|
||||
CH2 = (470100000ul + 1000000),
|
||||
CH3 = (470100000ul + 1500000),
|
||||
CH4 = (470100000ul + 2000000),
|
||||
CH5 = (470100000ul + 2500000),
|
||||
CH6 = (470100000ul + 3000000),
|
||||
CH7 = (470100000ul + 3500000),
|
||||
CH8 = (470100000ul + 4000000),
|
||||
CH9 = (470100000ul + 4500000),
|
||||
CH10 = (470100000ul + 5000000),
|
||||
CH11 = (470100000ul + 5500000),
|
||||
CH12 = (470100000ul + 6000000),
|
||||
CH13 = (470100000ul + 6500000),
|
||||
CH14 = (470100000ul + 7000000),
|
||||
CH15 = (470100000ul + 7500000),
|
||||
CH16 = (470100000ul + 8000000),
|
||||
CH17 = (470100000ul + 8500000),
|
||||
CH18 = (470100000ul + 9000000),
|
||||
CH19 = (470100000ul + 9500000),
|
||||
CH20 = (470100000ul + 10000000),
|
||||
CH21 = (470100000ul + 10500000),
|
||||
CH22 = (470100000ul + 11000000),
|
||||
CH23 = (470100000ul + 11500000),
|
||||
CH24 = (470100000ul + 12000000),
|
||||
CH25 = (470100000ul + 12500000),
|
||||
CH26 = (470100000ul + 13000000),
|
||||
CH27 = (470100000ul + 13500000),
|
||||
CH28 = (470100000ul + 14000000),
|
||||
CH29 = (470100000ul + 14500000),
|
||||
CH30 = (470100000ul + 15000000),
|
||||
CH31 = (470100000ul + 15500000),
|
||||
CH32 = (470100000ul + 16000000),
|
||||
CH33 = (470100000ul + 16500000),
|
||||
CH34 = (470100000ul + 17000000),
|
||||
CH35 = (470100000ul + 17500000),
|
||||
CH36 = (470100000ul + 18000000),
|
||||
CH37 = (470100000ul + 18500000),
|
||||
CH38 = (470100000ul + 19000000),
|
||||
CH39 = (470100000ul + 19500000),
|
||||
CH40 = (470100000ul + 20000000),
|
||||
CH41 = (470100000ul + 20500000),
|
||||
CH42 = (470100000ul + 21000000),
|
||||
CH43 = (470100000ul + 21500000),
|
||||
CH44 = (470100000ul + 22000000),
|
||||
CH45 = (470100000ul + 22500000), //492.6MHz
|
||||
CH0 = (433100000ul + 0), //433.1MHz
|
||||
CH1 = (433100000ul + 500000),
|
||||
CH2 = (433100000ul + 1000000),
|
||||
CH3 = (433100000ul + 1500000),
|
||||
CH4 = (433100000ul + 2000000),
|
||||
CH5 = (433100000ul + 2500000),
|
||||
CH6 = (433100000ul + 3000000),
|
||||
CH7 = (433100000ul + 3500000),
|
||||
CH8 = (433100000ul + 4000000),
|
||||
CH9 = (433100000ul + 4500000),
|
||||
CH10 = (433100000ul + 5000000),
|
||||
CH11 = (433100000ul + 5500000),
|
||||
CH12 = (433100000ul + 6000000),
|
||||
CH13 = (433100000ul + 6500000),
|
||||
CH14 = (433100000ul + 7000000),
|
||||
CH15 = (433100000ul + 7500000),
|
||||
CH16 = (433100000ul + 8000000),
|
||||
CH17 = (433100000ul + 8500000),
|
||||
CH18 = (433100000ul + 9000000),
|
||||
CH19 = (433100000ul + 9500000),
|
||||
CH20 = (433100000ul + 10000000),
|
||||
CH21 = (433100000ul + 10500000),
|
||||
CH22 = (433100000ul + 11000000),
|
||||
CH23 = (433100000ul + 11500000),
|
||||
CH24 = (433100000ul + 12000000),
|
||||
CH25 = (433100000ul + 12500000),
|
||||
CH26 = (433100000ul + 13000000),
|
||||
CH27 = (433100000ul + 13500000),
|
||||
CH28 = (433100000ul + 14000000),
|
||||
CH29 = (433100000ul + 14500000),
|
||||
CH30 = (433100000ul + 15000000),
|
||||
CH31 = (433100000ul + 15500000),
|
||||
CH32 = (433100000ul + 16000000),
|
||||
CH33 = (433100000ul + 16500000),
|
||||
CH34 = (433100000ul + 17000000),
|
||||
CH35 = (433100000ul + 17500000),
|
||||
CH36 = (433100000ul + 18000000),
|
||||
CH37 = (433100000ul + 18500000),
|
||||
CH38 = (433100000ul + 19000000),
|
||||
CH39 = (433100000ul + 19500000),
|
||||
CH40 = (433100000ul + 20000000),
|
||||
CH41 = (433100000ul + 20500000),
|
||||
CH42 = (433100000ul + 21000000),
|
||||
CH43 = (433100000ul + 21500000),
|
||||
CH44 = (433100000ul + 22000000),
|
||||
CH45 = (433100000ul + 22500000),
|
||||
CH46 = (433100000ul + 23000000),
|
||||
CH47 = (433100000ul + 23500000),
|
||||
CH48 = (433100000ul + 24000000),
|
||||
CH49 = (433100000ul + 24500000),
|
||||
CH50 = (433100000ul + 25000000),
|
||||
CH51 = (433100000ul + 25500000),
|
||||
CH52 = (433100000ul + 26000000),
|
||||
CH53 = (433100000ul + 26500000),
|
||||
CH54 = (433100000ul + 27000000),
|
||||
CH55 = (433100000ul + 27500000),
|
||||
CH56 = (433100000ul + 28000000),
|
||||
CH57 = (433100000ul + 28500000),
|
||||
CH58 = (433100000ul + 29000000),
|
||||
CH59 = (433100000ul + 29500000),
|
||||
CH60 = (433100000ul + 30000000),
|
||||
CH61 = (433100000ul + 30500000),
|
||||
CH62 = (433100000ul + 31000000),
|
||||
CH63 = (433100000ul + 31500000),
|
||||
CH64 = (433100000ul + 32000000),
|
||||
CH65 = (433100000ul + 32500000),
|
||||
CH66 = (433100000ul + 33000000),
|
||||
CH67 = (433100000ul + 33500000),
|
||||
CH68 = (433100000ul + 34000000),
|
||||
CH69 = (433100000ul + 34500000),
|
||||
CH70 = (433100000ul + 35000000),
|
||||
CH71 = (433100000ul + 35500000),
|
||||
CH72 = (433100000ul + 36000000),
|
||||
CH73 = (433100000ul + 36500000),
|
||||
CH74 = (433100000ul + 37000000),
|
||||
CH75 = (433100000ul + 37500000),
|
||||
CH76 = (433100000ul + 38000000),
|
||||
CH77 = (433100000ul + 38500000),
|
||||
CH78 = (433100000ul + 39000000),
|
||||
CH79 = (433100000ul + 39500000),
|
||||
CH80 = (433100000ul + 40000000),
|
||||
CH81 = (433100000ul + 40500000),
|
||||
CH82 = (433100000ul + 41000000),
|
||||
CH83 = (433100000ul + 41500000),
|
||||
CH84 = (433100000ul + 42000000),
|
||||
CH85 = (433100000ul + 42500000),
|
||||
CH86 = (433100000ul + 43000000),
|
||||
CH87 = (433100000ul + 43500000),
|
||||
CH88 = (433100000ul + 44000000),
|
||||
CH89 = (433100000ul + 44500000),
|
||||
CH90 = (433100000ul + 45000000),
|
||||
CH91 = (433100000ul + 45500000),
|
||||
CH92 = (433100000ul + 46000000),
|
||||
CH93 = (433100000ul + 46500000),
|
||||
CH94 = (433100000ul + 47000000),
|
||||
CH95 = (433100000ul + 47500000),
|
||||
CH96 = (433100000ul + 48000000),
|
||||
CH97 = (433100000ul + 48500000),
|
||||
CH98 = (433100000ul + 49000000),
|
||||
CH99 = (433100000ul + 49500000),
|
||||
CH100 = (433100000ul + 50000000),
|
||||
CH101 = (433100000ul + 50500000),
|
||||
CH102 = (433100000ul + 51000000),
|
||||
CH103 = (433100000ul + 51500000),
|
||||
CH104 = (433100000ul + 52000000),
|
||||
CH105 = (433100000ul + 52500000),
|
||||
CH106 = (433100000ul + 53000000),
|
||||
CH107 = (433100000ul + 53500000),
|
||||
CH108 = (433100000ul + 54000000),
|
||||
CH109 = (433100000ul + 54500000),
|
||||
CH110 = (433100000ul + 55000000),
|
||||
CH111 = (433100000ul + 55500000),
|
||||
CH112 = (433100000ul + 56000000),
|
||||
CH113 = (433100000ul + 56500000),
|
||||
CH114 = (433100000ul + 57000000),
|
||||
CH115 = (433100000ul + 57500000),
|
||||
CH116 = (433100000ul + 58000000),
|
||||
CH117 = (433100000ul + 58500000),
|
||||
CH118 = (433100000ul + 59000000),
|
||||
CH119 = (433100000ul + 59500000), //492.6MHz
|
||||
|
||||
}LORA_FREQ_M;
|
||||
/*通讯单元通道掩码 - 与GateWay APP一致*/
|
||||
#define CUCH_CH1 (1 << CH_RS485_1)
|
||||
@@ -97,16 +172,16 @@ typedef enum {
|
||||
/*当前设备版本/项目选择*/
|
||||
#define GATEWAY_VER_INFO GATEWAY_VER1_0 //版本信息
|
||||
#define GATEWAY_PRJ_NUM GATEWAY_PRJ_YAXIA //项目编号
|
||||
#define GATEWAY_GW_NUM 0x0003 //网关编号(2字节, 1~65535)
|
||||
#define GATEWAY_GW_NUM 0x0000 //网关编号(2字节, 1~65535)
|
||||
|
||||
/*CAT1服务器/Lora配置 - 替代原MAC_ADDR_TYPE编译宏, 在Boot中直接配置*/
|
||||
#define GATEWAY_SVR_ADDR0 39 //服务器IP[0]
|
||||
#define GATEWAY_SVR_ADDR1 106 //服务器IP[1]
|
||||
#define GATEWAY_SVR_ADDR2 103 //服务器IP[2]
|
||||
#define GATEWAY_SVR_ADDR3 147 //服务器IP[3]
|
||||
#define GATEWAY_SVR_PORT 8083 //服务器端口
|
||||
#define GATEWAY_SVR_PORT 8080 //服务器端口
|
||||
|
||||
#define GATEWAY_LORA_FREQ CH0 //Lora中心频率(可配置为CH0~CH45)
|
||||
#define GATEWAY_LORA_FREQ CH0 //Lora中心频率(可配置为CH0~CH119)
|
||||
|
||||
/*默认通道配置 - 在Boot中直接配置, 替代原APP硬编码默认值*/
|
||||
#define GATEWAY_MUCH CH_ETH //主上传通道
|
||||
@@ -116,7 +191,7 @@ typedef enum {
|
||||
/*********************************下载前必须检查配置项************************************/
|
||||
/*****************************************************************************************/
|
||||
|
||||
/*Flash分区 - 32KB Boot + APP(0x8000起) + 参数区(0x7C000)*/
|
||||
/*Flash分区 - 32KB Boot + APP_A区(0x8000,232KB,运行) + APP_B区(0x42000,232KB,升级暂存) + 参数区(0x7C000)*/
|
||||
#define FLASH_SECTOR_SIZE 0x2000ul //8KB
|
||||
#define FLASH_BASE ((uint32_t)0x00000000)
|
||||
#define FLASH_SIZE (64u * FLASH_SECTOR_SIZE) //512KB
|
||||
@@ -124,11 +199,34 @@ typedef enum {
|
||||
#define SRAM_BASE ((uint32_t)0x1FFF8000)
|
||||
#define SRAM_SIZE 0x2F000ul //192KB
|
||||
|
||||
#define BOOT_SIZE (4 * FLASH_SECTOR_SIZE) //32KB
|
||||
#define APP_ADDRESS (FLASH_BASE + BOOT_SIZE) //0x8000
|
||||
#define APP_SIZE (58 * FLASH_SECTOR_SIZE) //464KB
|
||||
#define BOOT_PARA_ADDRESS (APP_ADDRESS + APP_SIZE) //0x7C000
|
||||
#define BOOT_PARA_SIZE (FLASH_SECTOR_SIZE)
|
||||
#define BOOT_SIZE (4 * FLASH_SECTOR_SIZE) //32KB
|
||||
#define APP_A_ADDRESS (FLASH_BASE + BOOT_SIZE) //0x8000 A区: 当前运行App
|
||||
#define APP_BANK_SECTORS (29u) //A/B区各29扇区(232KB)
|
||||
#define APP_BANK_SIZE (APP_BANK_SECTORS * FLASH_SECTOR_SIZE) //232KB
|
||||
#define APP_B_ADDRESS (APP_A_ADDRESS + APP_BANK_SIZE) //0x42000 B区: 升级暂存
|
||||
#define APP_ADDRESS APP_A_ADDRESS //兼容旧名, 指向A区
|
||||
#define BOOT_PARA_ADDRESS (APP_B_ADDRESS + APP_BANK_SIZE) //0x7C000
|
||||
#define BOOT_PARA_SIZE (FLASH_SECTOR_SIZE)
|
||||
|
||||
/*外部SPI Flash(与App共用SPI1: PC0-NSS/PC1-MISO/PC2-SCK/PC3-MOSI, Mode3) - Cat1远程升级固件暂存区*/
|
||||
#define EXTFLASH_NSS_PORT (PortC)
|
||||
#define EXTFLASH_NSS_PIN (Pin00)
|
||||
#define EXTFLASH_NSS_SET() PORT_SetBits(EXTFLASH_NSS_PORT, EXTFLASH_NSS_PIN)
|
||||
#define EXTFLASH_NSS_CLR() PORT_ResetBits(EXTFLASH_NSS_PORT, EXTFLASH_NSS_PIN)
|
||||
#define EXTFLASH_SCK_PORT (PortC)
|
||||
#define EXTFLASH_SCK_PIN (Pin02)
|
||||
#define EXTFLASH_SCK_FUNC (Func_Spi1_Sck)
|
||||
#define EXTFLASH_MOSI_PORT (PortC)
|
||||
#define EXTFLASH_MOSI_PIN (Pin03)
|
||||
#define EXTFLASH_MOSI_FUNC (Func_Spi1_Mosi)
|
||||
#define EXTFLASH_MISO_PORT (PortC)
|
||||
#define EXTFLASH_MISO_PIN (Pin01)
|
||||
#define EXTFLASH_MISO_FUNC (Func_Spi1_Miso)
|
||||
#define EXTFLASH_UNIT (M4_SPI1)
|
||||
#define EXTFLASH_UNIT_CLOCK (PWC_FCG1_PERIPH_SPI1)
|
||||
#define EXTFLASH_CMD_READ 0x03
|
||||
#define SPIFLASH_SECTORSIZE 4096ul
|
||||
#define FLASH_FW_STASH_SECTOR 4038 //暂存区起始扇区(与App spiflash.h一致)
|
||||
|
||||
#define DEBUG 1
|
||||
#define USE_SD_CARD 0
|
||||
@@ -228,10 +326,12 @@ void FeedDog(void);
|
||||
void Error_Handler(void);
|
||||
|
||||
/*Flash操作*/
|
||||
void FlashWrite(uint32_t Addr, uint32_t *wData, uint8_t wLen);
|
||||
void FlashWrite(uint32_t Addr, uint32_t *wData, int wLen);
|
||||
void ExtFlashInit(void);
|
||||
void ExtFlashRead(uint32_t Addr, uint8_t *rData, uint16_t rLen);
|
||||
void ReadBootPara(BootPara rData);
|
||||
void WriteBootPara(BootPara wData);
|
||||
void EraseFlash(void);
|
||||
void EraseFlash(uint32_t BaseAddr, uint32_t SectorCnt);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
#define APP_START_FLAG 0x55AA5A5A
|
||||
#define APP_UPDATE_FLAG 0xA5A5AA55
|
||||
#define APP_BOOT_UPGRADE_FLAG 0x5A5A55A5 //升级完成标记:Boot升级成功后置位,App启动时据此擦除外部参数分区并恢复APP_START_FLAG(与App侧bsp.h定义保持一致)
|
||||
#define APP_UPDATE_SPI_FLAG 0xA5A55A5A //Cat1远程升级: 固件已存外部SPI Flash暂存区, Boot据此搬运(与App侧bsp.h定义保持一致)
|
||||
|
||||
typedef enum {
|
||||
UPDATE_CMD_NULL,
|
||||
@@ -52,6 +53,8 @@ typedef enum {
|
||||
BL_WAIT_REV,
|
||||
BL_GET_DATA_TIMEOUT,
|
||||
BL_START_APP,
|
||||
BL_COPY_TO_A, //B区镜像搬运到A区阶段
|
||||
BL_STASH_TO_B, //外部SPI Flash暂存区搬运到B区阶段(Cat1远程升级)
|
||||
BL_RESET
|
||||
}BootStatus_m;
|
||||
|
||||
@@ -62,6 +65,7 @@ typedef struct {
|
||||
uint32_t AppPackageCnt;
|
||||
uint32_t AppPackageIdx;
|
||||
uint32_t RevErrCnt;
|
||||
uint32_t CopyRetryCnt; //搬运重试计数
|
||||
|
||||
uint32_t FeedDogDlyCnt;
|
||||
uint32_t BootLoader1mSDlyCnt;
|
||||
|
||||
+94
-6
@@ -393,6 +393,7 @@ void BSP_Init(void)
|
||||
SystemClockConfig();
|
||||
GPIO_Config();
|
||||
RS485Ch1_Config(500000);
|
||||
ExtFlashInit(); /*外部SPI Flash: Cat1远程升级暂存区读取用*/
|
||||
|
||||
FeedDog();
|
||||
SysTick_Init(1000);
|
||||
@@ -402,7 +403,7 @@ void BSP_Init(void)
|
||||
/*****************************************************************************************
|
||||
* Flash操作
|
||||
****************************************************************************************/
|
||||
void FlashWrite(uint32_t Addr, uint32_t *wData, uint8_t wLen)
|
||||
void FlashWrite(uint32_t Addr, uint32_t *wData, int wLen)
|
||||
{
|
||||
EFM_Unlock();
|
||||
EFM_FlashCmd(Enable);
|
||||
@@ -415,13 +416,100 @@ void FlashWrite(uint32_t Addr, uint32_t *wData, uint8_t wLen)
|
||||
EFM_Lock();
|
||||
}
|
||||
|
||||
static void FlashRead(uint32_t u32Addr, uint32_t *rData, uint8_t rLen)
|
||||
static void FlashRead(uint32_t u32Addr, uint32_t *rData, int rLen)
|
||||
{
|
||||
for(int i = 0; i < rLen / 4; i++) {
|
||||
rData[i] = *((volatile uint32_t*)(u32Addr + i * 4));
|
||||
}
|
||||
}
|
||||
|
||||
/*外部SPI Flash驱动: 供Cat1远程升级时读取暂存区固件(App负责写入暂存区)*/
|
||||
static uint16_t ExtSpiSendReceive(uint16_t sData)
|
||||
{
|
||||
uint16_t retry = 0;
|
||||
uint16_t rData;
|
||||
|
||||
while(Reset == SPI_GetFlag(EXTFLASH_UNIT, SpiFlagSendBufferEmpty)) {
|
||||
retry++;
|
||||
if(retry > 0x4000) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
SPI_SendData8(EXTFLASH_UNIT, sData);
|
||||
retry = 0;
|
||||
while(Reset == SPI_GetFlag(EXTFLASH_UNIT, SpiFlagReceiveBufferFull)) {
|
||||
retry++;
|
||||
if(retry > 0x4000) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
rData = SPI_ReceiveData8(EXTFLASH_UNIT);
|
||||
return rData;
|
||||
}
|
||||
|
||||
void ExtFlashInit(void)
|
||||
{
|
||||
stc_spi_init_t stcSpiInit;
|
||||
stc_port_init_t stcPortInit;
|
||||
|
||||
MEM_ZERO_STRUCT(stcPortInit);
|
||||
stcPortInit.enPinOType = Pin_OType_Cmos;
|
||||
PORT_Init(EXTFLASH_SCK_PORT, EXTFLASH_SCK_PIN, &stcPortInit);
|
||||
PORT_Init(EXTFLASH_MOSI_PORT, EXTFLASH_MOSI_PIN, &stcPortInit);
|
||||
PORT_Init(EXTFLASH_MISO_PORT, EXTFLASH_MISO_PIN, &stcPortInit);
|
||||
stcPortInit.enPinMode = Pin_Mode_Out;
|
||||
stcPortInit.enPinOType = Pin_OType_Cmos;
|
||||
stcPortInit.enPinDrv = Pin_Drv_H;
|
||||
stcPortInit.enPullUp = Disable;
|
||||
PORT_Init(EXTFLASH_NSS_PORT, EXTFLASH_NSS_PIN, &stcPortInit);
|
||||
EXTFLASH_NSS_SET();
|
||||
|
||||
MEM_ZERO_STRUCT(stcSpiInit);
|
||||
PWC_Fcg1PeriphClockCmd(EXTFLASH_UNIT_CLOCK, Enable);
|
||||
PORT_SetFunc(EXTFLASH_SCK_PORT, EXTFLASH_SCK_PIN, EXTFLASH_SCK_FUNC, Disable);
|
||||
PORT_SetFunc(EXTFLASH_MOSI_PORT, EXTFLASH_MOSI_PIN, EXTFLASH_MOSI_FUNC, Disable);
|
||||
PORT_SetFunc(EXTFLASH_MISO_PORT, EXTFLASH_MISO_PIN, EXTFLASH_MISO_FUNC, Disable);
|
||||
|
||||
stcSpiInit.enClkDiv = SpiClkDiv16;
|
||||
stcSpiInit.enFrameNumber = SpiFrameNumber1;
|
||||
stcSpiInit.enDataLength = SpiDataLengthBit8;
|
||||
stcSpiInit.enFirstBitPosition = SpiFirstBitPositionMSB;
|
||||
stcSpiInit.enSckPolarity = SpiSckIdleLevelHigh;
|
||||
stcSpiInit.enSckPhase = SpiSckOddChangeEvenSample;
|
||||
stcSpiInit.enReadBufferObject = SpiReadReceiverBuffer;
|
||||
stcSpiInit.enWorkMode = SpiWorkMode4Line;
|
||||
stcSpiInit.enTransMode = SpiTransFullDuplex;
|
||||
stcSpiInit.enCommAutoSuspendEn = Disable;
|
||||
stcSpiInit.enModeFaultErrorDetectEn = Disable;
|
||||
stcSpiInit.enParitySelfDetectEn = Disable;
|
||||
stcSpiInit.enParityEn = Disable;
|
||||
stcSpiInit.enParity = SpiParityEven;
|
||||
stcSpiInit.enMasterSlaveMode = SpiModeMaster;
|
||||
stcSpiInit.stcDelayConfig.enSsSetupDelayOption = SpiSsSetupDelayCustomValue;
|
||||
stcSpiInit.stcDelayConfig.enSsSetupDelayTime = SpiSsSetupDelaySck1;
|
||||
stcSpiInit.stcDelayConfig.enSsHoldDelayOption = SpiSsHoldDelayCustomValue;
|
||||
stcSpiInit.stcDelayConfig.enSsHoldDelayTime = SpiSsHoldDelaySck1;
|
||||
stcSpiInit.stcDelayConfig.enSsIntervalTimeOption = SpiSsIntervalCustomValue;
|
||||
stcSpiInit.stcDelayConfig.enSsIntervalTime = SpiSsIntervalSck6PlusPck2;
|
||||
stcSpiInit.stcSsConfig.enSsValidBit = SpiSsValidChannel0;
|
||||
stcSpiInit.stcSsConfig.enSs0Polarity = SpiSsLowValid;
|
||||
SPI_Init(EXTFLASH_UNIT, &stcSpiInit);
|
||||
SPI_Cmd(EXTFLASH_UNIT, Enable);
|
||||
}
|
||||
|
||||
void ExtFlashRead(uint32_t Addr, uint8_t *rData, uint16_t rLen)
|
||||
{
|
||||
EXTFLASH_NSS_CLR();
|
||||
ExtSpiSendReceive(0x03);
|
||||
ExtSpiSendReceive((Addr >> 16) & 0xFF);
|
||||
ExtSpiSendReceive((Addr >> 8) & 0xFF);
|
||||
ExtSpiSendReceive(Addr & 0xFF);
|
||||
for(uint16_t i = 0; i < rLen; i++) {
|
||||
rData[i] = ExtSpiSendReceive(0xFF);
|
||||
}
|
||||
EXTFLASH_NSS_SET();
|
||||
}
|
||||
|
||||
void ReadBootPara(BootPara rData)
|
||||
{
|
||||
FlashRead(BOOT_PARA_ADDRESS, (uint32_t *)rData, sizeof(BootPara_t));
|
||||
@@ -449,15 +537,15 @@ void WriteBootPara(BootPara wData)
|
||||
EFM_Lock();
|
||||
}
|
||||
|
||||
void EraseFlash(void)
|
||||
void EraseFlash(uint32_t BaseAddr, uint32_t SectorCnt)
|
||||
{
|
||||
EFM_Unlock();
|
||||
EFM_FlashCmd(Enable);
|
||||
while(Set != EFM_GetFlagStatus(EFM_FLAG_RDY)) { ; }
|
||||
|
||||
/* 只擦APP区, 不擦参数区(BOOT_PARA_ADDRESS) */
|
||||
for(int Addr = APP_ADDRESS; Addr < BOOT_PARA_ADDRESS; Addr += FLASH_SECTOR_SIZE) {
|
||||
EFM_SectorErase(Addr);
|
||||
/*从BaseAddr起连续擦除SectorCnt个扇区(A/B区通用), 不碰参数区*/
|
||||
for(uint32_t i = 0; i < SectorCnt; i++) {
|
||||
EFM_SectorErase(BaseAddr + i * FLASH_SECTOR_SIZE);
|
||||
FeedDog();
|
||||
}
|
||||
EFM_Lock();
|
||||
|
||||
+183
-22
@@ -40,14 +40,14 @@ void InitCrc32Table(uint32_t* Crc32Tbl)
|
||||
|
||||
/*****************************************************************************************
|
||||
* 函数名称: GetCrc32
|
||||
* 功能描述: 计算APP区CRC32校验值
|
||||
* 功能描述: 计算指定区域CRC32校验值
|
||||
*****************************************************************************************/
|
||||
uint32_t GetCrc32(int dwLen)
|
||||
uint32_t GetCrc32(uint32_t BaseAddr, int dwLen)
|
||||
{
|
||||
uint32_t Data;
|
||||
uint32_t dwCrc32Data = 0xFFFFFFFF;
|
||||
for(int dwCnt = 0; dwCnt < dwLen; dwCnt++) {
|
||||
Data = *((volatile uint8_t*)(APP_ADDRESS + dwCnt));
|
||||
Data = *((volatile uint8_t*)(BaseAddr + dwCnt));
|
||||
uint32_t dwTbl = (dwCrc32Data ^ Data) & 0xFF;
|
||||
dwCrc32Data = ((dwCrc32Data >> 8) & 0xFFFFFF) ^ pdwCrc32Tbl[dwTbl];
|
||||
}
|
||||
@@ -110,11 +110,92 @@ static bool JumpToApp(uint32_t AppAddr)
|
||||
|
||||
/*****************************************************************************************
|
||||
* 函数名称: AppWriteFlash
|
||||
* 功能描述: 写APP数据到Flash (每包200字节)
|
||||
* 功能描述: 写升级数据到Flash指定分区 (每包200字节, 尾部不足4字节按0xFF补齐)
|
||||
* 参 数: BaseAddr 分区基址(B区), AddrOffset 分区内偏移, wData 数据, wLen 字节数
|
||||
* 返 回 值: 无
|
||||
*****************************************************************************************/
|
||||
void AppWriteFlash(uint32_t AddrOffset, uint8_t *wData, int wLen)
|
||||
void AppWriteFlash(uint32_t BaseAddr, uint32_t AddrOffset, uint8_t *wData, int wLen)
|
||||
{
|
||||
FlashWrite(APP_ADDRESS + AddrOffset, (uint32_t *)wData, wLen / 4);
|
||||
int FullWords = wLen / 4;
|
||||
int Remain = wLen % 4;
|
||||
uint32_t Word;
|
||||
|
||||
FlashWrite(BaseAddr + AddrOffset, (uint32_t *)wData, FullWords);
|
||||
if(Remain > 0) { /*末包尾字节补0xFF组字写入, 保证与AppSize逐字节CRC一致*/
|
||||
Word = 0xFFFFFFFF;
|
||||
memcpy(&Word, &wData[FullWords * 4], Remain);
|
||||
FlashWrite(BaseAddr + AddrOffset + FullWords * 4, &Word, 1);
|
||||
}
|
||||
}
|
||||
|
||||
static uint32_t s_CopyBuf[FLASH_SECTOR_SIZE / 4]; /*搬运缓冲(8KB)*/
|
||||
|
||||
/*****************************************************************************************
|
||||
* 函数名称: CopyAppBtoA
|
||||
* 功能描述: 将B区已校验固件搬运到A区(逐扇区: 擦A→读B→写A), 完成后整包校验A区
|
||||
* 参 数: 无
|
||||
* 返 回 值: true=搬运并校验通过
|
||||
*****************************************************************************************/
|
||||
static bool CopyAppBtoA(void)
|
||||
{
|
||||
uint32_t TotalWords = (BL.Para.AppSize + 3) / 4; /*实际固件字数*/
|
||||
uint32_t SecPerBank = FLASH_SECTOR_SIZE / 4;
|
||||
uint32_t FullSectors = TotalWords / SecPerBank;
|
||||
uint32_t RemainWords = TotalWords % SecPerBank;
|
||||
uint32_t Sec, Base;
|
||||
|
||||
for(Sec = 0; Sec < FullSectors; Sec++) {
|
||||
Base = APP_A_ADDRESS + Sec * FLASH_SECTOR_SIZE;
|
||||
EraseFlash(Base, 1);
|
||||
for(uint32_t i = 0; i < SecPerBank; i++) {
|
||||
s_CopyBuf[i] = *((volatile uint32_t *)(APP_B_ADDRESS + Sec * FLASH_SECTOR_SIZE + i * 4));
|
||||
}
|
||||
FlashWrite(Base, s_CopyBuf, SecPerBank);
|
||||
}
|
||||
if(RemainWords > 0) {
|
||||
Base = APP_A_ADDRESS + FullSectors * FLASH_SECTOR_SIZE;
|
||||
EraseFlash(Base, 1);
|
||||
for(uint32_t i = 0; i < RemainWords; i++) {
|
||||
s_CopyBuf[i] = *((volatile uint32_t *)(APP_B_ADDRESS + FullSectors * FLASH_SECTOR_SIZE + i * 4));
|
||||
}
|
||||
FlashWrite(Base, s_CopyBuf, RemainWords);
|
||||
}
|
||||
/*整包校验A区*/
|
||||
return (GetCrc32(APP_A_ADDRESS, BL.Para.AppSize) == BL.Para.Crc32Check);
|
||||
}
|
||||
|
||||
static uint32_t s_StashBuf[FLASH_SECTOR_SIZE / 4]; /*外部Flash读缓冲(8KB)*/
|
||||
|
||||
/*****************************************************************************************
|
||||
* 函数名称: StashToB
|
||||
* 功能描述: Cat1远程升级: 将外部SPI Flash暂存区固件搬运到B区(逐8KB: 读外部2×4KB→擦写B区1×8KB)
|
||||
* 参 数: 无
|
||||
* 返 回 值: 无(搬运后由调用方CRC32校验B区)
|
||||
*****************************************************************************************/
|
||||
static void StashToB(void)
|
||||
{
|
||||
uint32_t TotalWords = (BL.Para.AppSize + 3) / 4; /*实际固件字数*/
|
||||
uint32_t SecPerBank = FLASH_SECTOR_SIZE / 4;
|
||||
uint32_t FullSectors = TotalWords / SecPerBank;
|
||||
uint32_t RemainWords = TotalWords % SecPerBank;
|
||||
uint32_t Sec, Base, SrcAddr;
|
||||
|
||||
for(Sec = 0; Sec < FullSectors; Sec++) {
|
||||
Base = APP_B_ADDRESS + Sec * FLASH_SECTOR_SIZE;
|
||||
SrcAddr = FLASH_FW_STASH_SECTOR * SPIFLASH_SECTORSIZE + Sec * FLASH_SECTOR_SIZE;
|
||||
FeedDog();
|
||||
ExtFlashRead(SrcAddr, (uint8_t *)s_StashBuf, FLASH_SECTOR_SIZE);
|
||||
EraseFlash(Base, 1);
|
||||
FlashWrite(Base, s_StashBuf, SecPerBank);
|
||||
}
|
||||
if(RemainWords > 0) {
|
||||
Base = APP_B_ADDRESS + FullSectors * FLASH_SECTOR_SIZE;
|
||||
SrcAddr = FLASH_FW_STASH_SECTOR * SPIFLASH_SECTORSIZE + FullSectors * FLASH_SECTOR_SIZE;
|
||||
FeedDog();
|
||||
ExtFlashRead(SrcAddr, (uint8_t *)s_StashBuf, RemainWords * 4);
|
||||
EraseFlash(Base, 1);
|
||||
FlashWrite(Base, s_StashBuf, RemainWords);
|
||||
}
|
||||
}
|
||||
|
||||
/*****************************************************************************************
|
||||
@@ -188,6 +269,10 @@ bool AnalyzeData(uint8_t *rData, uint16_t rLen)
|
||||
return false;
|
||||
}
|
||||
UDReq UpData = (UDReq)&rData[sizeof(FrameHeader_t)];
|
||||
/*固件大小合法性检查: 为0或超出B区容量时拒绝升级*/
|
||||
if(UpData->AppSize == 0 || UpData->AppSize > APP_BANK_SIZE) {
|
||||
return false;
|
||||
}
|
||||
BL.Para.AppFlag = 0;
|
||||
BL.Para.UpdateFlag = APP_UPDATE_FLAG;
|
||||
BL.Para.Crc32Check = UpData->AppCrc32;
|
||||
@@ -204,12 +289,16 @@ bool AnalyzeData(uint8_t *rData, uint16_t rLen)
|
||||
if(BL.UpDateFlag == false) {
|
||||
return false;
|
||||
}
|
||||
/*状态守卫: 仅下载状态接收数据, 防止搬运/复位阶段迟到包破坏B区*/
|
||||
if(BL.Status != BL_GET_DATA && BL.Status != BL_WAIT_REV) {
|
||||
return false;
|
||||
}
|
||||
DownRes DownData = (DownRes)&rData[sizeof(FrameHeader_t)];
|
||||
if(BL.AppPackageIdx != DownData->PackageIndex) {
|
||||
return false;
|
||||
}
|
||||
/*写数据到Flash*/
|
||||
AppWriteFlash(BL.AppPackageIdx * 200, &rData[sizeof(FrameHeader_t) + sizeof(DownResponse_t)], DownData->DataLen);
|
||||
AppWriteFlash(APP_B_ADDRESS, BL.AppPackageIdx * 200, &rData[sizeof(FrameHeader_t) + sizeof(DownResponse_t)], DownData->DataLen);
|
||||
BL.AppPackageIdx++;
|
||||
BL.RevErrCnt = 0;
|
||||
|
||||
@@ -218,23 +307,22 @@ bool AnalyzeData(uint8_t *rData, uint16_t rLen)
|
||||
BL.BootLoader1mSDlyCnt = 5;
|
||||
}
|
||||
else {
|
||||
/*全部数据处理完成, 校验CRC32*/
|
||||
uint32_t crc32 = GetCrc32(BL.Para.AppSize);
|
||||
/*全部数据处理完成: 整包校验B区CRC32(此时尚未触碰A区, 原App完好)*/
|
||||
uint32_t crc32 = GetCrc32(APP_B_ADDRESS, BL.Para.AppSize);
|
||||
if(crc32 == BL.Para.Crc32Check) {
|
||||
/*置升级完成标记(每次升级均置位):Boot本身不擦除外部Flash,
|
||||
App启动时检测到此标记后擦除外部参数分区并恢复APP_START_FLAG*/
|
||||
BL.Para.AppFlag = APP_BOOT_UPGRADE_FLAG;
|
||||
BL.Para.UpdateFlag = 0;
|
||||
WriteBootPara(&BL.Para);
|
||||
BL.BootLoader1mSDlyCnt = 100;
|
||||
BL.Status = BL_RESET;
|
||||
/*B区校验通过: 关闭接收, 进入搬运阶段(B→A), 搬运并校验A区后才置升级完成标记*/
|
||||
BL.UpDateFlag = false;
|
||||
BL.CopyRetryCnt = 0;
|
||||
BL.Status = BL_COPY_TO_A;
|
||||
}
|
||||
else {
|
||||
BL.Para.AppFlag = 0;
|
||||
/*B区校验失败: A区未动, 恢复老App启动标志并复位, 主机可重新发起升级*/
|
||||
BL.Para.AppFlag = APP_START_FLAG;
|
||||
BL.Para.UpdateFlag = 0;
|
||||
WriteBootPara(&BL.Para);
|
||||
BL.UpDateFlag = false;
|
||||
BL.Status = BL_IDLE;
|
||||
BL.BootLoader1mSDlyCnt = 100;
|
||||
BL.Status = BL_RESET;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
@@ -359,9 +447,77 @@ void BootLoaderLoopHandler(void)
|
||||
}
|
||||
break;
|
||||
|
||||
case BL_COPY_TO_A:
|
||||
/*搬运B区已校验镜像到A区, 完成后整包校验A区*/
|
||||
if(CopyAppBtoA()) {
|
||||
/*搬运校验通过: 立即擦除B区作废镜像, 防止下次升级时B区残留被误判为断电续传而跳过下载*/
|
||||
EraseFlash(APP_B_ADDRESS, APP_BANK_SECTORS);
|
||||
/*置升级完成标记(每次升级均置位), App启动时擦除外部参数分区并恢复APP_START_FLAG*/
|
||||
BL.Para.AppFlag = APP_BOOT_UPGRADE_FLAG;
|
||||
BL.Para.UpdateFlag = 0;
|
||||
WriteBootPara(&BL.Para);
|
||||
BL.BootLoader1mSDlyCnt = 100;
|
||||
BL.Status = BL_RESET;
|
||||
}
|
||||
else {
|
||||
/*搬运后A区校验失败(B区仍有效): 重试一次搬运*/
|
||||
if(BL.CopyRetryCnt++ < 1) {
|
||||
break;
|
||||
}
|
||||
/*重试仍失败: 清标志停留等待主机重新升级*/
|
||||
BL.Para.AppFlag = 0;
|
||||
BL.Para.UpdateFlag = 0;
|
||||
WriteBootPara(&BL.Para);
|
||||
BL.Status = BL_IDLE;
|
||||
}
|
||||
break;
|
||||
|
||||
case BL_STASH_TO_B:
|
||||
FeedDog();
|
||||
/*固件大小非法: 无法搬运, 恢复老App(A区未动)并复位*/
|
||||
if(BL.Para.AppSize == 0 || BL.Para.AppSize > APP_BANK_SIZE) {
|
||||
BL.Para.AppFlag = APP_START_FLAG;
|
||||
BL.Para.UpdateFlag = 0;
|
||||
WriteBootPara(&BL.Para);
|
||||
BL.BootLoader1mSDlyCnt = 100;
|
||||
BL.Status = BL_RESET;
|
||||
break;
|
||||
}
|
||||
/*外部SPI Flash暂存区→B区(逐8KB), StashToB幂等: 搬运中断电重启后自动重做*/
|
||||
StashToB();
|
||||
/*B区整包校验: 通过进搬运, 失败清标志回老App*/
|
||||
if(GetCrc32(APP_B_ADDRESS, BL.Para.AppSize) == BL.Para.Crc32Check) {
|
||||
BL.CopyRetryCnt = 0;
|
||||
BL.Status = BL_COPY_TO_A;
|
||||
}
|
||||
else {
|
||||
BL.Para.AppFlag = APP_START_FLAG;
|
||||
BL.Para.UpdateFlag = 0;
|
||||
WriteBootPara(&BL.Para);
|
||||
BL.BootLoader1mSDlyCnt = 100;
|
||||
BL.Status = BL_RESET;
|
||||
}
|
||||
break;
|
||||
|
||||
case BL_ERASE_FLASH:
|
||||
FeedDog();
|
||||
EraseFlash();
|
||||
/*固件大小非法: 无法下载, 恢复老App(A区未动)并复位*/
|
||||
if(BL.Para.AppSize == 0 || BL.Para.AppSize > APP_BANK_SIZE) {
|
||||
BL.Para.AppFlag = APP_START_FLAG;
|
||||
BL.Para.UpdateFlag = 0;
|
||||
WriteBootPara(&BL.Para);
|
||||
BL.BootLoader1mSDlyCnt = 100;
|
||||
BL.Status = BL_RESET;
|
||||
break;
|
||||
}
|
||||
/*先校验B区: 已有完整有效镜像则直接搬运(断电续传: 下载完未搬运/搬运中断电)*/
|
||||
if(GetCrc32(APP_B_ADDRESS, BL.Para.AppSize) == BL.Para.Crc32Check) {
|
||||
BL.CopyRetryCnt = 0;
|
||||
BL.Status = BL_COPY_TO_A;
|
||||
break;
|
||||
}
|
||||
/*B区无效: 仅擦除B区(A区保留原App), 逐包下载到B区*/
|
||||
EraseFlash(APP_B_ADDRESS, APP_BANK_SECTORS);
|
||||
FeedDog();
|
||||
BL.Status = BL_GET_DATA;
|
||||
BL.BootLoader1mSDlyCnt = 200;
|
||||
@@ -392,12 +548,14 @@ void BootLoaderLoopHandler(void)
|
||||
BL.Status = BL_GET_DATA;
|
||||
}
|
||||
else {
|
||||
BL.Status = BL_IDLE;
|
||||
BL.Para.AppFlag = 0;
|
||||
BL.RevErrCnt = 0;
|
||||
/*下载超时: A区未动, 恢复老App启动标志并复位(设备回到可运行状态)*/
|
||||
BL.Para.AppFlag = APP_START_FLAG;
|
||||
BL.Para.UpdateFlag = 0;
|
||||
WriteBootPara(&BL.Para);
|
||||
BL.RevErrCnt = 0;
|
||||
BL.UpDateFlag = false;
|
||||
BL.BootLoader1mSDlyCnt = 100;
|
||||
BL.Status = BL_RESET;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -467,6 +625,9 @@ int32_t main(void)
|
||||
if(BL.Para.AppFlag == APP_START_FLAG || BL.Para.AppFlag == APP_BOOT_UPGRADE_FLAG) {
|
||||
BL.Status = BL_START_APP;
|
||||
}
|
||||
else if(BL.Para.UpdateFlag == APP_UPDATE_SPI_FLAG) {
|
||||
BL.Status = BL_STASH_TO_B; /*Cat1远程升级: 外部Flash暂存区→B区→A区*/
|
||||
}
|
||||
else if(BL.Para.UpdateFlag == APP_UPDATE_FLAG) {
|
||||
BL.Status = BL_ERASE_FLASH;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user