初始版本

This commit is contained in:
2026-05-09 17:09:52 +08:00
parent ba90df0690
commit 16f6ec78e5
96 changed files with 75964 additions and 0 deletions
+76
View File
@@ -0,0 +1,76 @@
/*******************************************************************************
* Copyright (C) 2018, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd ("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/******************************************************************************/
/** \file ddl_device.h
**
** Device define
** @link SampleGroup Some description @endlink
**
** - 2018-04-15
**
*****************************************************************************/
#ifndef __DDL_DEVICE_H__
#define __DDL_DEVICE_H__
/**
*******************************************************************************
** \brief Global device series definition
**
** \note
******************************************************************************/
#define DDL_MCU_SERIES DDL_DEVICE_SERIES_HC32L17X
/**
*******************************************************************************
** \brief Global package definition
**
** \note This definition is used for device package settings
******************************************************************************/
#define DDL_MCU_PACKAGE DDL_DEVICE_PACKAGE_HC_K
#endif /* __DDL_DEVICE_H__ */
/*******************************************************************************
* EOF (not truncated)
******************************************************************************/
+251
View File
@@ -0,0 +1,251 @@
#ifndef _BSP_H
#define _BSP_H
#include <stdint.h>
#include <stdbool.h>
#include "gpio.h"
/*设备类型*/
#define FORCE_6D 0x0001 //0x0001 六维应力
#define OSMOTIC_PRESSURE 0x0002 //0x0002 渗透压
#define ELASTIC_WAVEGUIDE 0x0003 //0x0003 弹性波导
#define DIELECTRIC_MASS 0x0004 //0x0004 介电质普
#define _0x0005 0x0005 //0x0005 保留
#define CONT_DEFOR_3D 0x0006 //0x0006 三维连续变形
#define COMM_UNIT 0x0007 //0x0007 通讯单元
#define FORCE_3D 0x0008 //0x0008 三维应力
#define LASER_TRACING 0x0009 //0x0009 激光示踪
#define _0x000A 0x000A //0x000A 保留
#define _0x000B 0x000B //0x000B 保留
#define _0x000C 0x000C //0x000C 保留
#define MULTI_PARAMETER_FUSION 0x000D //0x000D 多参数融合
#define CRACK_DETECTION 0x000E //0x000E 裂缝仪
#define _0x000F 0x000F //0x000F 保留
#define ATTITUDE_MONITOR 0x0010 //0x0010 姿态检测
#define LASER_DISPLACE 0x0011 //0x0011 激光位移
#define REBAR_STRESS 0x0012 //0x0012 钢筋应力
#define ANCHOR_ROD_STRESS 0x0013 //0x0013 锚杆轴力
#define SURFACE_STRESS 0x0014 //0x0014 表面应力
#define PRESSURE 0x0015 //0x0015 压力
#define MICROWAVE_DISPLACE 0x0016 //0x0016 微波测距
/*通讯方式*/
typedef enum {
LORA = 0x01, //0x01 LORA通讯
RS485 = 0x02, //0x02 RS485通讯
RS232 = 0x03, //0x03 RS232通讯
CAN = 0x04, //0x04 CAN通讯
_4G = 0x05, //0x05 _4G通讯
BLE = 0x06, //0x06 BLE通讯
WIFI = 0x07, //0x07 WIFI通讯
}COMM_WAY_M;
/*设备标志*/
typedef enum {
MASTER = 0x000000, //0x000000 主设备
SUBSET = 0x800000, //0x800000 子设备
}DEVICE_SIGN_M;
/*设备类型选择*/
#define DEVICE_TYPE LASER_TRACING
/*通讯方式选择*/
#define COMM_WAY LORA
/*设备标志选择*/
#define DEVICE_SIGN MASTER
/*设备地址编号设置*/
#define ADD_NUMBER (0x000000 + DEVICE_SIGN) //数字部分对应唯一地址编号
#if(DEVICE_TYPE == LASER_TRACING)
#define LP_UART_CH 0
#define LPUART (M0P_LPUART0)
#define LPUART_IRQN (LPUART0_IRQn)
#define LPUART_PERIPHERAL_CLK (SysctrlPeripheralLpUart0)
#define LPUART_TX_AF GpioAf4
#define LPUART_TX_PORT GpioPortB
#define LPUART_TX_PIN GpioPin10
#define LPUART_RX_AF GpioAf3
#define LPUART_RX_PORT GpioPortB
#define LPUART_RX_PIN GpioPin11
#define RS485_CTRL_PORT GpioPortB
#define RS485_CTRL_PIN GpioPin1
#define RS485_CTRL_RX() Gpio_ClrIO(RS485_CTRL_PORT, RS485_CTRL_PIN)
#define RS485_CTRL_TX() Gpio_SetIO(RS485_CTRL_PORT, RS485_CTRL_PIN)
#endif
#if(DEVICE_TYPE == FORCE_6D)
#define LP_UART_CH 0
#define LPUART (M0P_LPUART0)
#define LPUART_IRQN (LPUART0_IRQn)
#define LPUART_PERIPHERAL_CLK (SysctrlPeripheralLpUart0)
#define LPUART_TX_AF GpioAf3
#define LPUART_TX_PORT GpioPortB
#define LPUART_TX_PIN GpioPin0
#define LPUART_RX_AF GpioAf3
#define LPUART_RX_PORT GpioPortB
#define LPUART_RX_PIN GpioPin11
#define RS485_CTRL_PORT GpioPortB
#define RS485_CTRL_PIN GpioPin1
#define RS485_CTRL_RX() Gpio_ClrIO(RS485_CTRL_PORT, RS485_CTRL_PIN)
#define RS485_CTRL_TX() Gpio_SetIO(RS485_CTRL_PORT, RS485_CTRL_PIN)
#endif
#if(DEVICE_TYPE == OSMOTIC_PRESSURE)
#define LP_UART_CH 0
#define LPUART (M0P_LPUART0)
#define LPUART_IRQN (LPUART0_IRQn)
#define LPUART_PERIPHERAL_CLK (SysctrlPeripheralLpUart0)
#define LPUART_TX_AF GpioAf3
#define LPUART_TX_PORT GpioPortB
#define LPUART_TX_PIN GpioPin0
#define LPUART_RX_AF GpioAf3
#define LPUART_RX_PORT GpioPortB
#define LPUART_RX_PIN GpioPin11
#define RS485_CTRL_PORT GpioPortB
#define RS485_CTRL_PIN GpioPin1
#define RS485_CTRL_RX() Gpio_ClrIO(RS485_CTRL_PORT, RS485_CTRL_PIN)
#define RS485_CTRL_TX() Gpio_SetIO(RS485_CTRL_PORT, RS485_CTRL_PIN)
#endif
#if(DEVICE_TYPE == CONT_DEFOR_3D)
#define LP_UART_CH 0
#define LPUART (M0P_LPUART0)
#define LPUART_IRQN (LPUART0_IRQn)
#define LPUART_PERIPHERAL_CLK (SysctrlPeripheralLpUart0)
#define LPUART_TX_AF GpioAf3
#define LPUART_TX_PORT GpioPortB
#define LPUART_TX_PIN GpioPin0
#define LPUART_RX_AF GpioAf3
#define LPUART_RX_PORT GpioPortB
#define LPUART_RX_PIN GpioPin11
#define RS485_CTRL_PORT GpioPortB
#define RS485_CTRL_PIN GpioPin1
#define RS485_CTRL_RX() Gpio_ClrIO(RS485_CTRL_PORT, RS485_CTRL_PIN)
#define RS485_CTRL_TX() Gpio_SetIO(RS485_CTRL_PORT, RS485_CTRL_PIN)
#endif
#if(DEVICE_TYPE == COMM_UNIT)
#define LP_UART_CH 0
#define LPUART (M0P_LPUART0)
#define LPUART_IRQN (LPUART0_IRQn)
#define LPUART_PERIPHERAL_CLK (SysctrlPeripheralLpUart0)
#define LPUART_TX_AF GpioAf4
#define LPUART_TX_PORT GpioPortB
#define LPUART_TX_PIN GpioPin10
#define LPUART_RX_AF GpioAf3
#define LPUART_RX_PORT GpioPortB
#define LPUART_RX_PIN GpioPin11
#define RS485_CTRL_PORT GpioPortB
#define RS485_CTRL_PIN GpioPin2
#define RS485_CTRL_RX() Gpio_ClrIO(RS485_CTRL_PORT, RS485_CTRL_PIN)
#define RS485_CTRL_TX() Gpio_SetIO(RS485_CTRL_PORT, RS485_CTRL_PIN)
#endif
#if(DEVICE_TYPE == FORCE_3D)
#define LP_UART_CH 0
#define LPUART (M0P_LPUART0)
#define LPUART_IRQN (LPUART0_IRQn)
#define LPUART_PERIPHERAL_CLK (SysctrlPeripheralLpUart0)
#define LPUART_TX_AF GpioAf3
#define LPUART_TX_PORT GpioPortB
#define LPUART_TX_PIN GpioPin0
#define LPUART_RX_AF GpioAf3
#define LPUART_RX_PORT GpioPortB
#define LPUART_RX_PIN GpioPin11
#define RS485_CTRL_PORT GpioPortB
#define RS485_CTRL_PIN GpioPin1
#define RS485_CTRL_RX() Gpio_ClrIO(RS485_CTRL_PORT, RS485_CTRL_PIN)
#define RS485_CTRL_TX() Gpio_SetIO(RS485_CTRL_PORT, RS485_CTRL_PIN)
#endif
#if(DEVICE_TYPE == CRACK_DETECTION)
#define LP_UART_CH 0
#define LPUART (M0P_LPUART0)
#define LPUART_IRQN (LPUART0_IRQn)
#define LPUART_PERIPHERAL_CLK (SysctrlPeripheralLpUart0)
#define LPUART_TX_AF GpioAf4
#define LPUART_TX_PORT GpioPortB
#define LPUART_TX_PIN GpioPin10
#define LPUART_RX_AF GpioAf3
#define LPUART_RX_PORT GpioPortB
#define LPUART_RX_PIN GpioPin11
#define RS485_CTRL_PORT GpioPortB
#define RS485_CTRL_PIN GpioPin2
#define RS485_CTRL_RX() Gpio_ClrIO(RS485_CTRL_PORT, RS485_CTRL_PIN)
#define RS485_CTRL_TX() Gpio_SetIO(RS485_CTRL_PORT, RS485_CTRL_PIN)
#endif
#define FLASH_SECTOR_SIZE 0x200ul
#define FLASH_BASE ((uint32_t)0x00000000)
#define FLASH_SIZE (230u * FLASH_SECTOR_SIZE)
#define SRAM_BASE ((uint32_t)0x20000000)
#define RAM_SIZE 0x4000ul
#define BOOT_SIZE (20 * FLASH_SECTOR_SIZE)
#define APP_ADDRESS (0x2A00)//(FLASH_BASE + BOOT_SIZE)
#define BOOT_PARA_ADDRESS (0x0001FC00)
#define BOOT_PARA_SIZE (FLASH_SECTOR_SIZE)
#define DEBUG 1
#define USE_LOWPOWER 0
#define USE_WDT 1
//#define WAKEUP_TIME_ARR (65536 - (30 * 150)) //65536 - time * 38400Hz / 256分频
#define SYSCLK_RCH 0
#define SYSCLK_XTH 1
#define SYSCLK_PLL 2
#define SYSCLK SYSCLK_RCH
typedef struct {
uint32_t AppFlag;
uint32_t UpdateFlag;
uint32_t PackageCnt;
uint32_t AppSize;
uint32_t Crc32Check;
}BootPara_t, *BootPara;
typedef void (*ReadPara)(BootPara_t rPara);
typedef void (*SavPara)(BootPara_t wPara);
typedef void (*UartSend)(uint8_t *sData, int sLen);
typedef void (*DataRevCallBack)(uint8_t *rData, uint8_t rLen);
void BspInit(void);
void DBGUartSendByte(uint8_t sData);
void DBGUartSend(uint8_t *sData, int sLen);
void ReadBootPara(BootPara rData);
void WriteBootPara(BootPara wData);
void EraseFlash(void);
uint32_t GetSysTick(void);
void delay_ms(uint32_t ms);
void Delay(uint8_t time);
void FeedDog(void);
void SystemReset(void);
#endif
+75
View File
@@ -0,0 +1,75 @@
#ifndef __MAIN_H
#define __MAIN_H
#include "bsp.h"
#include "UartDebug.h"
#define CRC16_BASE 0xA001
#define APP_START_FLAG 0x55AA5A5A
#define APP_UPDATE_FLAG 0xA5A5AA55
typedef enum {
UPDATE_CMD_NULL,
UPDATE_CMD_SLAVE_RES, //从机应答主机下发
UPDATE_CMD_SLAVE_REQ_DATA, //从机请求主机下发数据
UPDATE_CMD_MASTER_REQ = 0x81, //主机请求升级
UPDATE_CMD_MASTRE_RES_DATA, //主机发送数据
}UpdateCmd_m;
//帧头结构体
typedef struct {
uint8_t Header;
uint8_t DevMac[6];
uint8_t Cmd;
uint8_t PayloadLen;
}__attribute__ ((packed))FrameHeader_t, *FrameH;
//主机下发升级请求载荷结构体
typedef struct {
uint16_t PackageNum;
uint32_t AppSize;
uint32_t AppCrc32;
}__attribute__ ((packed))UpDataRequset_t, *UDReq;
//从机请求下发结构体
typedef struct {
uint16_t PackageIndex;
uint32_t PackageNum;
}__attribute__ ((packed))GetDataRequest_t, *GDReq;
//主机应答下发数据结构体
typedef struct {
uint16_t PackageIndex;
uint16_t PackageNum;
uint8_t DataLen;
}__attribute__ ((packed))DownResponse_t, *DownRes;
typedef enum {
BL_IDLE,
BL_ERASE_FLASH,
BL_GET_DATA,
BL_WAIT_REV,
BL_GET_DATA_TIMEOUT,
BL_START_APP,
BL_RESET
}BootStatus_m;
typedef struct {
BootPara_t Para;
BootStatus_m Status;
uint32_t AppPackageCnt;
uint32_t AppPackageIdx;
uint32_t RevErrCnt;
uint32_t FeedDogDlyCnt;
uint32_t BootLoader1mSDlyCnt;
bool RxFlag;
uint32_t UartRevTimeOutCnt;
uint8_t RxBuff[260];
uint16_t RxLen;
uint16_t UpDateFlag;
}BootLoader_t;
#endif
+315
View File
@@ -0,0 +1,315 @@
#include "sysctrl.h"
#include "gpio.h"
#include "flash.h"
#include "bsp.h"
#include "lpuart.h"
#include "bt.h"
#include "wdt.h"
extern void DebugUartIRQ(uint8_t Data);
extern void BleIRQHandler(uint8_t rData);
extern void SysTick_CallBack(void);
extern void KeyIRQHandler(void);
static __IO uint32_t SysTickCnt = 0;
static __IO bool LpUart0_Tx_Flag;
#define WAKEUP_TIME_ARR 1000
#define USE_RCL_TRIM 0
#define DBG_LOG(...)
#if (SYSCLK == SYSCLK_RCH)
static void SystemClkInit(en_sysctrl_rch_freq_t enRchFreq)
{
///< RCH时钟不同频率的切换,需要先将时钟切换到RCL
Sysctrl_SetRCLTrim(SysctrlRclFreq32768);
Sysctrl_SetRCLStableTime(SysctrlRclStableCycle64);
Sysctrl_ClkSourceEnable(SysctrlClkRCL, TRUE);
Sysctrl_SysClkSwitch(SysctrlClkRCL);
///< 加载目标频率的RCH的TRIM值
Sysctrl_SetRCHTrim(enRchFreq);
///< 使能RCH
Sysctrl_ClkSourceEnable(SysctrlClkRCH, TRUE);
///< 时钟切换到RCH
Sysctrl_SysClkSwitch(SysctrlClkRCH);
///< HCLK不超过24M:此处设置FLASH读等待周期为0 cycle
Flash_WaitCycle(FlashWaitCycle0);
}
#elif (SYSCLK == SYSCLK_XTH)
static void SystemClkInit(en_sysctrl_xth_freq_t enXthFreq)
{
///<======================== 切换至XTH32MHz ==============================
///< 当使用的时钟源HCLK大于24M:设置FLASH 读等待周期为1 cycle(默认值也为1 cycle)
if(SysctrlXthFreq24_32MHz == enXthFreq)
{
Flash_WaitCycle(FlashWaitCycle1);
}
///< 切换时钟前(根据外部高速晶振)设置XTH频率范围,配置晶振参数,使能目标时钟,此处为SYSTEM_XTH = 32MHz
Sysctrl_SetXTHFreq(enXthFreq);
Sysctrl_XTHDriverCfg(SysctrlXtalDriver3);
Sysctrl_SetXTHStableTime(SysctrlXthStableCycle16384);
Sysctrl_ClkSourceEnable(SysctrlClkXTH, TRUE);
delay1ms(10);
Sysctrl_SysClkSwitch(SysctrlClkXTH);
if(SysctrlXthFreq24_32MHz != enXthFreq)
{
Flash_WaitCycle(FlashWaitCycle0);
}
//M0P_SYSCTRL->SYSCTRL0_f.WAKEUP_BYRCH = 0; //唤醒保持原时钟
}
#elif (SYSCLK == SYSCLK_PLL)
///<请注意根据外部晶振配置宏——[SYSTEM_XTH],如果使用PLLXTH必须小于24MHz
static void SystemClkInit(void)
{
stc_sysctrl_pll_cfg_t stcPLLCfg;
///< 切换时钟前(根据外部高速晶振)设置XTH频率范围,配置晶振参数,使能目标时钟,此处为SYSTEM_XTH = 32MHz
// Sysctrl_SetXTHFreq(SysctrlXthFreq4_8MHz);
// Sysctrl_XTHDriverCfg(SysctrlXtalDriver3);
// Sysctrl_SetXTHStableTime(SysctrlXthStableCycle16384);
// Sysctrl_ClkSourceEnable(SysctrlClkXTH, TRUE);
Sysctrl_SetRCHTrim(SysctrlRchFreq8MHz);
Sysctrl_ClkSourceEnable(SysctrlClkRCH, TRUE);
delay1ms(10);
stcPLLCfg.enInFreq = SysctrlPllInFreq6_12MHz; //XTH 8MHz
stcPLLCfg.enOutFreq = SysctrlPllOutFreq36_48MHz; //PLL 输出
stcPLLCfg.enPllClkSrc = SysctrlPllRch; //输入时钟源选择RCH
stcPLLCfg.enPllMul = SysctrlPllMul6; //8MHz x 6 = 48MHz
Sysctrl_SetPLLFreq(&stcPLLCfg);
///< 当使用的时钟源HCLK大于24M:设置FLASH 读等待周期为1 cycle(默认值也为1 cycle)
Flash_WaitCycle(FlashWaitCycle1);
///< 使能PLL
Sysctrl_ClkSourceEnable(SysctrlClkPLL, TRUE);
///< 时钟切换到PLL
Sysctrl_SysClkSwitch(SysctrlClkPLL);
}
#endif
static void SystemRCLInit(void)
{
Sysctrl_SetRCLTrim(SysctrlRclFreq38400); ///< 配置RCL时钟为32kHz
Sysctrl_SetRCLStableTime(SysctrlRclStableCycle256);
Sysctrl_ClkSourceEnable(SysctrlClkRCL, TRUE); ///< 使能RCL时钟
}
static void LPUartInit(void)
{
stc_gpio_cfg_t stcGpioCfg;
stc_lpuart_cfg_t stcCfg;
DDL_ZERO_STRUCT(stcGpioCfg);
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE);
///<TX
stcGpioCfg.enDir = GpioDirOut;
Gpio_Init(LPUART_TX_PORT, LPUART_TX_PIN, &stcGpioCfg);
Gpio_SetAfMode(LPUART_TX_PORT, LPUART_TX_PIN, LPUART_TX_AF); //配置PA00为LPUART1_TX
//<RX
stcGpioCfg.enDir = GpioDirIn;
Gpio_Init(LPUART_RX_PORT, LPUART_RX_PIN,&stcGpioCfg);
Gpio_SetAfMode(LPUART_RX_PORT, LPUART_RX_PIN, LPUART_RX_AF); //配置PA01为LPUART1_RX
DDL_ZERO_STRUCT(stcCfg);
Sysctrl_SetPeripheralGate(LPUART_PERIPHERAL_CLK,TRUE);
///<LPUART 初始化
stcCfg.enStopBit = LPUart1bit; ///<1停止位
stcCfg.enMmdorCk = LPUartEven; ///<偶校验
stcCfg.stcBaud.enSclkSel = LPUartMskRcl; ///<传输时钟源
stcCfg.stcBaud.u32Sclk = 38400; ///<PCLK获取
stcCfg.stcBaud.enSclkDiv = LPUartMsk4Or8Div; ///<采样分频
stcCfg.stcBaud.u32Baud = 9600; ///<波特率
stcCfg.enRunMode = LPUartMskMode1; ///<工作模式
LPUart_Init(LPUART, &stcCfg);
///<LPUART 中断使能
LPUart_ClrStatus(LPUART,LPUartRC); ///<清接收中断请求
LPUart_ClrStatus(LPUART,LPUartTC); ///<清发送中断请求
LPUart_EnableIrq(LPUART,LPUartTxIrq); ///<使能发送中断
LPUart_EnableIrq(LPUART,LPUartRxIrq); ///<使能接收中断
EnableNvic(LPUART_IRQN,IrqLevel3,TRUE); ///<系统中断使能
}
void DBGUartSend(uint8_t *sData, int sLen)
{
uint16_t dlyCnt = 0xffff;
RS485_CTRL_TX();
delay_ms(1);
for(int i = 0; i < sLen; i++) {
LpUart0_Tx_Flag = false;
dlyCnt = 0xffff;
LPUart_SendDataIt(LPUART, sData[i]);
while(dlyCnt > 0) {
dlyCnt--;
if(LpUart0_Tx_Flag)
break;
}
}
RS485_CTRL_RX();
}
#if(LP_UART_CH == 0)
void LpUart0_IRQHandler(void)
{
if(LPUart_GetStatus(LPUART, LPUartTC)) {
LPUart_ClrStatus(LPUART, LPUartTC); ///<清发送中断请求
LpUart0_Tx_Flag = true;
}
if(LPUart_GetStatus(LPUART, LPUartRC)) { ///接收数据
LPUart_ClrStatus(LPUART, LPUartRC); ///<清接收中断请求
uint8_t u8RxData = LPUart_ReceiveData(LPUART); ///读取数据
DebugUartIRQ(u8RxData);
}
}
#else
void LpUart1_IRQHandler(void)
{
if(LPUart_GetStatus(LPUART, LPUartTC)) {
LPUart_ClrStatus(LPUART, LPUartTC); ///<清发送中断请求
LpUart0_Tx_Flag = true;
}
if(LPUart_GetStatus(LPUART, LPUartRC)) { ///接收数据
LPUart_ClrStatus(LPUART, LPUartRC); ///<清接收中断请求
uint8_t u8RxData = LPUart_ReceiveData(LPUART); ///读取数据
DebugUartIRQ(u8RxData);
}
}
#endif
static void GPIOInit(void)
{
stc_gpio_cfg_t GpioInitStruct;
DDL_ZERO_STRUCT(GpioInitStruct);
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE);
GpioInitStruct.enDir = GpioDirOut; ///< 端口方向配置->输入
GpioInitStruct.enDrv = GpioDrvH; ///< 端口驱动能力配置->高驱动能力
GpioInitStruct.enPu = GpioPuDisable; ///< 端口上下拉配置->无
GpioInitStruct.enPd = GpioPdDisable;
GpioInitStruct.enOD = GpioOdDisable; ///< 端口开漏输出配置->开漏输出关闭
GpioInitStruct.enCtrlMode = GpioAHB; ///< 端口输入/输出值寄存器总线控制模式配置->AHB
GpioInitStruct.bOutputVal = false;
Gpio_Init(RS485_CTRL_PORT, RS485_CTRL_PIN, &GpioInitStruct);
RS485_CTRL_RX();
}
static void WdtInit(void)
{
#if (USE_WDT == 1)
///< 开启WDT外设时钟
Sysctrl_SetPeripheralGate(SysctrlPeripheralWdt,TRUE);
///< WDT 初始化
Wdt_Init(WdtResetEn, WdtT52s4);
Wdt_Start();
#endif
}
static void FlashWrite(uint32_t *wData, uint8_t wLen)
{
while(Ok != Flash_SectorErase(BOOT_PARA_ADDRESS));
for(int i = 0; i < wLen / 4; i++) {
Flash_WriteWord(BOOT_PARA_ADDRESS + i * 4, wData[i]);
}
}
static void FlashRead(uint32_t *rData, uint8_t rLen)
{
uint32_t u32Addr = BOOT_PARA_ADDRESS;
for(int i = 0; i < rLen / 4; i++) {
rData[i] = *((volatile uint32_t*)(u32Addr + i * 4));
}
}
void FeedDog(void)
{
#if (USE_WDT == 1)
Wdt_Feed();
#endif
}
uint32_t GetSysTick(void)
{
return SysTickCnt;
}
void Delay(uint8_t time)
{
while(time > 0) {
time --;
}
}
void delay_ms(uint32_t mS)
{
volatile uint32_t cTick, mTick;
cTick = GetSysTick();
while(1){
mTick = GetSysTick();
if(mTick - cTick >= mS)
break;
}
}
void SystemReset(void)
{
NVIC_SystemReset();
}
void BspInit(void)
{
//SystemClkInit(SysctrlXthFreq4_8MHz);
SystemClkInit(SysctrlRchFreq16MHz);
SystemCoreClockUpdate();
SysTick_Config(SystemCoreClock/1000);
SystemRCLInit();
GPIOInit();
LPUartInit();
while(Ok != Flash_Init(4, TRUE));
WdtInit();
}
void SysTick_IRQHandler(void)
{
SysTickCnt++;
SysTick_CallBack();
}
void ReadBootPara(BootPara rData)
{
FlashRead((uint32_t *)rData, sizeof(BootPara_t));
}
void WriteBootPara(BootPara wData)
{
FlashWrite((uint32_t *)wData, sizeof(BootPara_t));
}
void EraseFlash(void)
{
for(int Addr = APP_ADDRESS; Addr < FLASH_SIZE; Addr += FLASH_SECTOR_SIZE) {
Flash_SectorErase(Addr);
}
}
+324
View File
@@ -0,0 +1,324 @@
/******************************************************************************
* Include files
******************************************************************************/
#include <stdlib.h>
#include "main.h"
//#include "lis2hh12_app.h"
#include "flash.h"
//设备唯一编码,固定在0x00002800位置
const uint8_t DevMac[6] __attribute__((section(".ARM.__at_0x00002800"))) = {DEVICE_TYPE & 0xFF, (DEVICE_TYPE >> 8) & 0xFF, COMM_WAY, (ADD_NUMBER >> 16) & 0xFF, (ADD_NUMBER >> 8) & 0xFF, ADD_NUMBER & 0xFF};
//const uint8_t DevMac[6] __attribute__((at(DEV_MAC_ADDRESS)))= {0x19, 0x00, 0x02, 0x00, 0x00, 0x01};
uint32_t pdwCrc32Tbl[256];
void InitCrc32Table(uint32_t* Crc32Tbl)
{
for (int wCnt = 0; wCnt!= 256; wCnt++){
uint32_t dwCrc = wCnt;
for (int ucCnt = 0; ucCnt != 8; ucCnt++){
if (dwCrc & 1){
dwCrc = (dwCrc >> 1) ^ 0xEDB88320;
}
else{
dwCrc >>= 1;
}
}
Crc32Tbl[wCnt] = dwCrc;
}
}
uint32_t GetCrc32(int dwLen)
{
uint32_t Data;
uint32_t dwCrc32Data = 0xFFFFFFFF;
for (int dwCnt = 0; dwCnt!= dwLen; ++dwCnt){
Data = *((volatile uint8_t*)(APP_ADDRESS + dwCnt));
uint32_t dwTbl = (dwCrc32Data ^ Data) & 0xFF;
dwCrc32Data = ((dwCrc32Data >> 8) & 0xFFFFFF) ^ pdwCrc32Tbl[dwTbl];
}
return ~dwCrc32Data;
}
uint16_t CRC_Modbus(uint16_t wBase, __IO uint8_t *para, uint16_t length)
{
uint16_t crc = 0xffff;
uint16_t index,i;
for(index = 0 ; index < length;index++) {
crc ^= para[index];
for(i = 0; i < 8; i++) {
if(crc & 1) {
crc >>= 1;
crc ^= wBase;
}
else
crc >>= 1;
}
}
return crc;
}
uint32_t JumpAddress;
func_ptr_t JumpToApplication;
BootLoader_t BL;
static void BootLoader1mSRoutine(void)
{
if(BL.BootLoader1mSDlyCnt)
BL.BootLoader1mSDlyCnt--;
if(BL.UartRevTimeOutCnt > 0)
BL.UartRevTimeOutCnt--;
BL.FeedDogDlyCnt++;
}
void FeedDogHandler(void)
{
if(BL.FeedDogDlyCnt >= 200) {
FeedDog();
BL.FeedDogDlyCnt = 0;
}
}
void AppWriteFlash(uint32_t AddrOffset, uint8_t *wData, int wLen)
{
for(int i = 0; i < wLen; i++) {
Flash_WriteByte(APP_ADDRESS + AddrOffset + i, wData[i]);
}
}
static bool JumpToApp(uint32_t AppAddr)
{
uint32_t u32StackTop = *((__IO uint32_t *)AppAddr);
if ((u32StackTop > SRAM_BASE) && (u32StackTop <= (SRAM_BASE + RAM_SIZE))) {
JumpAddress = *(__IO uint32_t *)(AppAddr + 4);
JumpToApplication = (func_ptr_t)JumpAddress;
__set_MSP(*(__IO uint32_t *)AppAddr);
JumpToApplication();
}
return Error;
}
void SendGetCmd(uint8_t Cmd, uint16_t PayLoad)
{
uint8_t sData[20], sLen;
uint16_t crc16;
FrameH Frame = (FrameH)sData;
Frame->Header = 0x7d;
memcpy(Frame->DevMac, DevMac, 6);
Frame->Cmd = Cmd & 0x7F;
if(Frame->Cmd == UPDATE_CMD_SLAVE_RES) {
Frame->PayloadLen = 1;
sData[sizeof(FrameHeader_t)] = PayLoad;
}
else if(Frame->Cmd == UPDATE_CMD_SLAVE_REQ_DATA) {
Frame->PayloadLen = 4;
GDReq GDData = (GDReq)&sData[sizeof(FrameHeader_t)];
GDData->PackageIndex = PayLoad;
GDData->PackageNum = BL.AppPackageCnt;
}
sLen = sizeof(FrameHeader_t) + Frame->PayloadLen;
crc16 = CRC_Modbus(CRC16_BASE, sData, sLen);
sData[sLen++] = crc16;
sData[sLen++] = (crc16 >> 8) & 0x00ff;
DBGUartSend(sData, sLen);
}
bool AnalyzeData(uint8_t *rData, uint16_t rLen)
{
uint16_t crc16, check;
check = CRC_Modbus(CRC16_BASE, rData, rLen - 2);
crc16 = (rData[rLen - 1] << 8) | rData[rLen - 2];
if(check != crc16) {
return false;
}
FrameH Frame = (FrameH)rData;
int ret = memcmp(Frame->DevMac, DevMac, 6);
if(ret != 0)
return false;
if(Frame->Cmd == UPDATE_CMD_MASTER_REQ) {
UDReq UpData = (UDReq)&rData[sizeof(FrameHeader_t)];
BL.Para.AppFlag = 0;
BL.Para.UpdateFlag = APP_UPDATE_FLAG;
BL.Para.Crc32Check = UpData->AppCrc32;
BL.Para.PackageCnt = UpData->PackageNum;
BL.Para.AppSize = UpData->AppSize;
WriteBootPara(&BL.Para);
BL.BootLoader1mSDlyCnt = 20;
BL.Status = BL_RESET;
SendGetCmd(UPDATE_CMD_SLAVE_RES, 1);
}
else if(Frame->Cmd == UPDATE_CMD_MASTRE_RES_DATA) {
if(BL.UpDateFlag == false)
return false;
DownRes DownData = (DownRes)&rData[sizeof(FrameHeader_t)];
if(BL.AppPackageIdx != DownData->PackageIndex) {
return false;
}
AppWriteFlash(BL.AppPackageIdx * 200, &BL.RxBuff[sizeof(FrameHeader_t) + sizeof(DownResponse_t)], DownData->DataLen);
BL.AppPackageIdx++;
BL.RevErrCnt = 0;
if(BL.AppPackageIdx < BL.AppPackageCnt) {
BL.Status = BL_GET_DATA;
BL.BootLoader1mSDlyCnt = 5;
}
else {
uint32_t crc32 = GetCrc32(BL.Para.AppSize);
if(crc32 == BL.Para.Crc32Check) {
BL.Status = BL_START_APP;
BL.Para.AppFlag = 0; //升级成功首次启动时,把APP启动标志清除,由APP置位,下次启动便按标志启动
BL.Para.UpdateFlag = 0;
WriteBootPara(&BL.Para);
}
}
}
else
return false;
return true;
}
void BootLoaderLoopHandler(void)
{
if(BL.RxFlag) {
BL.RxFlag = false;
AnalyzeData(BL.RxBuff, BL.RxLen);
}
switch(BL.Status) {
case BL_IDLE:
break;
case BL_RESET:
if(BL.BootLoader1mSDlyCnt > 0) {
break;
}
SystemReset();
break;
case BL_START_APP:
JumpToApp(APP_ADDRESS);
break;
case BL_ERASE_FLASH:
FeedDog();
EraseFlash();
FeedDog();
BL.Status = BL_GET_DATA;
BL.BootLoader1mSDlyCnt = 200;
BL.AppPackageCnt = BL.Para.PackageCnt;
BL.RevErrCnt = 0;
BL.UpDateFlag = true;
break;
case BL_GET_DATA:
if(BL.BootLoader1mSDlyCnt > 0)
break;
SendGetCmd(UPDATE_CMD_MASTRE_RES_DATA, BL.AppPackageIdx);
BL.Status = BL_WAIT_REV;
BL.BootLoader1mSDlyCnt = 500;
break;
case BL_WAIT_REV:
if(BL.BootLoader1mSDlyCnt == 0) {
BL.Status = BL_GET_DATA_TIMEOUT;
}
break;
case BL_GET_DATA_TIMEOUT:
BL.RevErrCnt++;
if(BL.RevErrCnt < 3) {
BL.Status = BL_GET_DATA;
}
else {
BL.Status = BL_IDLE;
BL.Para.AppFlag = 0;
BL.RevErrCnt = 0;
BL.Para.UpdateFlag = 0;
WriteBootPara(&BL.Para);
BL.UpDateFlag = false;
}
break;
}
}
int32_t main(void)
{
BspInit();
InitCrc32Table(pdwCrc32Tbl);
ReadBootPara(&BL.Para);
if(BL.Para.AppFlag == APP_START_FLAG) {
BL.Status = BL_START_APP;
}
else if(BL.Para.UpdateFlag == APP_UPDATE_FLAG) {
BL.Status = BL_ERASE_FLASH;
}
while (1) {
FeedDogHandler();
BootLoaderLoopHandler();
}
}
/*******************************************************************************
* 中断服务函数
******************************************************************************/
void SysTick_CallBack(void)
{
BootLoader1mSRoutine();
}
void DebugUartIRQ(uint8_t RxData)
{
static uint16_t rLen = 0;
static uint8_t rBuff[300];
static bool Header = false;
static uint16_t PayLen = 0;
if(BL.UartRevTimeOutCnt == 0) {
Header = false;
rLen = 0;
PayLen = 0;
}
BL.UartRevTimeOutCnt = 3;
if(Header == false && (RxData == 0x7d)) {
Header = true;
rLen = 0;
PayLen = 0;
rBuff[rLen++] = RxData;
}
else {
rBuff[rLen++] = RxData;
if(rLen == 9) {
PayLen = RxData;
if(PayLen > 256) {
Header = false;
return;
}
}
else if(rLen == sizeof(FrameHeader_t) + PayLen + 2) {
BL.RxLen = rLen;
memcpy(BL.RxBuff, rBuff, BL.RxLen);
BL.RxFlag = true;
Header = false;
}
}
}
//void KeyIRQHandler(void)
//{
//
//}