Compare commits
2 Commits
0288f9a9a6
...
b98ba4a635
Author | SHA1 | Date |
---|---|---|
|
b98ba4a635 | |
|
973601bb89 |
16
.mxproject
16
.mxproject
File diff suppressed because one or more lines are too long
|
@ -4,6 +4,18 @@
|
|||
"parameter.h": "c",
|
||||
"comm.h": "c",
|
||||
"bl_chargcontrol.h": "c",
|
||||
"comm_types.h": "c"
|
||||
"comm_types.h": "c",
|
||||
"hd_gpio.h": "c",
|
||||
"inflash.h": "c",
|
||||
"fm_tim.h": "c",
|
||||
"timesliceoffset.h": "c",
|
||||
"fm_gpio.h": "c",
|
||||
"pdebug.h": "c",
|
||||
"start.h": "c",
|
||||
"bl_comm.h": "c",
|
||||
"capture.h": "c",
|
||||
"arm_math.h": "c",
|
||||
"abnormalmanage.h": "c",
|
||||
"stm32g431xx.h": "c"
|
||||
}
|
||||
}
|
|
@ -3,6 +3,7 @@
|
|||
#define APP_COMM_H_
|
||||
|
||||
#include "comm_types.h"
|
||||
#include "bl_comm.h"
|
||||
|
||||
|
||||
void uart_comm(void);
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
|
||||
#ifndef APP_TASK_H_
|
||||
#define APP_TASK_H_
|
||||
|
||||
#include "timeSliceOffset.h"
|
||||
|
||||
|
||||
|
||||
|
||||
#endif
|
|
@ -3,18 +3,24 @@
|
|||
#include "parameter.h"
|
||||
#include "comm_types.h"
|
||||
|
||||
/**
|
||||
* @brief 完成充电控制
|
||||
* @param
|
||||
* @retval
|
||||
*
|
||||
*/
|
||||
void chargControl(void)
|
||||
{
|
||||
getCVData();
|
||||
judgeYNBattery();
|
||||
|
||||
g_otherParameter.MPPT_Mode = chargControlMode();
|
||||
chargControlMode();
|
||||
|
||||
if (g_otherParameter.MPPT_Mode == noWork) {
|
||||
if (getMPPT_Mode() == noWork) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (g_otherParameter.batteryState) {
|
||||
if (getBatteryState()) {
|
||||
BatteryChargControl();
|
||||
} else {
|
||||
noBatteryChargControl();
|
||||
|
|
|
@ -1,12 +1,14 @@
|
|||
|
||||
#include "start.h"
|
||||
#include "inFlash.h"
|
||||
#include "TimeSliceOffset.h"
|
||||
|
||||
|
||||
void start(void)
|
||||
{
|
||||
config_info_start();
|
||||
|
||||
|
||||
|
||||
|
||||
TimeSliceOffset_Start();
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,9 @@
|
|||
|
||||
#include "task.h"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
|
||||
#ifndef BL_PARAMETER_H_
|
||||
#define BL_PARAMETER_H_
|
||||
|
||||
|
||||
|
||||
void Init(void);
|
||||
|
||||
|
||||
|
||||
#endif
|
|
@ -0,0 +1,15 @@
|
|||
|
||||
#ifndef BL_ABNORMAL_MANAGE_H_
|
||||
#define BL_ABNORMAL_MANAGE_H_
|
||||
|
||||
#include "FM_TIM.h"
|
||||
|
||||
|
||||
|
||||
|
||||
void checkAbnormal(void);
|
||||
|
||||
|
||||
|
||||
|
||||
#endif
|
|
@ -2,10 +2,11 @@
|
|||
#define BL_CHARG_CONTROL_H_
|
||||
|
||||
#include "chargControlEnum.h"
|
||||
#include "FM_TIM.h"
|
||||
|
||||
void getCVData(void);
|
||||
void judgeYNBattery(void);
|
||||
int chargControlMode(void);
|
||||
void chargControlMode(void);
|
||||
void BatteryChargControl(void);
|
||||
void noBatteryChargControl(void);
|
||||
|
||||
|
|
|
@ -0,0 +1,110 @@
|
|||
|
||||
#ifndef BL_IN_FLASH_H_
|
||||
#define BL_IN_FLASH_H_
|
||||
|
||||
#include "flash.h"
|
||||
#include "stm32g431xx.h"
|
||||
|
||||
#pragma pack(push, 1)
|
||||
|
||||
/* 高字节在前,低字节在后 */
|
||||
typedef struct _recv_config_info{
|
||||
uint8_t start_Flag[2]; /* 开始标志 */
|
||||
/* SL */
|
||||
uint8_t address[7]; /* 地址 */
|
||||
uint8_t Access_Node_Type[2]; /* 接入节点类型 */
|
||||
uint8_t Communication_Methods[2]; /* 通信方式 */
|
||||
uint8_t gw485_Baud[4]; /* 串口波特率 */
|
||||
uint8_t bat485_Baud[4]; /* 串口波特率,为0代表bms不支持通信 */
|
||||
|
||||
/* HY */
|
||||
uint8_t hardwareID[6]; /* 硬件ID */
|
||||
uint8_t communicationID[4]; /* 通信ID */
|
||||
uint8_t protocolType; /* 协议类型; 0x01表示:汇源协议(波特率9600) 0x02表示:南瑞协议(波特率115200)*/
|
||||
|
||||
|
||||
// uint8_t CommunicationProtocolType; /* 0x00:SL
|
||||
// 0x01:HY*/
|
||||
uint8_t onlyPower; /* 是否只充当电源板:0x00:不是
|
||||
0x01:是*/
|
||||
|
||||
uint8_t ConstantVoltageV[2]; /* 高于该(电压 / 100)且电流大于FloatI * 100进行恒压充电 */
|
||||
uint8_t FloatI[2]; /* 高于该(电压 / 100)且电流低于FloatI * 100进行浮充充电 */
|
||||
uint8_t startSolarOpenCircuitV[2]; /* 高于该(电压 / 100)开始充电 */
|
||||
uint8_t stopSolarOpenCircuitV[2]; /* 太阳能板开路电压高于该电压停止充电 (V) */
|
||||
uint8_t constantVoltageChargeV[2]; /* 恒压充电时的输出电压 (V) */
|
||||
uint8_t FloatChargeV[2]; /* 浮充充电时的输出电压 (V) */
|
||||
uint8_t HighSideMosTemperature_stop[2]; /* 当上桥温度达到该值时,停止输出 (°C) */
|
||||
uint8_t HighSideMosTemperature_end[2]; /* 当上桥温度上升到该值时,降低功率运行 (°C) */
|
||||
uint8_t HighSideMosTemperature_start[2];/* 当上桥温度降低到该值时,按照正常情况输出 (°C) */
|
||||
|
||||
uint8_t checkSolarOpenCircuitVTime[2]; /* 启动任务中太阳能板开路电压检测间隔时间 (S) */
|
||||
uint8_t sensorEnableBroadcastTime[2]; /* 传感器运行再次注册的间隔 (S) */
|
||||
uint8_t outputAgainFlagTime[2]; /* 出现短路保护后延长该段时间再次检测是否短路,仍然短路则关闭输出 (S) */
|
||||
uint8_t excessiveLoadFlagTime[2]; /* 出现过载后,在该间隔时间中多次(2次)出现过载,则关闭输出 (S) */
|
||||
uint8_t eLAgainTime[2]; /* 出现过载过载保护后,在该间隔段时间后,再次尝试输出 (S) */
|
||||
uint8_t crc[2]; /* 校验 */
|
||||
uint8_t end_Flag; /* 结束标志 */
|
||||
}recv_config_info;
|
||||
#define RECV_CONFIG_INFO sizeof(recv_config_info)
|
||||
|
||||
typedef struct _config_info{
|
||||
/* SL */
|
||||
uint8_t address[7]; /* 地址 */
|
||||
uint16_t Access_Node_Type; /* 接入节点类型 */
|
||||
uint16_t Communication_Methods; /* 通信方式 */
|
||||
uint32_t gw485_Baud; /* 串口波特率,为0代表bms不支持通信 */
|
||||
uint32_t bat485_Baud; /* 串口波特率 */
|
||||
|
||||
/* HY */
|
||||
uint8_t hardwareID[6]; /* 硬件ID */
|
||||
uint8_t communicationID[4]; /* 通信ID */
|
||||
uint8_t protocolType; /* 协议类型; 0x01表示:汇源协议(波特率9600) 0x02表示:南瑞协议(波特率115200)*/
|
||||
|
||||
// uint8_t CommunicationProtocolType; /* 0x00:SL
|
||||
// 0x01:HY*/
|
||||
uint8_t onlyPower; /* 是否只充当电源板:0x00:不是
|
||||
0x01:是*/
|
||||
|
||||
float constantVoltageV; /* 电压高于ConstantVoltageV且电流大于FloatI + 0.1)进行恒压充电 */
|
||||
float floatI; /* 电压高于ConstantVoltageV且电流低于FloatI进行浮充充电 */
|
||||
float startSolarOpenCircuitV; /* 太阳能板开路电压高于该电压开始充电 */
|
||||
float stopSolarOpenCircuitV; /* 太阳能板开路电压高于该电压 停止充电 */
|
||||
float constantVoltageChargeV; /* 恒压充电时的输出电压 */
|
||||
float FloatChargeV; /* 浮充电压 */
|
||||
float HighSideMosTemperature_stop; /* 当上桥温度达到该值时,停止输出 */
|
||||
float HighSideMosTemperature_end; /* 当上桥温度上升到该值时,降低功率运行 */
|
||||
float HighSideMosTemperature_start; /* 当上桥温度降低到该值时,按照正常情况输出 */
|
||||
|
||||
uint16_t checkSolarOpenCircuitVTime; /* 启动任务中太阳能板开路电压检测时间 */
|
||||
uint16_t sensorEnableBroadcastTime; /* 传感器运行再次注册的间隔 */
|
||||
uint16_t outputAgainFlagTime; /* 出现短路保护后延长该段时间再次检测是否短路,仍然短路则关闭输出 */
|
||||
uint16_t excessiveLoadFlagTime; /* 出现过载后,在该段时间中再次出现过载,则关闭输出 */
|
||||
uint16_t eLAgainTime; /* 出现过载过载保护后,该段时间后,再次尝试输出 */
|
||||
|
||||
uint16_t crc; /* 校验 */
|
||||
}config_info;
|
||||
|
||||
#define CONFIG_INFO_SIZE (sizeof(config_info))
|
||||
#pragma pack(pop)
|
||||
|
||||
#define CONFIG_SAVE_addr (0)
|
||||
#define CONFIG_SAVE_ADDR_BEGIN (CONFIG_INFO_SIZE)
|
||||
#define CONFIG_SAVE_ADDR_END (CONFIG_INFO_SIZE + CONFIG_INFO_SIZE)
|
||||
#define LoopImpedance_SAVE_addr (CONFIG_INFO_SIZE + CONFIG_INFO_SIZE + 10)
|
||||
#define totalElectricityConsumption_SAVE_addr (CONFIG_INFO_SIZE + CONFIG_INFO_SIZE + 20)
|
||||
#define totalChargCapacity_SAVE_addr (CONFIG_INFO_SIZE + CONFIG_INFO_SIZE + 30)
|
||||
|
||||
void save_config_info(config_info *save_config_info);
|
||||
void read_config_info(config_info *output_config_info);
|
||||
void config_info_start(void);
|
||||
// void read_and_process_config_data(void);
|
||||
|
||||
void saveLoopImpedance(float *loopImpedance);
|
||||
void readLoopImpedance(float *loopImpedance);
|
||||
void savetotalElectricityConsumption(float *totalElectricityConsumption);
|
||||
void readtotalElectricityConsumption(float *totalElectricityConsumption);
|
||||
void savetotalChargCapacity(float *totalChargCapacity);
|
||||
void readtotalChargCapacity(float *totalChargCapacity);
|
||||
|
||||
#endif
|
|
@ -1,12 +1,12 @@
|
|||
|
||||
#ifndef BL_PARAMETER_H_
|
||||
#define BL_PARAMETER_H_
|
||||
|
||||
#include "main.h"
|
||||
#include "comm_types.h"
|
||||
|
||||
#define softVer "SV01_24101501"
|
||||
|
||||
#pragma pack(push,1)
|
||||
// #pragma pack(push,1)
|
||||
|
||||
/* 主要有配置文件读取出来的数据 */
|
||||
typedef struct _config_parameter{
|
||||
|
@ -30,10 +30,10 @@ typedef struct _config_parameter{
|
|||
uint32_t collectOpenCircuitVoltageTime; /* 开路电压采集时间间隔 */
|
||||
|
||||
/* SL */
|
||||
uint8_t address[7]; /* 地址 */
|
||||
uint16_t Access_Node_Type; /* 接入节点类型 */
|
||||
uint16_t Communication_Methods; /* 通信方式 */
|
||||
uint16_t Registration_Status; /* 注册状态 */
|
||||
uint8_t address[7]; /* 地址 */
|
||||
uint8_t startFlagSL[2]; /* 起始标志 */
|
||||
uint8_t endFlagSL; /* 结束标志 */
|
||||
|
||||
|
@ -51,7 +51,6 @@ typedef struct _config_parameter{
|
|||
uint32_t bat485_Baud; /* 串口波特率,为0代表bms不支持通信 */
|
||||
} config_parameter;
|
||||
extern config_parameter g_cfgParameter;
|
||||
|
||||
typedef struct _otherParameter{
|
||||
float Battery_Voltage; /* 电池电压 (V) */
|
||||
float Output_Voltage; /* 输出电压 */
|
||||
|
@ -62,27 +61,57 @@ typedef struct _otherParameter{
|
|||
float HighSideMos_Temperature; /* 高端mos的温度 (°C) */
|
||||
float Solar_In_Circuit_Voltage; /* 太阳能板输入电压 (V) */
|
||||
|
||||
float Charg_BatteryCurrent; /* 电池充电电流(流向电池) (A) */
|
||||
float totalElectricityConsumption; /* 总电量消耗(W*H) */
|
||||
float totalChargCapacity; /* 总充电电量(W*H) */
|
||||
float SOC; /* 剩余电量 */
|
||||
|
||||
uint16_t chargMos_State; /* 充电开关状态 */
|
||||
uint16_t DischargMos_State; /* 放电mos的状态 */
|
||||
uint16_t MPPT_Mode; /* 工作模式 */
|
||||
uint16_t MPPT_Mode; /* 工作模式 */
|
||||
|
||||
uint8_t versionInformation[13]; /* 软件版本信息 */
|
||||
uint8_t versionInformation[13]; /* 软件版本信息 */
|
||||
|
||||
uint8_t batteryState; /* 有无电池(估计) */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
float dutyRatio; /* 占空比 */
|
||||
}otherParameter;
|
||||
extern otherParameter g_otherParameter;
|
||||
|
||||
// #pragma pack(pop)
|
||||
|
||||
|
||||
BOOL getBatteryState(void);
|
||||
void setBatteryState(BOOL state);
|
||||
float getDutyRatio(void);
|
||||
void setDutyRatio(float DutyRatio);
|
||||
void setDutyRatioToZero(void);
|
||||
|
||||
float getBatteryVoltage(void);
|
||||
void setBatteryVoltage(void);
|
||||
float getOutputVoltage(void);
|
||||
void setOutputVoltage(void);
|
||||
float getChargCurrent(void);
|
||||
void setChargCurrent(void);
|
||||
float getDischargCurrent(void);
|
||||
void setDischargCurrent(void);
|
||||
float getInputVoltage(void);
|
||||
void setInputVoltage(void);
|
||||
float getSolarOpenCircuitVoltage(void);
|
||||
void setSolarOpenCircuitVoltage(void);
|
||||
float getHighSideMosTemperature(void);
|
||||
void setHighSideMosTemperature(void);
|
||||
float getSolarInCircuitVoltage(void);
|
||||
void setSolarInCircuitVoltage(void);
|
||||
float getTotalElectricityConsumption(void);
|
||||
void setTotalElectricityConsumption(void);
|
||||
void totalElectricityConsumptionInt(float totalPower);
|
||||
float getTotalChargCapacity(void);
|
||||
void setTotalChargCapacity(void);
|
||||
void totalChargCapacityInt(float totalPower);
|
||||
float getSOC(void);
|
||||
void setSOC(void);
|
||||
int getMPPT_Mode(void);
|
||||
void setMPPT_Mode(int MPPT_Mode);
|
||||
float getChargBatteryCurrent(void);
|
||||
BOOL getChargMosState(void);
|
||||
void setChargMosState(BOOL state);
|
||||
BOOL getDischargMosState(void);
|
||||
uint8_t *getVersionInformation(void);
|
||||
|
||||
|
||||
|
||||
#endif
|
|
@ -0,0 +1,21 @@
|
|||
|
||||
#include "Init.h"
|
||||
#include "capture.h"
|
||||
#include "FM_GPIO.h"
|
||||
#include "inFlash.h"
|
||||
#include "parameter.h"
|
||||
#include "FM_GPIO.h"
|
||||
#include "FM_TIM.h"
|
||||
|
||||
void Init(void)
|
||||
{
|
||||
config_info_start();
|
||||
ADC_Capture_Init();
|
||||
proportionalInt(getMPPT_Mode());
|
||||
|
||||
FM_GPIO_Init();
|
||||
tim_Init();
|
||||
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
|
||||
#include "abnormalManage.h"
|
||||
#include "parameter.h"
|
||||
#include "capture.h"
|
||||
|
||||
|
||||
|
||||
|
||||
void checkAbnormal(void)
|
||||
{
|
||||
/* 滤波 */
|
||||
adcCaptureFir();
|
||||
|
||||
/* 转换 */
|
||||
setChargCurrent();
|
||||
setDischargCurrent();
|
||||
setOutputVoltage();
|
||||
setSolarInCircuitVoltage();
|
||||
|
||||
/* 判断异常状态 */
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -4,10 +4,10 @@
|
|||
#include "comm_types.h"
|
||||
|
||||
static void stopChargWork(void);
|
||||
static int stopChargConditions(void);
|
||||
static int floatChargConditions(void);
|
||||
static int mpptChargConditions(void);
|
||||
static int constantVChargConditions(void);
|
||||
static BOOL stopChargConditions(void);
|
||||
static BOOL floatChargConditions(void);
|
||||
static BOOL mpptChargConditions(void);
|
||||
static BOOL constantVChargConditions(void);
|
||||
static void mpptCharge(void);
|
||||
static void constantVoltageCharge(void);
|
||||
static void floatCharge(void);
|
||||
|
@ -79,26 +79,26 @@ BOOL constantVChargConditions(void)
|
|||
/**
|
||||
* @brief 判断充电控制的模式
|
||||
* @param
|
||||
* @retval 返回充电控制器的模式
|
||||
* @retval
|
||||
*
|
||||
*/
|
||||
int chargControlMode(void)
|
||||
void chargControlMode(void)
|
||||
{
|
||||
if (stopChargConditions()) {
|
||||
stopChargWork();
|
||||
return noWork;
|
||||
setMPPT_Mode(noWork);
|
||||
}
|
||||
|
||||
if (floatChargConditions()) {
|
||||
return floatCharg;
|
||||
setMPPT_Mode(floatCharg);
|
||||
}
|
||||
|
||||
if (mpptChargConditions()) {
|
||||
return MPPT;
|
||||
setMPPT_Mode(MPPT);
|
||||
}
|
||||
|
||||
if (constantVChargConditions()) {
|
||||
return constantVoltage;
|
||||
setMPPT_Mode(constantVoltage);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -177,21 +177,22 @@ void constantVoltageCharge(void)
|
|||
*/
|
||||
void BatteryChargControl(void)
|
||||
{
|
||||
switch(g_otherParameter.MPPT_Mode) {
|
||||
switch(getMPPT_Mode()) {
|
||||
|
||||
case CONSTANTCURRENT:
|
||||
case MPPT:
|
||||
mpptCharge();
|
||||
break;
|
||||
|
||||
case CONSTANTVOLTAGE:
|
||||
case constantVoltage:
|
||||
constantVoltageCharge();
|
||||
break;
|
||||
|
||||
case FLOAT:
|
||||
case floatCharg:
|
||||
floatCharge();
|
||||
break;
|
||||
|
||||
default:
|
||||
setMPPT_Mode(noWork);
|
||||
stopChargWork();
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -5,9 +5,6 @@
|
|||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void GW485_comm(void)
|
||||
{
|
||||
|
||||
|
|
|
@ -0,0 +1,607 @@
|
|||
|
||||
#include "inFlash.h"
|
||||
#include "parameter.h"
|
||||
#include "pDebug.h"
|
||||
|
||||
// static uint8_t config_buff[200];
|
||||
// static uint8_t config_buff_pos = 0;
|
||||
|
||||
/**
|
||||
* @brief 校验算法, modebus
|
||||
* @param
|
||||
* @retval
|
||||
*/
|
||||
static uint16_t configCheckFunc(uint8_t *arr_buff, uint8_t len)
|
||||
{
|
||||
uint16_t crc = 0xFFFF;
|
||||
uint16_t i, j;
|
||||
for (j = 0; j < len; ++j) {
|
||||
crc = crc ^ (*arr_buff++);
|
||||
for (i = 0; i < 8; ++i) {
|
||||
if ((crc&0x0001) > 0) {
|
||||
crc = crc >> 1;
|
||||
crc = crc ^ 0xa001;
|
||||
}
|
||||
else {
|
||||
crc = crc >> 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
return crc;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 保存配置信息
|
||||
* @param save_config_info 需要保存的配置信息
|
||||
* @retval None
|
||||
*/
|
||||
void save_config_info(config_info *save_config_info)
|
||||
{
|
||||
write_Flash((uint8_t *)save_config_info, CONFIG_SAVE_ADDR_BEGIN, CONFIG_INFO_SIZE);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 保存配置信息到备份区
|
||||
* @param save_config_info 需要保存的配置信息
|
||||
* @retval None
|
||||
*/
|
||||
static void save_backups_config_info(config_info *save_config_info)
|
||||
{
|
||||
write_Flash((uint8_t *)save_config_info, CONFIG_SAVE_addr, CONFIG_INFO_SIZE);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 读取配置信息
|
||||
* @param read_config_info 读取配置信息并保存在output_config_info中
|
||||
* @retval None
|
||||
*/
|
||||
void read_config_info(config_info *output_config_info)
|
||||
{
|
||||
read_Flash((uint8_t *)output_config_info, CONFIG_SAVE_ADDR_BEGIN, CONFIG_INFO_SIZE);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 读取备份的配置信息
|
||||
* @param read_config_info 读取配置信息并保存在output_config_info中
|
||||
* @retval None
|
||||
*/
|
||||
static void read_backups_config_info(config_info *output_config_info)
|
||||
{
|
||||
read_Flash((uint8_t *)output_config_info, CONFIG_SAVE_addr, CONFIG_INFO_SIZE);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 检测flash中是否有配置文件或者文件是否有损坏,若两处flash中都损坏则使用默认文件
|
||||
* @param config_info 读取的配置信息
|
||||
* @retval None
|
||||
*
|
||||
*/
|
||||
static void readFlashContent(config_info *config_info)
|
||||
{
|
||||
read_config_info(config_info);
|
||||
|
||||
/* 配置文件正确就返回 */
|
||||
if (config_info->crc == configCheckFunc((uint8_t *)config_info, CONFIG_INFO_SIZE - 2)) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* 更深处的配置文件正确就返回 */
|
||||
read_backups_config_info(config_info);
|
||||
if (config_info->crc == configCheckFunc((uint8_t *)config_info, CONFIG_INFO_SIZE - 2)) {
|
||||
save_config_info(config_info);
|
||||
return;
|
||||
}
|
||||
|
||||
/* 配置文件错误使用默认配置 */
|
||||
config_info->address[0] = 0x11;
|
||||
config_info->address[1] = 0x11;
|
||||
config_info->address[2] = 0x11;
|
||||
config_info->address[3] = 0x11;
|
||||
config_info->address[4] = 0x11;
|
||||
config_info->address[5] = 0x11;
|
||||
config_info->address[6] = 0x11;
|
||||
config_info->Access_Node_Type = 0x01;
|
||||
config_info->Communication_Methods = 0x02;
|
||||
config_info->gw485_Baud = 9600;
|
||||
config_info->bat485_Baud = 115200;
|
||||
|
||||
config_info->hardwareID[0] = 0x48;
|
||||
config_info->hardwareID[1] = 0x59;
|
||||
config_info->hardwareID[2] = 0x30;
|
||||
config_info->hardwareID[3] = 0x30;
|
||||
config_info->hardwareID[4] = 0x30;
|
||||
config_info->hardwareID[5] = 0x31;
|
||||
config_info->communicationID[0] = 0x00;
|
||||
config_info->communicationID[1] = 0x00;
|
||||
config_info->communicationID[2] = 0x00;
|
||||
config_info->communicationID[3] = 0x01;
|
||||
config_info->protocolType = 0x01;
|
||||
|
||||
// config_info->CommunicationProtocolType = 0x00;
|
||||
config_info->onlyPower = 0x01;
|
||||
|
||||
config_info->constantVoltageV = 14;
|
||||
config_info->floatI = 0.02;
|
||||
config_info->startSolarOpenCircuitV = 17;
|
||||
config_info->stopSolarOpenCircuitV = 15;
|
||||
config_info->constantVoltageChargeV = 14.4;
|
||||
config_info->FloatChargeV = 14;
|
||||
config_info->HighSideMosTemperature_stop = 100;
|
||||
config_info->HighSideMosTemperature_end = 90;
|
||||
config_info->HighSideMosTemperature_start = 50;
|
||||
|
||||
config_info->checkSolarOpenCircuitVTime = 10;
|
||||
config_info->sensorEnableBroadcastTime = 20;
|
||||
config_info->outputAgainFlagTime = 10;
|
||||
config_info->excessiveLoadFlagTime = 60;
|
||||
config_info->eLAgainTime = 1800;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 通过配置文件初始化系统参数
|
||||
* @param None
|
||||
* @retval None
|
||||
*
|
||||
*/
|
||||
void config_info_start(void)
|
||||
{
|
||||
Flash_Init();
|
||||
|
||||
config_info temp_configInfo;
|
||||
readFlashContent(&temp_configInfo);
|
||||
|
||||
g_cfgParameter.constantVoltageV = temp_configInfo.constantVoltageV;
|
||||
g_cfgParameter.floatI = temp_configInfo.floatI;
|
||||
g_cfgParameter.startSolarOpenCircuitV = temp_configInfo.startSolarOpenCircuitV;
|
||||
g_cfgParameter.stopSolarOpenCircuitV = temp_configInfo.stopSolarOpenCircuitV;
|
||||
g_cfgParameter.constantVoltageChargeV = temp_configInfo.constantVoltageChargeV;
|
||||
g_cfgParameter.FloatV = temp_configInfo.FloatChargeV;
|
||||
g_cfgParameter.HighSideMosTemperature_stop = temp_configInfo.HighSideMosTemperature_stop;
|
||||
g_cfgParameter.HighSideMosTemperature_end = temp_configInfo.HighSideMosTemperature_end;
|
||||
g_cfgParameter.HighSideMosTemperature_start = temp_configInfo.HighSideMosTemperature_start;
|
||||
g_cfgParameter.sensorEnableBroadcastTime = temp_configInfo.sensorEnableBroadcastTime;
|
||||
g_cfgParameter.checkSolarOpenCircuitVTime = temp_configInfo.checkSolarOpenCircuitVTime;
|
||||
g_cfgParameter.outputAgainFlagTime = temp_configInfo.outputAgainFlagTime;
|
||||
g_cfgParameter.excessiveLoadFlagTime = temp_configInfo.excessiveLoadFlagTime;
|
||||
g_cfgParameter.eLAgainTime = temp_configInfo.eLAgainTime;
|
||||
g_cfgParameter.collectOpenCircuitVoltageTime= 3600;
|
||||
g_cfgParameter.address[0] = temp_configInfo.address[0];
|
||||
g_cfgParameter.address[1] = temp_configInfo.address[1];
|
||||
g_cfgParameter.address[2] = temp_configInfo.address[2];
|
||||
g_cfgParameter.address[3] = temp_configInfo.address[3];
|
||||
g_cfgParameter.address[4] = temp_configInfo.address[4];
|
||||
g_cfgParameter.address[5] = temp_configInfo.address[5];
|
||||
g_cfgParameter.address[6] = temp_configInfo.address[6];
|
||||
g_cfgParameter.Access_Node_Type = temp_configInfo.Access_Node_Type;
|
||||
g_cfgParameter.Communication_Methods = temp_configInfo.Communication_Methods;
|
||||
g_cfgParameter.hardwareID[0] = temp_configInfo.hardwareID[0];
|
||||
g_cfgParameter.hardwareID[1] = temp_configInfo.hardwareID[1];
|
||||
g_cfgParameter.hardwareID[2] = temp_configInfo.hardwareID[2];
|
||||
g_cfgParameter.hardwareID[3] = temp_configInfo.hardwareID[3];
|
||||
g_cfgParameter.hardwareID[4] = temp_configInfo.hardwareID[4];
|
||||
g_cfgParameter.hardwareID[5] = temp_configInfo.hardwareID[5];
|
||||
g_cfgParameter.communicationID[0] = temp_configInfo.communicationID[0];
|
||||
g_cfgParameter.communicationID[1] = temp_configInfo.communicationID[1];
|
||||
g_cfgParameter.communicationID[2] = temp_configInfo.communicationID[2];
|
||||
g_cfgParameter.communicationID[3] = temp_configInfo.communicationID[3];
|
||||
g_cfgParameter.protocolType = temp_configInfo.protocolType;
|
||||
// g_cfgParameter.CommunicationProtocolType = temp_configInfo.CommunicationProtocolType;
|
||||
g_cfgParameter.onlyPower = temp_configInfo.onlyPower;
|
||||
|
||||
g_cfgParameter.startFlagSL[0] = 'S';
|
||||
g_cfgParameter.startFlagSL[1] = 'L';
|
||||
g_cfgParameter.endFlagSL = 0x16;
|
||||
g_cfgParameter.startFlagHY = 0x68;
|
||||
g_cfgParameter.endFlagHY = 0x16;
|
||||
|
||||
// if (g_cfgParameter.CommunicationProtocolType == 0x00) {
|
||||
// g_cfgParameter.gw485_Baud = temp_configInfo.gw485_Baud;
|
||||
// g_cfgParameter.bat485_Baud = temp_configInfo.bat485_Baud;
|
||||
// } else if (g_cfgParameter.CommunicationProtocolType == 0x01) {
|
||||
// g_cfgParameter.bat485_Baud = temp_configInfo.bat485_Baud;
|
||||
// if (g_cfgParameter.protocolType == 0x01) {
|
||||
// g_cfgParameter.gw485_Baud = 9600;
|
||||
// } else if (g_cfgParameter.protocolType == 0x02) {
|
||||
// g_cfgParameter.gw485_Baud = 115200;
|
||||
// }
|
||||
// }
|
||||
g_cfgParameter.gw485_Baud = 9600;
|
||||
g_cfgParameter.gw485_Baud = 115200;
|
||||
|
||||
float fTemp;
|
||||
readLoopImpedance(&fTemp);
|
||||
/* 读取的回路阻抗偏差过大则不使用 */
|
||||
if (fTemp > (float)0.005 && fTemp < (float)1) {
|
||||
g_cfgParameter.loopImpedance = fTemp;
|
||||
}
|
||||
else {
|
||||
g_cfgParameter.loopImpedance = 0;
|
||||
saveLoopImpedance(&g_cfgParameter.loopImpedance);
|
||||
}
|
||||
readtotalElectricityConsumption(&fTemp);
|
||||
totalElectricityConsumptionInt(fTemp);
|
||||
readtotalChargCapacity(&fTemp);
|
||||
totalChargCapacityInt(fTemp);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 判断接收到的配置文件数据是否正确,正确的话存入flash中
|
||||
* @param None
|
||||
* @retval None
|
||||
*
|
||||
*/
|
||||
// #define enlargeScale 100
|
||||
// BOOL read_and_process_config_data(uint8_t *config_buff[])
|
||||
// {
|
||||
// recv_config_info *pack = (recv_config_info *)*config_buff;
|
||||
// config_info save_configInfo;
|
||||
// while (config_buff_pos >= RECV_CONFIG_INFO) {
|
||||
// /* 判断起始标志是否正确 */
|
||||
// if (pack->start_Flag[0] != g_cfgParameter.startFlagSL[0]
|
||||
// || pack->start_Flag[1] != g_cfgParameter.startFlagSL[1]) {
|
||||
// // debug(" start_Flag : 0x%x, 0x%x \n", pack->start_Flag[0], pack->start_Flag[1]);
|
||||
// goto err;
|
||||
// }
|
||||
|
||||
// /* 判断接入节点类型是否正确 */
|
||||
// save_configInfo.Access_Node_Type = (uint16_t)pack->Access_Node_Type[0] << 8
|
||||
// | (uint16_t)pack->Access_Node_Type[1];
|
||||
// // debug(" Access_Node_Type : 0x%x \n", save_configInfo.Access_Node_Type);
|
||||
// if (save_configInfo.Access_Node_Type != POWERBOX) {
|
||||
// goto err;
|
||||
// }
|
||||
|
||||
// /* 判断通信方式是否正确 */
|
||||
// save_configInfo.Communication_Methods = (uint16_t)pack->Communication_Methods[0] << 8
|
||||
// | (uint16_t)pack->Communication_Methods[1];
|
||||
// // debug(" Communication_Methods : 0x%x \n", save_configInfo.Communication_Methods);
|
||||
// // if (temp_u16 != RS485 || temp_u16 != RJ45) {
|
||||
// if (save_configInfo.Communication_Methods != RS485) {
|
||||
// goto err;
|
||||
// }
|
||||
|
||||
// /* 判断波特率是否正确 */
|
||||
// save_configInfo.gw485_Baud = (uint32_t)pack->gw485_Baud[0] << 24
|
||||
// | (uint32_t)pack->gw485_Baud[1] << 16
|
||||
// | (uint32_t)pack->gw485_Baud[2] << 8
|
||||
// | (uint32_t)pack->gw485_Baud[3];
|
||||
// // debug(" gw485_Baud : 0x%x, %d \n", save_configInfo.gw485_Baud, save_configInfo.gw485_Baud);
|
||||
// if (save_configInfo.gw485_Baud != 9600 && save_configInfo.gw485_Baud != 115200) {
|
||||
// // if (save_configInfo.gw485_Baud != 0x2580 || save_configInfo.gw485_Baud != 115200) {
|
||||
// // debug(" error : %d\n", save_configInfo.gw485_Baud);
|
||||
// goto err;
|
||||
// }
|
||||
|
||||
// save_configInfo.bat485_Baud = (uint32_t)pack->bat485_Baud[0] << 24
|
||||
// | (uint32_t)pack->bat485_Baud[1] << 16
|
||||
// | (uint32_t)pack->bat485_Baud[2] << 8
|
||||
// | (uint32_t)pack->bat485_Baud[3];
|
||||
// // debug(" bat485_Baud : 0x%x, %d \n", save_configInfo.bat485_Baud, save_configInfo.bat485_Baud);
|
||||
// if (save_configInfo.bat485_Baud != 9600 && save_configInfo.bat485_Baud!= 115200 && save_configInfo.bat485_Baud!= 0) {
|
||||
// goto err;
|
||||
// }
|
||||
|
||||
// /* 判断协议类型是否正确 */
|
||||
// if (pack->protocolType != 0x01 && pack->protocolType != 0x02) {
|
||||
// goto err;
|
||||
// }
|
||||
// // debug(" protocolType : 0x%x \n", pack->protocolType);
|
||||
|
||||
/* 判断通信协议类型是否正确 */
|
||||
/*
|
||||
if (pack->CommunicationProtocolType != 0x00 && pack->CommunicationProtocolType != 0x01) {
|
||||
goto err;
|
||||
}
|
||||
// debug(" CommunicationProtocolType : 0x%x \n", pack->CommunicationProtocolType);
|
||||
*/
|
||||
|
||||
// /* 判断电源盒类型是否正确 */
|
||||
// if (pack->onlyPower != 0x00 && pack->onlyPower != 0x01) {
|
||||
// goto err;
|
||||
// }
|
||||
// // debug(" onlyPower : 0x%x \n", pack->onlyPower);
|
||||
|
||||
// /* 判断恒压充电阈值是否正确 */
|
||||
// save_configInfo.constantVoltageV =
|
||||
// (float)(pack->ConstantVoltageV[0] << 8 | pack->ConstantVoltageV[1]) / enlargeScale;
|
||||
// // debug(" constantVoltageV : %f \n", save_configInfo.constantVoltageV);
|
||||
// if (save_configInfo.constantVoltageV > (float)14.4 || save_configInfo.constantVoltageV < (float)13.5) {
|
||||
// goto err;
|
||||
// }
|
||||
|
||||
// /* 判断浮充充电阈值是否正确 */
|
||||
// save_configInfo.floatI = (float)(pack->FloatI[0] << 8 | pack->FloatI[1]) / enlargeScale;
|
||||
// // debug(" floatI : %f \n", save_configInfo.floatI);
|
||||
// if (save_configInfo.floatI > (float)0.2 || save_configInfo.floatI < (float)0) {
|
||||
// goto err;
|
||||
// }
|
||||
|
||||
// /* 判断太阳能板开路启动电压是否正确 */
|
||||
// save_configInfo.startSolarOpenCircuitV =
|
||||
// (float)(pack->startSolarOpenCircuitV[0] << 8 | pack->startSolarOpenCircuitV[1]) / enlargeScale;
|
||||
// // debug(" startSolarOpenCircuitV : %f \n", save_configInfo.startSolarOpenCircuitV);
|
||||
// if (save_configInfo.startSolarOpenCircuitV > 24 || save_configInfo.startSolarOpenCircuitV < 14) {
|
||||
// goto err;
|
||||
// }
|
||||
|
||||
// /* 判断太阳能板关闭电压是否正确 */
|
||||
// save_configInfo.stopSolarOpenCircuitV =
|
||||
// (float)(pack->stopSolarOpenCircuitV[0] << 8 | pack->stopSolarOpenCircuitV[1]) / enlargeScale;
|
||||
// // debug(" stopSolarOpenCircuitV : %f \n", save_configInfo.stopSolarOpenCircuitV);
|
||||
// if (save_configInfo.stopSolarOpenCircuitV > 17 || save_configInfo.stopSolarOpenCircuitV < 13) {
|
||||
// goto err;
|
||||
// }
|
||||
|
||||
// /* 判断恒压充电时的输出电压是否正确 */
|
||||
// save_configInfo.constantVoltageChargeV =
|
||||
// (float)(pack->constantVoltageChargeV[0] << 8 | pack->constantVoltageChargeV[1]) / enlargeScale;
|
||||
// // debug(" constantVoltageChargeV : %f \n", save_configInfo.constantVoltageChargeV);
|
||||
// if (save_configInfo.constantVoltageChargeV > (float)14.6 || save_configInfo.constantVoltageChargeV < (float)14) {
|
||||
// goto err;
|
||||
// }
|
||||
|
||||
// /* 判断浮充充电时的输出电压是否正确 */
|
||||
// save_configInfo.FloatChargeV =
|
||||
// (float)(pack->FloatChargeV[0] << 8 | pack->FloatChargeV[1]) / enlargeScale;
|
||||
// // debug(" FloatChargeV : %f \n", save_configInfo.FloatChargeV);
|
||||
// if (save_configInfo.FloatChargeV > (float)14.4 || save_configInfo.FloatChargeV < (float)13.8) {
|
||||
// goto err;
|
||||
// }
|
||||
|
||||
// /* 判断mos管停止工作温度是否正确 */
|
||||
// save_configInfo.HighSideMosTemperature_stop =
|
||||
// (float)(pack->HighSideMosTemperature_stop[0] << 8 | pack->HighSideMosTemperature_stop[1]) / enlargeScale;
|
||||
// // debug(" HighSideMosTemperature_stop : %f \n", save_configInfo.HighSideMosTemperature_stop);
|
||||
// if (save_configInfo.HighSideMosTemperature_stop < 60) {
|
||||
// goto err;
|
||||
// }
|
||||
|
||||
// /* 判断mos管降低工作功率工作温度是否正确 */
|
||||
// save_configInfo.HighSideMosTemperature_end =
|
||||
// (float)(pack->HighSideMosTemperature_end[0] << 8 | pack->HighSideMosTemperature_end[1]) / enlargeScale;
|
||||
// // debug(" HighSideMosTemperature_end : %f \n", save_configInfo.HighSideMosTemperature_end));
|
||||
// if (save_configInfo.HighSideMosTemperature_end < 50) {
|
||||
// goto err;
|
||||
// }
|
||||
|
||||
// /* 判断mos管完全恢复工作温度是否正确 */
|
||||
// save_configInfo.HighSideMosTemperature_start =
|
||||
// (float)(pack->HighSideMosTemperature_start[0] << 8 | pack->HighSideMosTemperature_start[1]) / enlargeScale;
|
||||
// // debug(" HighSideMosTemperature_start : %d \n", save_configInfo.HighSideMosTemperature_start);
|
||||
// if (save_configInfo.HighSideMosTemperature_start < 40) {
|
||||
// goto err;
|
||||
// }
|
||||
|
||||
// /* 判断启动任务中太阳能板开路电压检测间隔时间是否正确 */
|
||||
// save_configInfo.checkSolarOpenCircuitVTime =
|
||||
// pack->checkSolarOpenCircuitVTime[0] << 8 | pack->checkSolarOpenCircuitVTime[1];
|
||||
// // debug(" checkSolarOpenCircuitVTime : %d \n", save_configInfo.checkSolarOpenCircuitVTime);
|
||||
// if (save_configInfo.checkSolarOpenCircuitVTime > 1800 || save_configInfo.checkSolarOpenCircuitVTime < 5) {
|
||||
// goto err;
|
||||
// }
|
||||
|
||||
// /* 判断传感器运行再次注册的间隔是否正确 */
|
||||
// save_configInfo.sensorEnableBroadcastTime =
|
||||
// pack->sensorEnableBroadcastTime[0] << 8 | pack->sensorEnableBroadcastTime[1];
|
||||
// // debug(" sensorEnableBroadcastTime : %d \n", save_configInfo.sensorEnableBroadcastTime);
|
||||
// if (save_configInfo.sensorEnableBroadcastTime > 60 || save_configInfo.sensorEnableBroadcastTime < 10) {
|
||||
// goto err;
|
||||
// }
|
||||
|
||||
// /* 判断出现短路保护后延长该段时间再次检测是否短路,仍然短路则关闭输出的间隔是否正确 */
|
||||
// save_configInfo.outputAgainFlagTime =
|
||||
// pack->outputAgainFlagTime[0] << 8 | pack->outputAgainFlagTime[1];
|
||||
// // debug(" outputAgainFlagTime : %d \n", save_configInfo.outputAgainFlagTime);
|
||||
// if (save_configInfo.sensorEnableBroadcastTime > 30 || save_configInfo.sensorEnableBroadcastTime < 5) {
|
||||
// goto err;
|
||||
// }
|
||||
|
||||
// /* 判断出现过载后,在该间隔时间中多次(2次)出现过载,则关闭输出的间隔是否正确 */
|
||||
// save_configInfo.excessiveLoadFlagTime =
|
||||
// pack->excessiveLoadFlagTime[0] << 8 | pack->excessiveLoadFlagTime[1];
|
||||
// // debug(" excessiveLoadFlagTime : %d \n", save_configInfo.excessiveLoadFlagTime);
|
||||
// if (save_configInfo.excessiveLoadFlagTime > 90 || save_configInfo.excessiveLoadFlagTime < 30) {
|
||||
// goto err;
|
||||
// }
|
||||
|
||||
// /* 判断出现过载过载保护后,在该间隔段时间后,再次尝试输出的间隔是否正确 */
|
||||
// save_configInfo.eLAgainTime = pack->eLAgainTime[0] << 8 | pack->eLAgainTime[1];
|
||||
// // debug(" eLAgainTime : %d \n", save_configInfo.eLAgainTime);
|
||||
// if (save_configInfo.eLAgainTime > 3000 || save_configInfo.eLAgainTime < 1000) {
|
||||
// goto err;
|
||||
// }
|
||||
|
||||
// /* crc校验 */
|
||||
// save_configInfo.crc = pack->crc[0] << 8 | pack->crc[1];
|
||||
// // debug(" crc : %x%x \n", pack->crc[0], pack->crc[1]);
|
||||
// if (save_configInfo.crc != configCheckFunc(config_buff, RECV_CONFIG_INFO - 3)) {
|
||||
// // debug(" configCheckFunc : %x \n", configCheckFunc(config_buff, RECV_CONFIG_INFO));
|
||||
// goto err;
|
||||
// }
|
||||
|
||||
|
||||
// /* 结束标志 */
|
||||
// // debug(" end_Flag : %x \n", pack->end_Flag);
|
||||
// if (pack->end_Flag != 0x16) {
|
||||
// goto err;
|
||||
// }
|
||||
|
||||
// // debug("address : 0x %x %x %x %x %x %x %x\n", pack->address[0]
|
||||
// // , pack->address[1], pack->address[2], pack->address[3]
|
||||
// // , pack->address[4], pack->address[5], pack->address[6]);
|
||||
// config_info temp_configInfo;
|
||||
// read_config_info(&temp_configInfo);
|
||||
|
||||
// if (pack->address[0] != 0xFF
|
||||
// || pack->address[1] != 0xFF
|
||||
// || pack->address[2] != 0xFF
|
||||
// || pack->address[3] != 0xFF
|
||||
// || pack->address[4] != 0xFF
|
||||
// || pack->address[5] != 0xFF
|
||||
// || pack->address[6] != 0xFF) {
|
||||
// save_configInfo.address[0] = pack->address[0];
|
||||
// save_configInfo.address[1] = pack->address[1];
|
||||
// save_configInfo.address[2] = pack->address[2];
|
||||
// save_configInfo.address[3] = pack->address[3];
|
||||
// save_configInfo.address[4] = pack->address[4];
|
||||
// save_configInfo.address[5] = pack->address[5];
|
||||
// save_configInfo.address[6] = pack->address[6];
|
||||
// // debug("address : 0x %x %x %x %x %x %x %x\n", save_configInfo.address[0]
|
||||
// // , save_configInfo.address[1], save_configInfo.address[2], save_configInfo.address[3]
|
||||
// // , save_configInfo.address[4], save_configInfo.address[5], save_configInfo.address[6]);
|
||||
// } else {
|
||||
// save_configInfo.address[0] = temp_configInfo.address[0];
|
||||
// save_configInfo.address[1] = temp_configInfo.address[1];
|
||||
// save_configInfo.address[2] = temp_configInfo.address[2];
|
||||
// save_configInfo.address[3] = temp_configInfo.address[3];
|
||||
// save_configInfo.address[4] = temp_configInfo.address[4];
|
||||
// save_configInfo.address[5] = temp_configInfo.address[5];
|
||||
// save_configInfo.address[6] = temp_configInfo.address[6];
|
||||
// }
|
||||
|
||||
// if (pack->hardwareID[0] != 0xFF
|
||||
// || pack->hardwareID[1] != 0xFF
|
||||
// || pack->hardwareID[2] != 0xFF
|
||||
// || pack->hardwareID[3] != 0xFF
|
||||
// || pack->hardwareID[4] != 0xFF
|
||||
// || pack->hardwareID[5] != 0xFF) {
|
||||
// save_configInfo.hardwareID[0] = pack->hardwareID[0];
|
||||
// save_configInfo.hardwareID[1] = pack->hardwareID[1];
|
||||
// save_configInfo.hardwareID[2] = pack->hardwareID[2];
|
||||
// save_configInfo.hardwareID[3] = pack->hardwareID[3];
|
||||
// save_configInfo.hardwareID[4] = pack->hardwareID[4];
|
||||
// save_configInfo.hardwareID[5] = pack->hardwareID[5];
|
||||
// } else {
|
||||
// save_configInfo.hardwareID[0] = temp_configInfo.hardwareID[0];
|
||||
// save_configInfo.hardwareID[1] = temp_configInfo.hardwareID[1];
|
||||
// save_configInfo.hardwareID[2] = temp_configInfo.hardwareID[2];
|
||||
// save_configInfo.hardwareID[3] = temp_configInfo.hardwareID[3];
|
||||
// save_configInfo.hardwareID[4] = temp_configInfo.hardwareID[4];
|
||||
// save_configInfo.hardwareID[5] = temp_configInfo.hardwareID[5];
|
||||
// }
|
||||
|
||||
// if (pack->communicationID[0] != 0xFF
|
||||
// || pack->communicationID[1] != 0xFF
|
||||
// || pack->communicationID[2] != 0xFF
|
||||
// || pack->communicationID[3] != 0xFF) {
|
||||
// save_configInfo.communicationID[0] = pack->communicationID[0];
|
||||
// save_configInfo.communicationID[1] = pack->communicationID[1];
|
||||
// save_configInfo.communicationID[2] = pack->communicationID[2];
|
||||
// save_configInfo.communicationID[3] = pack->communicationID[3];
|
||||
// } else {
|
||||
// save_configInfo.communicationID[0] = temp_configInfo.communicationID[0];
|
||||
// save_configInfo.communicationID[1] = temp_configInfo.communicationID[1];
|
||||
// save_configInfo.communicationID[2] = temp_configInfo.communicationID[2];
|
||||
// save_configInfo.communicationID[3] = temp_configInfo.communicationID[3];
|
||||
// }
|
||||
|
||||
// save_configInfo.protocolType = pack->protocolType;
|
||||
|
||||
// save_configInfo.CommunicationProtocolType = pack->CommunicationProtocolType;
|
||||
|
||||
// save_configInfo.onlyPower = pack->onlyPower;
|
||||
|
||||
// save_configInfo.crc = configCheckFunc((uint8_t *)&save_configInfo, CONFIG_INFO_SIZE - 2);
|
||||
// save_backups_config_info(&save_configInfo);
|
||||
// save_config_info(&save_configInfo);
|
||||
|
||||
// memset(config_buff, 0, sizeof(config_buff));
|
||||
|
||||
// // /* 返回更改配置文件成功 */
|
||||
// // SL_Mppt_SOther_pack SUpdateProfile_pack = {0};
|
||||
|
||||
// // SUpdateProfile_pack.start_Flag[0] = g_otherParameter.startFlagSL[0];
|
||||
// // SUpdateProfile_pack.start_Flag[1] = g_otherParameter.startFlagSL[1];
|
||||
|
||||
// // SUpdateProfile_pack.address[0] = save_configInfo.address[0];
|
||||
// // SUpdateProfile_pack.address[1] = save_configInfo.address[1];
|
||||
// // SUpdateProfile_pack.address[2] = save_configInfo.address[2];
|
||||
// // SUpdateProfile_pack.address[3] = save_configInfo.address[3];
|
||||
// // SUpdateProfile_pack.address[4] = save_configInfo.address[4];
|
||||
// // SUpdateProfile_pack.address[5] = save_configInfo.address[5];
|
||||
// // SUpdateProfile_pack.address[6] = save_configInfo.address[6];
|
||||
|
||||
// // SUpdateProfile_pack.function_Code = SL_Function_Code_Update_Profile;
|
||||
|
||||
// // SUpdateProfile_pack.state = 0x01;
|
||||
|
||||
// // uint16_t crc = CheckFuncSL((uint8_t *)&SUpdateProfile_pack, SL_MPPT_SOTHER_PACK_SIZE - 3);
|
||||
// // SUpdateProfile_pack.check_Bit_H = crc >> 8;
|
||||
// // SUpdateProfile_pack.check_Bit_L = crc;
|
||||
|
||||
// // SUpdateProfile_pack.end_Flag = g_otherParameter.endFlagSL;
|
||||
|
||||
// // while (1) {
|
||||
// // if (!Check_485_bus_busy(g_gw485_uart4_handle)) {
|
||||
// // uart_dev_write(g_gw485_uart4_handle, (uint8_t *)&SUpdateProfile_pack, SL_MPPT_SOTHER_PACK_SIZE);
|
||||
// // USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
|
||||
// // break;
|
||||
// // }
|
||||
// // Delay_Ms(randomDelay());
|
||||
// // }
|
||||
|
||||
// /* 复位 */
|
||||
// NVIC_SystemReset();
|
||||
|
||||
// return;
|
||||
|
||||
// err:
|
||||
// config_buff_pos--;
|
||||
// memcpy(config_buff, config_buff + 1, sizeof(config_buff) - 1);
|
||||
// }
|
||||
// }
|
||||
|
||||
/**
|
||||
* @brief 保存回路阻抗在flash中
|
||||
* @param
|
||||
*/
|
||||
void saveLoopImpedance(float *loopImpedance)
|
||||
{
|
||||
write_Flash((uint8_t *)loopImpedance, LoopImpedance_SAVE_addr, sizeof(float));
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 读取flash中的回路阻抗
|
||||
* @param
|
||||
*/
|
||||
void readLoopImpedance(float *loopImpedance)
|
||||
{
|
||||
read_Flash((uint8_t *)loopImpedance, LoopImpedance_SAVE_addr, sizeof(float));
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 保存放电量在flash中
|
||||
* @param
|
||||
*/
|
||||
void savetotalElectricityConsumption(float *totalElectricityConsumption)
|
||||
{
|
||||
write_Flash((uint8_t *)totalElectricityConsumption, totalElectricityConsumption_SAVE_addr, sizeof(float));
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 读取flash中的放电量
|
||||
* @param
|
||||
*/
|
||||
void readtotalElectricityConsumption(float *totalElectricityConsumption)
|
||||
{
|
||||
read_Flash((uint8_t *)totalElectricityConsumption, totalElectricityConsumption_SAVE_addr, sizeof(float));
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 保存充电量在flash中
|
||||
* @param
|
||||
*/
|
||||
void savetotalChargCapacity(float *totalChargCapacity)
|
||||
{
|
||||
write_Flash((uint8_t *)totalChargCapacity, totalChargCapacity_SAVE_addr, sizeof(float));
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 读取flash中的充电量
|
||||
* @param
|
||||
*/
|
||||
void readtotalChargCapacity(float *totalChargCapacity)
|
||||
{
|
||||
read_Flash((uint8_t *)totalChargCapacity, totalChargCapacity_SAVE_addr, sizeof(float));
|
||||
}
|
||||
|
|
@ -1,7 +1,408 @@
|
|||
|
||||
#include "parameter.h"
|
||||
#include "FM_TIM.h"
|
||||
#include "FM_GPIO.h"
|
||||
#include "capture.h"
|
||||
|
||||
|
||||
|
||||
|
||||
config_parameter g_cfgParameter = {0};
|
||||
otherParameter g_otherParameter = {0};
|
||||
static otherParameter g_otherParameter = {0};
|
||||
|
||||
static BOOL batteryState = FALSE; /* 有无电池(估计) */
|
||||
static float dutyRatio; /* 占空比 */
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @brief 获取电池状态
|
||||
* @param
|
||||
* @retval batteryState电池状态 FALSE:无
|
||||
* TRUE: 有
|
||||
*/
|
||||
BOOL getBatteryState(void)
|
||||
{
|
||||
return batteryState;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 设置电池状态
|
||||
* @param state 电池状态
|
||||
* @retval
|
||||
*
|
||||
*/
|
||||
void setBatteryState(BOOL state)
|
||||
{
|
||||
if (state != TRUE && state != FALSE) {
|
||||
return;
|
||||
}
|
||||
batteryState = state;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 获取占空比大小
|
||||
* @param
|
||||
* @retval dutyRatio 占空比
|
||||
*/
|
||||
float getDutyRatio(void)
|
||||
{
|
||||
return dutyRatio;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 设置占空比大小,在一个范围内,不能设置为0,1等
|
||||
* @param dutyRatio 占空比
|
||||
* @retval
|
||||
*/
|
||||
void setDutyRatio(float DutyRatio)
|
||||
{
|
||||
if (DutyRatio > 0.9f) {
|
||||
dutyRatio = 0.9f;
|
||||
}
|
||||
else if (DutyRatio < 0.05f) {
|
||||
dutyRatio = 0.05f;
|
||||
}
|
||||
else {
|
||||
dutyRatio = DutyRatio;
|
||||
}
|
||||
set_pwmDutyRatio(dutyRatio);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 设置占空比大小为0,同时关闭pwm下桥的输出
|
||||
* @param
|
||||
* @retval
|
||||
*/
|
||||
void setDutyRatioToZero(void)
|
||||
{
|
||||
EN_PWMOUT_Diseable();
|
||||
dutyRatio = 0;
|
||||
set_pwmDutyRatio(dutyRatio);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 得到电池电压
|
||||
* @param
|
||||
* @retval 电池电压
|
||||
*/
|
||||
float getBatteryVoltage(void)
|
||||
{
|
||||
return g_otherParameter.Battery_Voltage;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 设置电池电压
|
||||
* @param
|
||||
* @retval
|
||||
*/
|
||||
void setBatteryVoltage(void)
|
||||
{
|
||||
g_otherParameter.Battery_Voltage = g_otherParameter.Output_Voltage
|
||||
+ getChargBatteryCurrent() * g_cfgParameter.loopImpedance;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 得到输出电压
|
||||
* @param
|
||||
* @retval 输出电压
|
||||
*/
|
||||
float getOutputVoltage(void)
|
||||
{
|
||||
return g_otherParameter.Output_Voltage;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 设置输出电压
|
||||
* @param
|
||||
* @retval
|
||||
*/
|
||||
void setOutputVoltage(void)
|
||||
{
|
||||
g_otherParameter.Output_Voltage = get_PV_VOLT_OUT() ;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 得到充电电流
|
||||
* @param
|
||||
* @retval 充电电流
|
||||
*/
|
||||
float getChargCurrent(void)
|
||||
{
|
||||
return g_otherParameter.Charg_Current;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 设置充电电流
|
||||
* @param
|
||||
* @retval
|
||||
*/
|
||||
void setChargCurrent(void)
|
||||
{
|
||||
g_otherParameter.Charg_Current = get_CHG_CURR();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 得到放电电流
|
||||
* @param
|
||||
* @retval 放电电流
|
||||
*/
|
||||
float getDischargCurrent(void)
|
||||
{
|
||||
return g_otherParameter.Discharg_Current;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 设置放电电流
|
||||
* @param
|
||||
* @retval
|
||||
*/
|
||||
void setDischargCurrent(void)
|
||||
{
|
||||
g_otherParameter.Discharg_Current = get_DSG_CURR();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 得到系统输入电压
|
||||
* @param
|
||||
* @retval 系统输入电压
|
||||
*/
|
||||
float getInputVoltage(void)
|
||||
{
|
||||
return g_otherParameter.Input_Voltage;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 设置系统输入电压
|
||||
* @param
|
||||
* @retval
|
||||
*/
|
||||
void setInputVoltage(void)
|
||||
{
|
||||
g_otherParameter.Discharg_Current = get_PV_VOLT_IN1();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 返回太阳能开路电压(不具备实时性)
|
||||
* @param
|
||||
* @retval 太阳能开路电压
|
||||
*/
|
||||
float getSolarOpenCircuitVoltage(void)
|
||||
{
|
||||
return g_otherParameter.Solar_Open_Circuit_Voltage;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 设置太阳能开路电压(特定情况下才能测量)
|
||||
* @param
|
||||
* @retval
|
||||
*/
|
||||
void setSolarOpenCircuitVoltage(void)
|
||||
{
|
||||
g_otherParameter.Solar_Open_Circuit_Voltage = get_PV1_VOLT_IN();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 返回mos管的温度
|
||||
* @param
|
||||
* @retval mos管的温度
|
||||
*/
|
||||
float getHighSideMosTemperature(void)
|
||||
{
|
||||
return g_otherParameter.HighSideMos_Temperature;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 设置mos管温度
|
||||
* @param
|
||||
* @retval
|
||||
*/
|
||||
void setHighSideMosTemperature(void)
|
||||
{
|
||||
g_otherParameter.HighSideMos_Temperature = get_MOSFET_Temper();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 返回太阳能板输出电压
|
||||
* @param
|
||||
* @retval 太阳能板输出电压
|
||||
*/
|
||||
float getSolarInCircuitVoltage(void)
|
||||
{
|
||||
return g_otherParameter.Solar_In_Circuit_Voltage;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 设置太阳能板输出电压
|
||||
* @param
|
||||
* @retval
|
||||
*/
|
||||
void setSolarInCircuitVoltage(void)
|
||||
{
|
||||
g_otherParameter.Solar_In_Circuit_Voltage = get_PV1_VOLT_IN();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 得到总用电量
|
||||
* @param
|
||||
* @retval 总用电量
|
||||
*/
|
||||
float getTotalElectricityConsumption(void)
|
||||
{
|
||||
return g_otherParameter.totalElectricityConsumption;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 设置总用电量
|
||||
* @param
|
||||
* @retval
|
||||
*/
|
||||
void setTotalElectricityConsumption(void)
|
||||
{
|
||||
g_otherParameter.totalElectricityConsumption += g_otherParameter.Discharg_Current * g_otherParameter.Output_Voltage;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 初始化总用电量
|
||||
* @param totalPower 初始值
|
||||
* @retval
|
||||
*/
|
||||
void totalElectricityConsumptionInt(float totalPower)
|
||||
{
|
||||
g_otherParameter.totalElectricityConsumption = totalPower;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 得到总充电量
|
||||
* @param
|
||||
* @retval 总用电量
|
||||
*/
|
||||
float getTotalChargCapacity(void)
|
||||
{
|
||||
return g_otherParameter.totalChargCapacity;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 设置总充电量
|
||||
* @param
|
||||
* @retval
|
||||
*/
|
||||
void setTotalChargCapacity(void)
|
||||
{
|
||||
g_otherParameter.totalChargCapacity += g_otherParameter.Charg_Current * g_otherParameter.Output_Voltage;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 初始化总充电量
|
||||
* @param totalPower 初始值
|
||||
* @retval
|
||||
*/
|
||||
void totalChargCapacityInt(float totalPower)
|
||||
{
|
||||
g_otherParameter.totalChargCapacity = totalPower;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 得到电池电量
|
||||
* @param
|
||||
* @retval 电池电量
|
||||
*/
|
||||
float getSOC(void)
|
||||
{
|
||||
return g_otherParameter.SOC;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 设置电池电量
|
||||
* @param
|
||||
* @retval
|
||||
*/
|
||||
void setSOC(void)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 得到工作模式
|
||||
* @param
|
||||
* @retval 工作模式
|
||||
*/
|
||||
int getMPPT_Mode(void)
|
||||
{
|
||||
return g_otherParameter.MPPT_Mode;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 设置工作模式
|
||||
* @param
|
||||
* @retval
|
||||
*/
|
||||
void setMPPT_Mode(int MPPT_Mode)
|
||||
{
|
||||
g_otherParameter.MPPT_Mode = MPPT_Mode;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 得到流向电池的电流
|
||||
* @param
|
||||
* @retval 流向电池的电流
|
||||
*/
|
||||
float getChargBatteryCurrent(void)
|
||||
{
|
||||
return (g_otherParameter.Charg_Current - g_otherParameter.Discharg_Current);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 得到充电开关状态
|
||||
* @param
|
||||
* @retval 充电开关状态
|
||||
*/
|
||||
BOOL getChargMosState(void)
|
||||
{
|
||||
if (getDutyRatio() > 0 && getDutyRatio() < 1) {
|
||||
return TRUE;
|
||||
} else {
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 设置充电开关状态
|
||||
* @param state 开关状态,FALSE 关闭
|
||||
* @retval
|
||||
*/
|
||||
void setChargMosState(BOOL state)
|
||||
{
|
||||
if (state == FALSE) {
|
||||
/* 关闭充电 */
|
||||
|
||||
} else if (state == TRUE) {
|
||||
/* 打开充电 */
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 得到放电状态
|
||||
* @param
|
||||
* @retval state 状态,FALSE 关闭
|
||||
*/
|
||||
BOOL getDischargMosState(void)
|
||||
{
|
||||
if (g_cfgParameter.onlyPower) {
|
||||
return readOnlyPowerOutputState();
|
||||
} else {
|
||||
return readOutputState();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 得到软件版本号
|
||||
* @param
|
||||
* @retval softVer 软件版本号
|
||||
*/
|
||||
uint8_t *getVersionInformation(void)
|
||||
{
|
||||
return softVer;
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,29 @@
|
|||
#ifndef FM_GPIO_H_
|
||||
#define FM_GPIO_H_
|
||||
|
||||
#include "HD_GPIO.h"
|
||||
|
||||
void FM_GPIO_Init(void);
|
||||
|
||||
void POW_FF_PCON_Open(void);
|
||||
void POW_FF_PCON_Close(void);
|
||||
|
||||
void POW_OUT_PCON_Open(void);
|
||||
void POW_OUT_PCON_Close(void);
|
||||
|
||||
void RUN_LEN_Open(void);
|
||||
void RUN_LEN_Close(void);
|
||||
|
||||
void FFMOS_CON_Open(void);
|
||||
void FFMOS_CON_Close(void);
|
||||
|
||||
void EN_PWMOUT_Eable(void);
|
||||
void EN_PWMOUT_Diseable(void);
|
||||
|
||||
BOOL readOnlyPowerOutputState(void);
|
||||
BOOL readOutputState(void);
|
||||
|
||||
// extern void WORK_VOLT_Interrupt(void);
|
||||
// extern void DSG_PROT_Interrupt(void);
|
||||
|
||||
#endif
|
|
@ -0,0 +1,15 @@
|
|||
|
||||
#ifndef FM_PWM_CONTORL_H_
|
||||
#define FM_PWM_CONTORL_H_
|
||||
|
||||
#include "HD_TIM.h"
|
||||
|
||||
void tim_Init(void);
|
||||
void pwm_Stop(void);
|
||||
void set_pwmDutyRatio(float DutyRatio);
|
||||
void set_pwmPulse(uint32_t Pulse);
|
||||
|
||||
extern void chargControl(void);
|
||||
extern void checkAbnormal(void);
|
||||
|
||||
#endif
|
|
@ -0,0 +1,33 @@
|
|||
|
||||
#ifndef FM_CAPTURE_H_
|
||||
#define FM_CAPTURE_H_
|
||||
|
||||
#include "arm_math.h"
|
||||
|
||||
|
||||
#pragma pack(push,4)
|
||||
typedef struct _adcCapture
|
||||
{
|
||||
float32_t inDataF[6];
|
||||
int16_t outData;
|
||||
}adcCapture;
|
||||
#pragma pack(pop)
|
||||
|
||||
extern adcCapture WORK_VOLT_capture;
|
||||
extern adcCapture DSG_CURR_capture;
|
||||
extern adcCapture PV_VOLT_IN_capture;
|
||||
extern adcCapture CHG_CURR_capture;
|
||||
|
||||
void ADC_Capture_Init(void);
|
||||
void proportionalInt(uint8_t mode);
|
||||
|
||||
float get_CHG_CURR(void);
|
||||
float get_PV_VOLT_OUT(void);
|
||||
float get_DSG_CURR(void);
|
||||
float get_PV1_VOLT_IN(void);
|
||||
float get_PV_VOLT_IN1(void);
|
||||
float get_MOSFET_Temper(void);
|
||||
|
||||
void adcCaptureFir();
|
||||
|
||||
#endif
|
|
@ -0,0 +1,13 @@
|
|||
|
||||
#ifndef FM_FLASH_H_
|
||||
#define FM_FLASH_H_
|
||||
|
||||
#include "main.h"
|
||||
#include "w25qxx.h"
|
||||
|
||||
void Flash_Init(void);
|
||||
void read_Flash(uint8_t* pBuffer,uint32_t ReadAddr,uint16_t NumByteToRead);
|
||||
void write_Flash(uint8_t* pBuffer,uint32_t WriteAddr,uint16_t NumByteToWrite);
|
||||
|
||||
|
||||
#endif
|
|
@ -0,0 +1,157 @@
|
|||
|
||||
#include "FM_GPIO.h"
|
||||
|
||||
void FM_GPIO_Init(void)
|
||||
{
|
||||
HD_GPIO_Init();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 打开输出防反mos管
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
void POW_FF_PCON_Open(void)
|
||||
{
|
||||
HAL_GPIO_WritePin(POW_FF_CON_GPIO_Port, POW_FF_CON_Pin, GPIO_PIN_SET);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 关闭输出防反mos管
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
void POW_FF_PCON_Close(void)
|
||||
{
|
||||
HAL_GPIO_WritePin(POW_FF_CON_GPIO_Port, POW_FF_CON_Pin, GPIO_PIN_RESET);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 打开输出mos管
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
void POW_OUT_PCON_Open(void)
|
||||
{
|
||||
HAL_GPIO_WritePin(POW_OUT_CON_GPIO_Port, POW_OUT_CON_Pin, GPIO_PIN_SET);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 关闭输出mos管
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
void POW_OUT_PCON_Close(void)
|
||||
{
|
||||
HAL_GPIO_WritePin(POW_OUT_CON_GPIO_Port, POW_OUT_CON_Pin, GPIO_PIN_RESET);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 打开LED灯
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
void RUN_LEN_Open(void)
|
||||
{
|
||||
HAL_GPIO_WritePin(RUN_LED_GPIO_Port, RUN_LED_Pin, GPIO_PIN_SET);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 关闭LED灯
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
void RUN_LEN_Close(void)
|
||||
{
|
||||
HAL_GPIO_WritePin(RUN_LED_GPIO_Port, RUN_LED_Pin, GPIO_PIN_RESET);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 打开mppt电感后的输出mos管
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
void FFMOS_CON_Open(void)
|
||||
{
|
||||
HAL_GPIO_WritePin(FFMOS_CON_GPIO_Port, FFMOS_CON_Pin, GPIO_PIN_RESET);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 关闭mppt电感后的输出mos管
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
void FFMOS_CON_Close(void)
|
||||
{
|
||||
HAL_GPIO_WritePin(FFMOS_CON_GPIO_Port, FFMOS_CON_Pin, GPIO_PIN_SET);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 下桥的mos管使能pwm输出
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
void EN_PWMOUT_Eable(void)
|
||||
{
|
||||
HAL_GPIO_WritePin(EN_PWMOUT_GPIO_Port, EN_PWMOUT_Pin, GPIO_PIN_RESET);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 下桥的mos管关闭pwm输出
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
void EN_PWMOUT_Diseable(void)
|
||||
{
|
||||
HAL_GPIO_WritePin(EN_PWMOUT_GPIO_Port, EN_PWMOUT_Pin, GPIO_PIN_SET);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 仅有充电控制器时,判断输出开关是否打开
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
BOOL readOnlyPowerOutputState(void)
|
||||
{
|
||||
if (HAL_GPIO_ReadPin(POW_FF_CON_GPIO_Port, POW_FF_CON_Pin)
|
||||
&& HAL_GPIO_ReadPin(POW_OUT_CON_GPIO_Port, POW_OUT_CON_Pin)
|
||||
&& HAL_GPIO_ReadPin(DSG_PROT_GPIO_Port, DSG_PROT_Pin)) {
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 带网关时,判断输出开关是否打开
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
BOOL readOutputState(void)
|
||||
{
|
||||
if (1) {
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief GPIO外部中断的回调函数
|
||||
* @param GPIO_Pin 引发外部中断的引脚
|
||||
* @retval None
|
||||
*/
|
||||
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
|
||||
{
|
||||
if (GPIO_Pin == WORK_VOLT_Pin) {
|
||||
// WORK_VOLT_Interrupt();
|
||||
}
|
||||
|
||||
else if (GPIO_Pin == DSG_PROT_Pin) {
|
||||
// DSG_PROT_Interrupt();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,92 @@
|
|||
|
||||
#include "FM_TIM.h"
|
||||
#include "timeSliceOffset.h"
|
||||
#include "capture.h"
|
||||
|
||||
static int PWM_RESOLUTION;
|
||||
|
||||
/**
|
||||
* @brief 定时器初始化
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
void tim_Init(void)
|
||||
{
|
||||
HD_PWM_Init();
|
||||
/* 得到pwm的分辨率 */
|
||||
PWM_RESOLUTION = HAL_RCC_GetHCLKFreq() / 100000;
|
||||
|
||||
HD_controlTim_Init();
|
||||
HD_taskBaseTim_Init();
|
||||
HD_checkAbnormalTim_Init();
|
||||
}
|
||||
|
||||
void pwm_Stop(void)
|
||||
{
|
||||
set_pwmPulse(0);
|
||||
// HAL_TIM_OC_MspDeInit(&htim3);
|
||||
HAL_TIM_PWM_MspDeInit(&htim3);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 设置占空比的大小
|
||||
* @param Pulse 高电平所占的数
|
||||
* @retval None
|
||||
*/
|
||||
void set_pwmPulse(uint32_t Pulse)
|
||||
{
|
||||
if (Pulse > PWM_RESOLUTION) {
|
||||
return;
|
||||
}
|
||||
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_4, Pulse);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 设置占空比的大小
|
||||
* @param DutyRatio 占空比
|
||||
* @retval None
|
||||
*/
|
||||
void set_pwmDutyRatio(float DutyRatio)
|
||||
{
|
||||
uint32_t Pulse = (int)(DutyRatio * PWM_RESOLUTION);
|
||||
|
||||
set_pwmPulse(Pulse);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Period elapsed callback in non blocking mode
|
||||
* @note This function is called when TIM1 interrupt took place, inside
|
||||
* HAL_TIM_IRQHandler(). It makes a direct call to HAL_IncTick() to increment
|
||||
* a global variable "uwTick" used as application time base.
|
||||
* @param htim : TIM handle
|
||||
* @retval None
|
||||
*/
|
||||
/**
|
||||
* @brief 回调函数
|
||||
* @param htim 产生中断定时器
|
||||
* @retval None
|
||||
*/
|
||||
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
|
||||
{
|
||||
/* USER CODE BEGIN Callback 0 */
|
||||
|
||||
/* USER CODE END Callback 0 */
|
||||
if (htim->Instance == TIM1) {
|
||||
HAL_IncTick();
|
||||
}
|
||||
/* USER CODE BEGIN Callback 1 */
|
||||
|
||||
if (htim->Instance == TIM7) {
|
||||
chargControl();
|
||||
}
|
||||
|
||||
if (htim->Instance == TIM16) {
|
||||
TimeSliceOffset_Produce();
|
||||
}
|
||||
|
||||
if (htim->Instance == TIM17) {
|
||||
checkAbnormal();
|
||||
}
|
||||
|
||||
/* USER CODE END Callback 1 */
|
||||
}
|
|
@ -0,0 +1,446 @@
|
|||
|
||||
#include "capture.h"
|
||||
#include "HD_ADC.h"
|
||||
|
||||
/* 温度的adc值的个数 */
|
||||
#define mosTemperADCLen 241
|
||||
///* 3.3V参考电压温度adc值 */
|
||||
//const uint16_t mosTemperADC[mosTemperADCLen] = {
|
||||
// 3707, 3697, 3687, 3676, 3665, 3654, 3643, 3632, 3620, 3608, /* -20 - -15.5 ℃ */
|
||||
// 3596, 3584, 3571, 3559, 3546, 3533, 3519, 3506, 3492, 3478, /* -15 - -10.5 ℃ */
|
||||
// 3464, 3449, 3434, 3419, 3404, 3389, 3373, 3358, 3341, 3325, /* -10 - -5.5 ℃ */
|
||||
// 3309, 3292, 3275, 3258, 3241, 3223, 3205, 3187, 3169, 3151, /* -5 - -0.5 ℃ */
|
||||
// 3132, 3114, 3095, 3075, 3056, 3037, 3017, 2997, 2977, 2957, /* 0 - 4.5 ℃ */
|
||||
// 2936, 2916, 2895, 2874, 2854, 2832, 2811, 2790, 2768, 2747, /* 9 - 9.5 ℃ */
|
||||
// 2725, 2703, 2681, 2659, 2637, 2615, 2592, 2570, 2548, 2525, /* 10 - 14.5 ℃ */
|
||||
// 2503, 2480, 2457, 2435, 2412, 2389, 2366, 2343, 2321, 2298, /* 15 - 19.5 ℃ */
|
||||
// 2275, 2252, 2229, 2207, 2184, 2161, 2138, 2116, 2093, 2071, /* 20 - 24.5 ℃ */
|
||||
// 2048, 2026, 2003, 1981, 1959, 1937, 1914, 1893, 1871, 1849, /* 25 - 29.5 ℃ */
|
||||
// 1827, 1806, 1784, 1763, 1742, 1721, 1700, 1679, 1658, 1638, /* 30 - 34.5 ℃ */
|
||||
// 1617, 1597, 1577, 1557, 1537, 1518, 1498, 1479, 1460, 1441, /* 35 - 39.5 ℃ */
|
||||
// 1422, 1403, 1385, 1366, 1348, 1330, 1312, 1295, 1277, 1260, /* 40 - 44.5 ℃ */
|
||||
// 1243, 1226, 1209, 1192, 1176, 1160, 1144, 1128, 1112, 1097, /* 45 - 49.5 ℃ */
|
||||
// 1081, 1066, 1051, 1036, 1022, 1007, 993, 979, 965, 951, /* 50 - 54.5 ℃ */
|
||||
// 938, 924, 911, 898, 885, 872, 860, 848, 835, 823, /* 55 - 59.5 ℃ */
|
||||
// 811, 800, 788, 777, 765, 754, 743, 732, 722, 711, /* 60 - 64.5 ℃ */
|
||||
// 701, 691, 681, 671, 661, 651, 642, 632, 623, 614, /* 65 - 69.5 ℃ */
|
||||
// 605, 596, 588, 579, 571, 562, 554, 546, 538, 530, /* 70 - 74.5 ℃ */
|
||||
// 522, 515, 507, 500, 493, 486, 478, 471, 465, 458, /* 75 - 79.5 ℃ */
|
||||
// 451, 445, 438, 432, 426, 420, 414, 408, 402, 396, /* 80 - 84.5 ℃ */
|
||||
// 390, 385, 379, 374, 368, 363, 358, 353, 348, 343, /* 85 - 89.5 ℃ */
|
||||
// 338, 333, 328, 324, 319, 315, 310, 306, 301, 297, /* 90 - 94.5 ℃ */
|
||||
// 293, 289, 285, 281, 277, 273, 269, 266, 262, 258, /* 95 - 99.5 ℃ */
|
||||
// 255 /* 100 ℃ */
|
||||
//};
|
||||
|
||||
|
||||
/* 3.0V参考电压温度adc值 */
|
||||
const uint16_t mosTemperADC[mosTemperADCLen] = {
|
||||
4077, 4066, 4055, 4043, 4031, 4019, 4007, 3994, 3982, 3969, /* -20 - -15.5 ℃ */
|
||||
3955, 3942, 3928, 3914, 3900, 3885, 3871, 3856, 3841, 3825, /* -15 - -10.5 ℃ */
|
||||
3809, 3794, 3777, 3761, 3744, 3727, 3710, 3693, 3675, 3657, /* -10 - -5.5 ℃ */
|
||||
3639, 3621, 3602, 3583, 3564, 3545, 3525, 3506, 3486, 3465, /* -5 - -0.5 ℃ */
|
||||
3445, 3424, 3404, 3383, 3361, 3340, 3318, 3296, 3274, 3252, /* 0 - 4.5 ℃ */
|
||||
3230, 3207, 3184, 3162, 3138, 3115, 3092, 3068, 3045, 3021, /* 5 - 9.5 ℃ */
|
||||
2997, 2973, 2949, 2925, 2900, 2876, 2851, 2827, 2802, 2777, /* 10 - 14.5 ℃ */
|
||||
2752, 2728, 2703, 2678, 2653, 2628, 2602, 2577, 2552, 2527, /* 15 - 19.5 ℃ */
|
||||
2502, 2477, 2452, 2427, 2402, 2377, 2352, 2327, 2302, 2277, /* 20 - 24.5 ℃ */
|
||||
2253, 2228, 2203, 2179, 2154, 2130, 2106, 2082, 2057, 2034, /* 25 - 29.5 ℃ */
|
||||
2010, 1986, 1962, 1939, 1916, 1893, 1869, 1847, 1824, 1801, /* 30 - 34.5 ℃ */
|
||||
1779, 1757, 1734, 1713, 1691, 1669, 1648, 1626, 1605, 1584, /* 35 - 39.5 ℃ */
|
||||
1564, 1543, 1523, 1503, 1483, 1463, 1443, 1424, 1405, 1386, /* 40 - 44.5 ℃ */
|
||||
1367, 1348, 1330, 1312, 1293, 1276, 1258, 1241, 1223, 1206, /* 45 - 49.5 ℃ */
|
||||
1189, 1173, 1156, 1140, 1124, 1108, 1092, 1077, 1061, 1046, /* 50 - 54.5 ℃ */
|
||||
1031, 1017, 1002, 988, 974, 960, 946, 932, 919, 905, /* 55 - 59.5 ℃ */
|
||||
892, 879, 867, 854, 842, 829, 817, 806, 794, 782, /* 60 - 64.5 ℃ */
|
||||
771, 760, 749, 738, 727, 716, 706, 696, 685, 675, /* 65 - 69.5 ℃ */
|
||||
666, 656, 646, 637, 627, 618, 609, 600, 592, 583, /* 70 - 74.5 ℃ */
|
||||
575, 566, 558, 550, 542, 534, 526, 519, 511, 504, /* 75 - 79.5 ℃ */
|
||||
496, 489, 482, 475, 468, 461, 455, 448, 442, 435, /* 80 - 84.5 ℃ */
|
||||
429, 423, 417, 411, 405, 399, 394, 388, 382, 377, /* 85 - 89.5 ℃ */
|
||||
372, 366, 361, 356, 351, 346, 341, 336, 332, 327, /* 90 - 94.5 ℃ */
|
||||
322, 318, 313, 309, 305, 300, 296, 292, 288, 284, /* 95 - 99.5 ℃ */
|
||||
280 /* 100 ℃ */
|
||||
};
|
||||
|
||||
// /* 2.5V参考电压温度adc值 */
|
||||
// const uint16_t mosTemperADC[mosTemperADCLen] = {
|
||||
// 4893, 4879, 4866, 4852, 4838, 4823, 4808, 4793, 4778, 4762, /* -20 - -15.5 ℃ */
|
||||
// 4746, 4730, 4714, 4697, 4680, 4663, 4645, 4627, 4609, 4590, /* -15 - -10.5 ℃ */
|
||||
// 4571, 4552, 4533, 4513, 4493, 4473, 4452, 4431, 4410, 4389, /* -10 - -5.5 ℃ */
|
||||
// 4367, 4345, 4323, 4300, 4277, 4254, 4231, 4207, 4183, 4159, /* -5 - -0.5 ℃ */
|
||||
// 4134, 4109, 4084, 4059, 4034, 4008, 3982, 3956, 3929, 3903, /* 0 - 4.5 ℃ */
|
||||
// 3876, 3849, 3821, 3794, 3766, 3738, 3710, 3682, 3654, 3625, /* 5 - 9.5 ℃ */
|
||||
// 3596, 3568, 3539, 3510, 3480, 3451, 3422, 3392, 3362, 3333, /* 10 - 14.5 ℃ */
|
||||
// 3303, 3273, 3243, 3213, 3183, 3153, 3123, 3093, 3063, 3033, /* 15 - 19.5 ℃ */
|
||||
// 3003, 2972, 2942, 2912, 2882, 2852, 2822, 2792, 2762, 2733, /* 20 - 24.5 ℃ */
|
||||
// 2703, 2673, 2644, 2614, 2585, 2556, 2527, 2498, 2469, 2440, /* 25 - 29.5 ℃ */
|
||||
// 2412, 2383, 2355, 2327, 2299, 2271, 2243, 2216, 2189, 2162, /* 30 - 34.5 ℃ */
|
||||
// 2135, 2108, 2081, 2055, 2029, 2003, 1977, 1952, 1926, 1901, /* 35 - 39.5 ℃ */
|
||||
// 1876, 1852, 1827, 1803, 1779, 1755, 1732, 1709, 1686, 1663, /* 40 - 44.5 ℃ */
|
||||
// 1640, 1618, 1596, 1574, 1552, 1531, 1510, 1489, 1468, 1447, /* 45 - 49.5 ℃ */
|
||||
// 1427, 1407, 1387, 1368, 1349, 1330, 1311, 1292, 1274, 1256, /* 50 - 54.5 ℃ */
|
||||
// 1238, 1220, 1203, 1185, 1168, 1151, 1135, 1119, 1102, 1086, /* 55 - 59.5 ℃ */
|
||||
// 1071, 1055, 1040, 1025, 1010, 995, 981, 967, 953, 939, /* 60 - 64.5 ℃ */
|
||||
// 925, 912, 898, 885, 872, 860, 847, 835, 822, 810, /* 65 - 69.5 ℃ */
|
||||
// 799, 787, 775, 764, 753, 742, 731, 721, 710, 700, /* 70 - 74.5 ℃ */
|
||||
// 690, 679, 670, 660, 650, 641, 631, 622, 613, 604, /* 75 - 79.5 ℃ */
|
||||
// 596, 587, 578, 570, 562, 554, 546, 538, 530, 523, /* 80 - 84.5 ℃ */
|
||||
// 515, 508, 500, 493, 486, 479, 472, 466, 459, 452, /* 85 - 89.5 ℃ */
|
||||
// 446, 440, 433, 427, 421, 415, 409, 404, 398, 392, /* 90 - 94.5 ℃ */
|
||||
// 387, 381, 376, 371, 366, 361, 355, 350, 346, 341, /* 95 - 99.5 ℃ */
|
||||
// 336 /* 100 ℃ */
|
||||
// };
|
||||
|
||||
enum {
|
||||
WORK_VOLT_NUM = 0,
|
||||
DSG_CURR_NUM = 1,
|
||||
PV_VOLT_IN_NUM = 2,
|
||||
CHG_CURR_NUM = 3,
|
||||
};
|
||||
int16_t adcBuff[4];
|
||||
|
||||
adcCapture WORK_VOLT_capture = {0};
|
||||
adcCapture DSG_CURR_capture = {0};
|
||||
adcCapture PV_VOLT_IN_capture = {0};
|
||||
adcCapture CHG_CURR_capture = {0};
|
||||
|
||||
/* 电流电压采集转换的 */
|
||||
static float P_CHG_CURR = 0;
|
||||
static float P_PV_VOLT_OUT = 0;
|
||||
static float P_DSG_CURR = 0;
|
||||
static float P_PV1_VOLT_IN = 0;
|
||||
static float P_PV_VOLT_IN1 = 0;
|
||||
|
||||
/* 2.5为adc的电压,4095是2^adc的位数 - 1 */
|
||||
// const float32_t Proportion = 2.5 / 4095;
|
||||
const float32_t Proportion = 3.0 / 4095.0;
|
||||
|
||||
/* matlab生成的5阶滤波器系数 */
|
||||
const int firLen = 6;
|
||||
const float firLP[6] = {
|
||||
0.01861755922, -0.1146286726, 0.5962908864, 0.5962908864, -0.1146286726,
|
||||
0.01861755922
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief 初始化adc
|
||||
* @param
|
||||
* @retval None
|
||||
*/
|
||||
void ADC_Capture_Init(void)
|
||||
{
|
||||
HD_adc_Init();
|
||||
/* 将回调函数与dma的转换完成中断绑定 */
|
||||
// hdma_adc1.XferCpltCallback = dmaFerCpltCallback;
|
||||
HAL_Delay(100);
|
||||
|
||||
/* adc校准 */
|
||||
HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED);
|
||||
HAL_ADCEx_Calibration_Start(&hadc2, ADC_SINGLE_ENDED);
|
||||
|
||||
HAL_TIM_Base_Start(&htim6);
|
||||
HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adcBuff, 4);
|
||||
|
||||
// /* 光伏充电输出电流比例,放大倍数*电阻 */
|
||||
// P_CHG_CURR = (1.0 / (50 * (1 / (1 / 0.01 + 1 / 0.002)))) * Proportion;
|
||||
// /* 充电控制盒输出电压比例,分压系数 */
|
||||
// P_PV_VOLT_OUT = ((47.0 + 10.0) / 10.0) * Proportion;
|
||||
// /* 放电电流采集电流倍数 */
|
||||
// P_DSG_CURR = (1.0 / (50 * (1 / (1 / 0.002 * 2)))) * Proportion;
|
||||
// /* 光伏板输出电压比例 */
|
||||
// P_PV1_VOLT_IN = ((47.0 + 4.7) / 4.7) * Proportion;
|
||||
// /* 系统电源电压比例 */
|
||||
// P_PV_VOLT_IN1 = ((47 + 4.7) / 4.7) * Proportion;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 初始化电流电压转换的比例(及放大或者缩小倍数)
|
||||
* @param
|
||||
* @retval None
|
||||
*/
|
||||
void proportionalInt(uint8_t mode)
|
||||
{
|
||||
/* 仅充当电源盒 */
|
||||
if (mode) {
|
||||
/* 光伏充电输出电流比例,放大倍数*电阻 */
|
||||
P_CHG_CURR = (1.0 / (50 * (1 / (1 / 0.01 + 1 / 0.002)))) * Proportion;
|
||||
/* 充电控制盒输出电压比例,分压系数 */
|
||||
P_PV_VOLT_OUT = ((47.0 + 10.0) / 10.0) * Proportion;
|
||||
/* 放电电流采集电流倍数 */
|
||||
P_DSG_CURR = (1.0 / (50 * (1 / (1 / 0.002 * 2)))) * Proportion;
|
||||
/* 光伏板输出电压比例 */
|
||||
P_PV1_VOLT_IN = ((47.0 + 4.7) / 4.7) * Proportion;
|
||||
/* 系统电源电压比例 */
|
||||
P_PV_VOLT_IN1 = ((47 + 4.7) / 4.7) * Proportion;
|
||||
}
|
||||
|
||||
/* 电源盒外还有网关功能 */
|
||||
else {
|
||||
/* 光伏充电输出电流比例,放大倍数*电阻 */
|
||||
P_CHG_CURR = (1.0 / (50 * 0.005)) * Proportion;
|
||||
/* 光伏充电输出电压比例,分压系数 */
|
||||
P_PV_VOLT_OUT = ((47.0 + 4.7) / 4.7) * Proportion;
|
||||
/* 放电电流采集电流倍数 */
|
||||
P_DSG_CURR = (1.0 / (50 * 0.005)) * Proportion;
|
||||
/* 光伏1开路输出电压比例 */
|
||||
P_PV1_VOLT_IN = ((47.0 + 4.7) / 4.7) * Proportion;
|
||||
/* 系统电源电压比例 */
|
||||
P_PV_VOLT_IN1 = ((47 + 4.7) / 4.7) * Proportion;
|
||||
}
|
||||
}
|
||||
|
||||
#define N 4
|
||||
/**
|
||||
* @brief 中位值平均滤波
|
||||
* @param funtion 获取ADC的函数
|
||||
* @param ADC_Channel ADC通道
|
||||
* @retval None
|
||||
*/
|
||||
static int16_t middleAverageFilter(int16_t funtion(uint32_t Channel), uint32_t ADC_Channel)
|
||||
{
|
||||
int16_t i,j,k;
|
||||
int16_t temp,sum = 0;
|
||||
int16_t value_buf[N];
|
||||
for (i = 0; i < N; ++i) {
|
||||
value_buf[i] = funtion(ADC_Channel);
|
||||
}
|
||||
/*从小到大冒泡排序*/
|
||||
for(j = 0; j < N-1; ++j) {
|
||||
for (k = 0; k < N-j-1; ++k) {
|
||||
if(value_buf[k] > value_buf[k+1]) {
|
||||
temp = value_buf[k];
|
||||
value_buf[k] = value_buf[k+1];
|
||||
value_buf[k+1] = temp;
|
||||
}
|
||||
}
|
||||
}
|
||||
for(i = 1; i < N-1; ++i) {
|
||||
sum += value_buf[i];
|
||||
}
|
||||
return sum / (N-2);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 获取adc2的采集值
|
||||
* @param Channel ADC通道
|
||||
* @retval None
|
||||
*/
|
||||
static int16_t ADC2_Capture(uint32_t Channel)
|
||||
{
|
||||
return middleAverageFilter(get_adc2Value, Channel);
|
||||
}
|
||||
|
||||
// /**
|
||||
// * @brief 获取adc1的采集值
|
||||
// * @param Channel ADC通道
|
||||
// * @retval None
|
||||
// */
|
||||
// static int16_t ADC1_Capture(uint32_t Channel)
|
||||
// {
|
||||
// return middleAverageFilter(get_adc1Value, Channel);
|
||||
// }
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @brief 得到充电电流
|
||||
* @param
|
||||
* @retval I 电流值
|
||||
*/
|
||||
float get_CHG_CURR(void)
|
||||
{
|
||||
float I;
|
||||
|
||||
I = CHG_CURR_capture.outData * P_CHG_CURR;
|
||||
// I = ADC1_Capture(ADC_CHANNEL_11) * P_CHG_CURR;
|
||||
|
||||
#ifdef enable_Printf_VI
|
||||
debug("\n CHG_CURR ADC : %d \n", (int)CHG_CURR_capture.outDataF);
|
||||
debug(" CHG_CURR I : %f \n", I);
|
||||
#endif
|
||||
|
||||
return I;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 得到光伏输出电压
|
||||
* @param
|
||||
* @retval V 电压值
|
||||
*/
|
||||
float get_PV_VOLT_OUT(void)
|
||||
{
|
||||
float V;
|
||||
|
||||
V = WORK_VOLT_capture.outData * P_PV_VOLT_OUT;
|
||||
// V = ADC1_Capture(ADC_CHANNEL_7) * P_PV_VOLT_OUT;
|
||||
|
||||
|
||||
#ifdef enable_Printf_VI
|
||||
debug("\n PV_VOLT_OUT ADC : %d \n", (int)WORK_VOLT_capture.outDataF);
|
||||
debug(" PV_VOLT_OUT V : %f \n", V);
|
||||
#endif
|
||||
|
||||
return V;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 得到放电电流
|
||||
* @param
|
||||
* @retval I 电流值
|
||||
*/
|
||||
float get_DSG_CURR(void)
|
||||
{
|
||||
float I;
|
||||
|
||||
I = DSG_CURR_capture.outData * P_DSG_CURR;
|
||||
// I = ADC1_Capture(ADC_CHANNEL_8) * P_DSG_CURR;
|
||||
|
||||
#ifdef enable_Printf_VI
|
||||
debug("\n DSG_CURR ADC : %d \n", (int)DSG_CURR_capture.outDataF);
|
||||
debug(" DSG_CURR I : %f \n", I);
|
||||
#endif
|
||||
|
||||
return I;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 得到光伏电压
|
||||
* @param
|
||||
* @retval V 电压值
|
||||
*/
|
||||
float get_PV1_VOLT_IN(void)
|
||||
{
|
||||
float V;
|
||||
|
||||
V = PV_VOLT_IN_capture.outData * P_PV1_VOLT_IN;
|
||||
// V = ADC1_Capture(ADC_CHANNEL_15) * P_PV1_VOLT_IN;
|
||||
|
||||
#ifdef enable_Printf_VI
|
||||
debug("\n PV1_VOLT_IN ADC : %d \n", (int)PV_VOLT_IN_capture.outDataF);
|
||||
debug(" PV1_VOLT_IN V1 : %f \n", V);
|
||||
#endif
|
||||
|
||||
return V;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 得到系统电压电压
|
||||
* @param
|
||||
* @retval V 电压值
|
||||
*/
|
||||
float get_PV_VOLT_IN1(void)
|
||||
{
|
||||
float V;
|
||||
uint16_t V_ADC;
|
||||
|
||||
V_ADC = ADC2_Capture(SYS_VOLT_IN_CHANNEL);
|
||||
|
||||
V = (float)(V_ADC) * P_PV_VOLT_IN1;
|
||||
|
||||
#ifdef enable_Printf_VI
|
||||
debug("\n PV_VOLT_IN1 ADC : %d \n", V_ADC);
|
||||
debug(" PV_VOLT_IN1 V : %f \n", V);
|
||||
#endif
|
||||
|
||||
return V;
|
||||
}
|
||||
|
||||
|
||||
//const float Rp = 10000.0; //10K
|
||||
//const float T2 = (273.15+25.0);//T2
|
||||
//const float Bx = 3950.0;//B
|
||||
//const float Bx = 3435.0;//B
|
||||
//const float Ka = 273.15;
|
||||
/**
|
||||
* @brief 得到温度
|
||||
* @param
|
||||
* @retval V 电压值
|
||||
*/
|
||||
float get_MOSFET_Temper(void)
|
||||
{
|
||||
float T = 0;
|
||||
uint16_t T_ADC;
|
||||
|
||||
T_ADC = ADC2_Capture(MOSFET_Temper_CHANNEL);
|
||||
|
||||
for (int i = 0; i < mosTemperADCLen; ++i) {
|
||||
if (T_ADC >= mosTemperADC[i]) {
|
||||
T = -20 + i * 0.5;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef enable_Printf_VI
|
||||
debug("\n MOSFET_Temper ADC : %d \n", T_ADC);
|
||||
debug(" MOSFET_Temper T : %f \n", T);
|
||||
#endif
|
||||
|
||||
return T;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief adc转换并传输完成后进入该回调函数
|
||||
* @param hdma dma
|
||||
* @retval None
|
||||
*/
|
||||
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hdma)
|
||||
{
|
||||
if (hdma->Instance == ADC1) {
|
||||
arm_copy_f32(WORK_VOLT_capture.inDataF, WORK_VOLT_capture.inDataF + 1, 5);
|
||||
arm_copy_f32(DSG_CURR_capture.inDataF, DSG_CURR_capture.inDataF + 1, 5);
|
||||
arm_copy_f32(PV_VOLT_IN_capture.inDataF, PV_VOLT_IN_capture.inDataF + 1, 5);
|
||||
arm_copy_f32(CHG_CURR_capture.inDataF, CHG_CURR_capture.inDataF + 1, 5);
|
||||
|
||||
WORK_VOLT_capture.inDataF[5] = (float32_t)adcBuff[WORK_VOLT_NUM];
|
||||
DSG_CURR_capture.inDataF[5] = (float32_t)adcBuff[DSG_CURR_NUM];
|
||||
PV_VOLT_IN_capture.inDataF[5] = (float32_t)adcBuff[PV_VOLT_IN_NUM];
|
||||
CHG_CURR_capture.inDataF[5] = (float32_t)adcBuff[CHG_CURR_NUM];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 将采集得到的adc进行滤波
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
void adcCaptureFir(void)
|
||||
{
|
||||
static arm_fir_instance_f32 armFirInstanceF32;
|
||||
static float32_t *inputF32, *outputF32;
|
||||
static uint32_t blockSize = 1;
|
||||
static float32_t firStateF32[6]; /* 状态缓存 */
|
||||
static float32_t outputf;
|
||||
|
||||
/* 初始化结构体 */
|
||||
arm_fir_init_f32(&armFirInstanceF32,
|
||||
firLen,
|
||||
(float_t *)&firLP[0],
|
||||
&firStateF32[0],
|
||||
blockSize);
|
||||
|
||||
/* 初始化输入输出缓存指针 */
|
||||
inputF32 = &WORK_VOLT_capture.inDataF[0];
|
||||
outputF32 = &outputf;
|
||||
arm_fir_f32(&armFirInstanceF32, inputF32, outputF32, blockSize);
|
||||
WORK_VOLT_capture.outData = (int16_t)outputf;
|
||||
|
||||
/* 初始化输入输出缓存指针 */
|
||||
inputF32 = &DSG_CURR_capture.inDataF[0];
|
||||
outputF32 = &outputf;
|
||||
arm_fir_f32(&armFirInstanceF32, inputF32, outputF32, blockSize);
|
||||
DSG_CURR_capture.outData = (int16_t)outputf;
|
||||
|
||||
/* 初始化输入输出缓存指针 */
|
||||
inputF32 = &PV_VOLT_IN_capture.inDataF[0];
|
||||
outputF32 = &outputf;
|
||||
arm_fir_f32(&armFirInstanceF32, inputF32, outputF32, blockSize);
|
||||
PV_VOLT_IN_capture.outData = (int16_t)outputf;
|
||||
|
||||
/* 初始化输入输出缓存指针 */
|
||||
inputF32 = &CHG_CURR_capture.inDataF[0];
|
||||
outputF32 = &outputf;
|
||||
arm_fir_f32(&armFirInstanceF32, inputF32, outputF32, blockSize);
|
||||
CHG_CURR_capture.outData = (int16_t)outputf;
|
||||
}
|
||||
|
|
@ -0,0 +1,43 @@
|
|||
#include "flash.h"
|
||||
|
||||
/**
|
||||
* @brief flash初始化
|
||||
* @param
|
||||
*/
|
||||
void Flash_Init(void)
|
||||
{
|
||||
__HAL_RCC_GPIOA_CLK_ENABLE();
|
||||
|
||||
HAL_GPIO_WritePin(FLASH_CS_GPIO_Port, FLASH_CS_Pin, GPIO_PIN_RESET);
|
||||
GPIO_InitTypeDef GPIO_InitStruct = {0};
|
||||
|
||||
GPIO_InitStruct.Pin = FLASH_CS_Pin;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||||
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
|
||||
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
|
||||
|
||||
W25QXX_Init();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 读取flash中的数据
|
||||
* @param pBuffer 保存读取的数据
|
||||
* @param ReadAddr 读取数据的位置
|
||||
* @param NumByteToRead 读取数据的长度
|
||||
*/
|
||||
void read_Flash(uint8_t* pBuffer,uint32_t ReadAddr,uint16_t NumByteToRead)
|
||||
{
|
||||
W25QXX_Read(pBuffer, ReadAddr, NumByteToRead);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 将数据写入到flash中
|
||||
* @param pBuffer 要写入的数据
|
||||
* @param ReadAddr 要写入数据的位置
|
||||
* @param NumByteToRead 要写入数据的长度
|
||||
*/
|
||||
void write_Flash(uint8_t* pBuffer,uint32_t WriteAddr,uint16_t NumByteToWrite)
|
||||
{
|
||||
W25QXX_Write(pBuffer, WriteAddr, NumByteToWrite);
|
||||
}
|
|
@ -0,0 +1,20 @@
|
|||
|
||||
#ifndef HD_ADC_H_
|
||||
#define HD_ADC_H_
|
||||
|
||||
#include "main.h"
|
||||
#include "adc.h"
|
||||
#include "dma.h"
|
||||
#include "tim.h"
|
||||
#include "comm_types.h"
|
||||
#include "stm32g431xx.h"
|
||||
|
||||
#define SYS_VOLT_IN_CHANNEL ADC_CHANNEL_1
|
||||
#define MOSFET_Temper_CHANNEL ADC_CHANNEL_15
|
||||
|
||||
void HD_adc_Init(void);
|
||||
int16_t get_adc1Value(uint32_t Channel);
|
||||
int16_t get_adc2Value(uint32_t Channel);
|
||||
|
||||
|
||||
#endif
|
|
@ -0,0 +1,12 @@
|
|||
|
||||
#ifndef HD_GPIO_H_
|
||||
#define HD_GPIO_H_
|
||||
|
||||
#include "main.h"
|
||||
#include "gpio.h"
|
||||
#include "stm32g431xx.h"
|
||||
#include "comm_types.h"
|
||||
|
||||
void HD_GPIO_Init(void);
|
||||
|
||||
#endif
|
|
@ -0,0 +1,15 @@
|
|||
|
||||
#ifndef HD_TIM_H_
|
||||
#define HD_TIM_H_
|
||||
|
||||
#include "main.h"
|
||||
#include "tim.h"
|
||||
#include "stm32g431xx.h"
|
||||
|
||||
void HD_PWM_Init(void);
|
||||
void HD_controlTim_Init(void);
|
||||
void HD_taskBaseTim_Init(void);
|
||||
void HD_checkAbnormalTim_Init(void);
|
||||
|
||||
|
||||
#endif
|
|
@ -0,0 +1,67 @@
|
|||
#ifndef __W25QXX_H
|
||||
#define __W25QXX_H
|
||||
|
||||
#include <main.h>
|
||||
|
||||
#define W25QXX_SPI_Handle (&hspi1)
|
||||
|
||||
//W25X系列/Q系列芯片列表
|
||||
//W25Q80 ID 0XEF13
|
||||
//W25Q16 ID 0XEF14
|
||||
//W25Q32 ID 0XEF15
|
||||
//W25Q64 ID 0XEF16
|
||||
//W25Q128 ID 0XEF17
|
||||
#define W25Q80 0XEF13
|
||||
#define W25Q16 0XEF14
|
||||
#define W25Q32 0XEF15
|
||||
#define W25Q64 0XEF16
|
||||
#define W25Q128 0XEF17
|
||||
|
||||
|
||||
#define W25QXX_CS_L() HAL_GPIO_WritePin(FLASH_CS_GPIO_Port, FLASH_CS_Pin, GPIO_PIN_RESET)
|
||||
#define W25QXX_CS_H() HAL_GPIO_WritePin(FLASH_CS_GPIO_Port, FLASH_CS_Pin, GPIO_PIN_SET)
|
||||
|
||||
|
||||
extern uint16_t W25QXX_TYPE;
|
||||
extern uint32_t W25QXX_SIZE;
|
||||
extern uint8_t W25QXX_UID[8];
|
||||
|
||||
|
||||
//
|
||||
//指令表
|
||||
#define W25X_WriteEnable 0x06
|
||||
#define W25X_WriteDisable 0x04
|
||||
#define W25X_ReadStatusReg 0x05
|
||||
#define W25X_WriteStatusReg 0x01
|
||||
#define W25X_ReadData 0x03
|
||||
#define W25X_FastReadData 0x0B
|
||||
#define W25X_FastReadDual 0x3B
|
||||
#define W25X_PageProgram 0x02
|
||||
#define W25X_BlockErase 0xD8
|
||||
#define W25X_SectorErase 0x20
|
||||
#define W25X_ChipErase 0xC7
|
||||
#define W25X_PowerDown 0xB9
|
||||
#define W25X_ReleasePowerDown 0xAB
|
||||
#define W25X_DeviceID 0xAB
|
||||
#define W25X_ManufactDeviceID 0x90
|
||||
#define W25X_JedecDeviceID 0x9F
|
||||
|
||||
int W25QXX_Init(void);
|
||||
void W25QXX_ReadUniqueID(uint8_t UID[8]);
|
||||
uint16_t W25QXX_ReadID(void); //读取FLASH ID
|
||||
uint8_t W25QXX_ReadSR(void); //读取状态寄存器
|
||||
void W25QXX_Write_SR(uint8_t sr); //写状态寄存器
|
||||
void W25QXX_Write_Enable(void); //写使能
|
||||
void W25QXX_Write_Disable(void); //写保护
|
||||
void W25QXX_Write_NoCheck(uint8_t* pBuffer,uint32_t WriteAddr,uint16_t NumByteToWrite);
|
||||
void W25QXX_Read(uint8_t* pBuffer,uint32_t ReadAddr,uint16_t NumByteToRead); //读取flash
|
||||
void W25QXX_Write(uint8_t* pBuffer,uint32_t WriteAddr,uint16_t NumByteToWrite);//写入flash
|
||||
void W25QXX_Erase_Chip(void); //整片擦除
|
||||
void W25QXX_Erase_Sector(uint32_t Dst_Addr); //扇区擦除
|
||||
void W25QXX_Wait_Busy(void); //等待空闲
|
||||
void W25QXX_PowerDown(void); //进入掉电模式
|
||||
void W25QXX_WAKEUP(void); //唤醒
|
||||
uint32_t W25QXX_ReadCapacity(void);
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,61 @@
|
|||
#include "HD_ADC.h"
|
||||
|
||||
#define ADC_SAMPLETIME ADC_SAMPLETIME_2CYCLES_5 //采样时间
|
||||
|
||||
|
||||
void HD_adc_Init(void)
|
||||
{
|
||||
MX_DMA_Init();
|
||||
MX_TIM6_Init();
|
||||
MX_ADC1_Init();
|
||||
MX_ADC2_Init();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 获取adc1中某通道的值
|
||||
* @param Channel 通道
|
||||
*/
|
||||
int16_t get_adc1Value(uint32_t Channel)
|
||||
{
|
||||
ADC_ChannelConfTypeDef sConfig;
|
||||
|
||||
/* 更改读取的adc的通道 */
|
||||
sConfig.Channel = Channel;
|
||||
sConfig.Rank = ADC_REGULAR_RANK_1;
|
||||
sConfig.SamplingTime = ADC_SAMPLETIME;
|
||||
sConfig.SingleDiff = ADC_SINGLE_ENDED;
|
||||
sConfig.OffsetNumber = ADC_OFFSET_NONE;
|
||||
sConfig.Offset = 0;
|
||||
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
|
||||
|
||||
/* 启动转换 */
|
||||
HAL_ADC_Start(&hadc1);
|
||||
/* 等待转化结束 */
|
||||
HAL_ADC_PollForConversion(&hadc1, 30);
|
||||
u_int16_t adcValue = HAL_ADC_GetValue(&hadc1);
|
||||
|
||||
return adcValue;
|
||||
}
|
||||
|
||||
int16_t get_adc2Value(uint32_t Channel)
|
||||
{
|
||||
ADC_ChannelConfTypeDef sConfig;
|
||||
|
||||
/* 更改读取的adc的通道 */
|
||||
sConfig.Channel = Channel;
|
||||
sConfig.Rank = ADC_REGULAR_RANK_1;
|
||||
sConfig.SamplingTime = ADC_SAMPLETIME;
|
||||
sConfig.SingleDiff = ADC_SINGLE_ENDED;
|
||||
sConfig.OffsetNumber = ADC_OFFSET_NONE;
|
||||
sConfig.Offset = 0;
|
||||
HAL_ADC_ConfigChannel(&hadc2, &sConfig);
|
||||
|
||||
/* 启动转换 */
|
||||
HAL_ADC_Start(&hadc2);
|
||||
/* 等待转化结束 */
|
||||
HAL_ADC_PollForConversion(&hadc2, 30);
|
||||
u_int16_t adcValue = HAL_ADC_GetValue(&hadc2);
|
||||
|
||||
return adcValue;
|
||||
}
|
||||
|
|
@ -0,0 +1,58 @@
|
|||
#include "HD_GPIO.h"
|
||||
|
||||
void HD_GPIO_Init(void)
|
||||
{
|
||||
// MX_GPIO_Init();
|
||||
|
||||
GPIO_InitTypeDef GPIO_InitStruct = {0};
|
||||
|
||||
/* GPIO Ports Clock Enable */
|
||||
__HAL_RCC_GPIOC_CLK_ENABLE();
|
||||
__HAL_RCC_GPIOF_CLK_ENABLE();
|
||||
__HAL_RCC_GPIOA_CLK_ENABLE();
|
||||
__HAL_RCC_GPIOB_CLK_ENABLE();
|
||||
|
||||
/*Configure GPIO pin Output Level */
|
||||
// HAL_GPIO_WritePin(FLASH_CS_GPIO_Port, FLASH_CS_Pin, GPIO_PIN_RESET);
|
||||
|
||||
/*Configure GPIO pin Output Level */
|
||||
HAL_GPIO_WritePin(GPIOB, WDI_INPUT_Pin|RUN_LED_Pin|POW_FF_CON_Pin|POW_OUT_CON_Pin, GPIO_PIN_RESET);
|
||||
|
||||
/*Configure GPIO pin Output Level */
|
||||
HAL_GPIO_WritePin(GPIOA, EN_PWMOUT_Pin|FFMOS_CON_Pin, GPIO_PIN_SET);
|
||||
|
||||
/*Configure GPIO pin : DSG_PROT_Pin */
|
||||
GPIO_InitStruct.Pin = DSG_PROT_Pin;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
|
||||
GPIO_InitStruct.Pull = GPIO_PULLUP;
|
||||
HAL_GPIO_Init(DSG_PROT_GPIO_Port, &GPIO_InitStruct);
|
||||
|
||||
/*Configure GPIO pins : FLASH_CS_Pin EN_PWMOUT_Pin FFMOS_CON_Pin */
|
||||
// GPIO_InitStruct.Pin = FLASH_CS_Pin|EN_PWMOUT_Pin|FFMOS_CON_Pin;
|
||||
// GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||||
// GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||
// GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
||||
// HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
|
||||
GPIO_InitStruct.Pin = EN_PWMOUT_Pin|FFMOS_CON_Pin;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||||
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
||||
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
|
||||
|
||||
/*Configure GPIO pins : WDI_INPUT_Pin RUN_LED_Pin POW_FF_CON_Pin POW_OUT_CON_Pin */
|
||||
GPIO_InitStruct.Pin = WDI_INPUT_Pin|RUN_LED_Pin|POW_FF_CON_Pin|POW_OUT_CON_Pin;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||||
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
||||
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
||||
|
||||
/*Configure GPIO pin : WORK_VOLT_INT_Pin */
|
||||
GPIO_InitStruct.Pin = WORK_VOLT_INT_Pin;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
|
||||
GPIO_InitStruct.Pull = GPIO_PULLUP;
|
||||
HAL_GPIO_Init(WORK_VOLT_INT_GPIO_Port, &GPIO_InitStruct);
|
||||
|
||||
/* EXTI interrupt init*/
|
||||
HAL_NVIC_SetPriority(EXTI15_10_IRQn, 5, 0);
|
||||
HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
|
||||
}
|
|
@ -0,0 +1,41 @@
|
|||
#include "HD_TIM.h"
|
||||
|
||||
/**
|
||||
* @brief 控制pwm的定时器初始化
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
void HD_PWM_Init(void)
|
||||
{
|
||||
MX_TIM3_Init();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 该定时器中断中完成充电控制器的控制
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
void HD_controlTim_Init(void)
|
||||
{
|
||||
MX_TIM7_Init();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 该定时器中断中设置普通任务的时间基准
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
void HD_taskBaseTim_Init(void)
|
||||
{
|
||||
MX_TIM16_Init();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 该定时器中断中检测异常情况,并完成数据的采集
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
void HD_checkAbnormalTim_Init(void)
|
||||
{
|
||||
MX_TIM17_Init();
|
||||
}
|
|
@ -0,0 +1,334 @@
|
|||
|
||||
/**
|
||||
* @file w25qxx.c
|
||||
*
|
||||
* @brief Create by AnKun on 2020/6/18
|
||||
*
|
||||
*/
|
||||
|
||||
#include "w25qxx.h"
|
||||
#include "spi.h"
|
||||
|
||||
uint16_t W25QXX_TYPE = 0;
|
||||
uint32_t W25QXX_SIZE = 0;
|
||||
uint8_t W25QXX_UID[8];
|
||||
|
||||
static void delay_us(uint32_t us)
|
||||
{
|
||||
uint32_t delay = (HAL_RCC_GetHCLKFreq() / 4000000 * us);
|
||||
while (delay--)
|
||||
{
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
//SPI读写一个字节
|
||||
//TxData:要写入的字节
|
||||
//返回值:读取到的字节
|
||||
static uint8_t W25QXX_SPI_ReadWriteByte(uint8_t TxData)
|
||||
{
|
||||
uint8_t RxData = 0X00;
|
||||
if(HAL_SPI_TransmitReceive(W25QXX_SPI_Handle, &TxData, &RxData, 1, 10) != HAL_OK)
|
||||
{
|
||||
RxData = 0XFF;
|
||||
}
|
||||
return RxData;
|
||||
}
|
||||
|
||||
//4Kbytes为一个Sector
|
||||
//16个扇区为1个Block
|
||||
//W25Q128
|
||||
//容量为16M字节,共有128个Block,4096个Sector
|
||||
|
||||
//初始化SPI FLASH的IO口
|
||||
int W25QXX_Init(void)
|
||||
{
|
||||
MX_SPI1_Init();
|
||||
W25QXX_CS_L(); /* 拉低选中 */
|
||||
W25QXX_SPI_ReadWriteByte(0XFF);
|
||||
W25QXX_CS_H(); /* 拉高取消 */
|
||||
W25QXX_TYPE = W25QXX_ReadID(); // 读取FLASH ID.
|
||||
W25QXX_SIZE = W25QXX_ReadCapacity(); // 读取容量
|
||||
W25QXX_ReadUniqueID(W25QXX_UID); // 读取唯一ID
|
||||
if((W25QXX_TYPE & 0XEF00) != 0XEF00)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
//读取W25QXX的状态寄存器
|
||||
//BIT7 6 5 4 3 2 1 0
|
||||
//SPR RV TB BP2 BP1 BP0 WEL BUSY
|
||||
//SPR:默认0,状态寄存器保护位,配合WP使用
|
||||
//TB,BP2,BP1,BP0:FLASH区域写保护设置
|
||||
//WEL:写使能锁定
|
||||
//BUSY:忙标记位(1,忙;0,空闲)
|
||||
//默认:0x00
|
||||
uint8_t W25QXX_ReadSR(void)
|
||||
{
|
||||
uint8_t byte = 0;
|
||||
W25QXX_CS_L(); //使能器件
|
||||
W25QXX_SPI_ReadWriteByte(W25X_ReadStatusReg); //发送读取状态寄存器命令
|
||||
byte = W25QXX_SPI_ReadWriteByte(0Xff); //读取一个字节
|
||||
W25QXX_CS_H(); //取消片选
|
||||
return byte;
|
||||
}
|
||||
//写W25QXX状态寄存器
|
||||
//只有SPR,TB,BP2,BP1,BP0(bit 7,5,4,3,2)可以写!!!
|
||||
void W25QXX_Write_SR(uint8_t sr)
|
||||
{
|
||||
W25QXX_CS_L(); //使能器件
|
||||
W25QXX_SPI_ReadWriteByte(W25X_WriteStatusReg); //发送写取状态寄存器命令
|
||||
W25QXX_SPI_ReadWriteByte(sr); //写入一个字节
|
||||
W25QXX_CS_H(); //取消片选
|
||||
}
|
||||
//W25QXX写使能
|
||||
//将WEL置位
|
||||
void W25QXX_Write_Enable(void)
|
||||
{
|
||||
W25QXX_CS_L(); //使能器件
|
||||
W25QXX_SPI_ReadWriteByte(W25X_WriteEnable); //发送写使能
|
||||
W25QXX_CS_H(); //取消片选
|
||||
}
|
||||
//W25QXX写禁止
|
||||
//将WEL清零
|
||||
void W25QXX_Write_Disable(void)
|
||||
{
|
||||
W25QXX_CS_L(); //使能器件
|
||||
W25QXX_SPI_ReadWriteByte(W25X_WriteDisable); //发送写禁止指令
|
||||
W25QXX_CS_H(); //取消片选
|
||||
}
|
||||
//读取芯片ID
|
||||
//返回值如下:
|
||||
//0XEF13,表示芯片型号为W25Q80
|
||||
//0XEF14,表示芯片型号为W25Q16
|
||||
//0XEF15,表示芯片型号为W25Q32
|
||||
//0XEF16,表示芯片型号为W25Q64
|
||||
//0XEF17,表示芯片型号为W25Q128
|
||||
uint16_t W25QXX_ReadID(void)
|
||||
{
|
||||
uint16_t Temp = 0;
|
||||
W25QXX_CS_L();
|
||||
W25QXX_SPI_ReadWriteByte(0x90); //发送读取ID命令
|
||||
W25QXX_SPI_ReadWriteByte(0x00);
|
||||
W25QXX_SPI_ReadWriteByte(0x00);
|
||||
W25QXX_SPI_ReadWriteByte(0x00);
|
||||
Temp |= W25QXX_SPI_ReadWriteByte(0xFF) << 8;
|
||||
Temp |= W25QXX_SPI_ReadWriteByte(0xFF);
|
||||
W25QXX_CS_H();
|
||||
return Temp;
|
||||
}
|
||||
|
||||
uint32_t W25QXX_ReadCapacity(void)
|
||||
{
|
||||
int i = 0;
|
||||
uint8_t arr[4] = {0,0,0,0};
|
||||
W25QXX_CS_L();
|
||||
W25QXX_SPI_ReadWriteByte(0x5A);
|
||||
W25QXX_SPI_ReadWriteByte(0x00);
|
||||
W25QXX_SPI_ReadWriteByte(0x00);
|
||||
W25QXX_SPI_ReadWriteByte(0x84);
|
||||
W25QXX_SPI_ReadWriteByte(0x00);
|
||||
for(i = 0; i < sizeof(arr); i++)
|
||||
{
|
||||
arr[i] = W25QXX_SPI_ReadWriteByte(0xFF);
|
||||
}
|
||||
W25QXX_CS_H();
|
||||
return ((((*(uint32_t *)arr)) + 1) >> 3);
|
||||
}
|
||||
|
||||
void W25QXX_ReadUniqueID(uint8_t UID[8])
|
||||
{
|
||||
int i = 0;
|
||||
W25QXX_CS_L();
|
||||
W25QXX_SPI_ReadWriteByte(0x4B);
|
||||
W25QXX_SPI_ReadWriteByte(0x00);
|
||||
W25QXX_SPI_ReadWriteByte(0x00);
|
||||
W25QXX_SPI_ReadWriteByte(0x00);
|
||||
W25QXX_SPI_ReadWriteByte(0x00);
|
||||
for(i = 0; i < 8; i++)
|
||||
{
|
||||
UID[i] = W25QXX_SPI_ReadWriteByte(0xFF);
|
||||
}
|
||||
W25QXX_CS_H();
|
||||
}
|
||||
|
||||
//读取SPI FLASH
|
||||
//在指定地址开始读取指定长度的数据
|
||||
//pBuffer:数据存储区
|
||||
//ReadAddr:开始读取的地址(24bit)
|
||||
//NumByteToRead:要读取的字节数(最大65535)
|
||||
void W25QXX_Read(uint8_t *pBuffer, uint32_t ReadAddr, uint16_t NumByteToRead)
|
||||
{
|
||||
uint16_t i;
|
||||
W25QXX_CS_L(); //使能器件
|
||||
W25QXX_SPI_ReadWriteByte(W25X_ReadData); //发送读取命令
|
||||
W25QXX_SPI_ReadWriteByte((uint8_t)((ReadAddr) >> 16)); //发送24bit地址
|
||||
W25QXX_SPI_ReadWriteByte((uint8_t)((ReadAddr) >> 8));
|
||||
W25QXX_SPI_ReadWriteByte((uint8_t)ReadAddr);
|
||||
for (i = 0; i < NumByteToRead; i++)
|
||||
{
|
||||
pBuffer[i] = W25QXX_SPI_ReadWriteByte(0XFF); //循环读数
|
||||
}
|
||||
W25QXX_CS_H();
|
||||
}
|
||||
//SPI在一页(0~65535)内写入少于256个字节的数据
|
||||
//在指定地址开始写入最大256字节的数据
|
||||
//pBuffer:数据存储区
|
||||
//WriteAddr:开始写入的地址(24bit)
|
||||
//NumByteToWrite:要写入的字节数(最大256),该数不应该超过该页的剩余字节数!!!
|
||||
void W25QXX_Write_Page(uint8_t *pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite)
|
||||
{
|
||||
uint16_t i;
|
||||
W25QXX_Write_Enable(); //SET WEL
|
||||
W25QXX_CS_L(); //使能器件
|
||||
W25QXX_SPI_ReadWriteByte(W25X_PageProgram); //发送写页命令
|
||||
W25QXX_SPI_ReadWriteByte((uint8_t)((WriteAddr) >> 16)); //发送24bit地址
|
||||
W25QXX_SPI_ReadWriteByte((uint8_t)((WriteAddr) >> 8));
|
||||
W25QXX_SPI_ReadWriteByte((uint8_t)WriteAddr);
|
||||
for (i = 0; i < NumByteToWrite; i++)
|
||||
W25QXX_SPI_ReadWriteByte(pBuffer[i]); //循环写数
|
||||
W25QXX_CS_H(); //取消片选
|
||||
W25QXX_Wait_Busy(); //等待写入结束
|
||||
}
|
||||
//无检验写SPI FLASH
|
||||
//必须确保所写的地址范围内的数据全部为0XFF,否则在非0XFF处写入的数据将失败!
|
||||
//具有自动换页功能
|
||||
//在指定地址开始写入指定长度的数据,但是要确保地址不越界!
|
||||
//pBuffer:数据存储区
|
||||
//WriteAddr:开始写入的地址(24bit)
|
||||
//NumByteToWrite:要写入的字节数(最大65535)
|
||||
//CHECK OK
|
||||
void W25QXX_Write_NoCheck(uint8_t *pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite)
|
||||
{
|
||||
uint16_t pageremain;
|
||||
pageremain = 256 - WriteAddr % 256; //单页剩余的字节数
|
||||
if (NumByteToWrite <= pageremain)
|
||||
pageremain = NumByteToWrite; //不大于256个字节
|
||||
while (1)
|
||||
{
|
||||
W25QXX_Write_Page(pBuffer, WriteAddr, pageremain);
|
||||
if (NumByteToWrite == pageremain)
|
||||
break; //写入结束了
|
||||
else //NumByteToWrite>pageremain
|
||||
{
|
||||
pBuffer += pageremain;
|
||||
WriteAddr += pageremain;
|
||||
|
||||
NumByteToWrite -= pageremain; //减去已经写入了的字节数
|
||||
if (NumByteToWrite > 256)
|
||||
pageremain = 256; //一次可以写入256个字节
|
||||
else
|
||||
pageremain = NumByteToWrite; //不够256个字节了
|
||||
}
|
||||
};
|
||||
}
|
||||
//写SPI FLASH
|
||||
//在指定地址开始写入指定长度的数据
|
||||
//该函数带擦除操作!
|
||||
//pBuffer:数据存储区
|
||||
//WriteAddr:开始写入的地址(24bit)
|
||||
//NumByteToWrite:要写入的字节数(最大65535)
|
||||
uint8_t W25QXX_BUFFER[4096];
|
||||
void W25QXX_Write(uint8_t *pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite)
|
||||
{
|
||||
uint32_t secpos;
|
||||
uint16_t secoff;
|
||||
uint16_t secremain;
|
||||
uint16_t i;
|
||||
uint8_t *W25QXX_BUF;
|
||||
W25QXX_BUF = W25QXX_BUFFER;
|
||||
secpos = WriteAddr / 4096; //扇区地址
|
||||
secoff = WriteAddr % 4096; //在扇区内的偏移
|
||||
secremain = 4096 - secoff; //扇区剩余空间大小
|
||||
if (NumByteToWrite <= secremain)
|
||||
secremain = NumByteToWrite; //不大于4096个字节
|
||||
while (1)
|
||||
{
|
||||
W25QXX_Read(W25QXX_BUF, secpos * 4096, 4096); //读出整个扇区的内容
|
||||
for (i = 0; i < secremain; i++) //校验数据
|
||||
{
|
||||
if (W25QXX_BUF[secoff + i] != 0XFF)
|
||||
break; //需要擦除
|
||||
}
|
||||
if (i < secremain) //需要擦除
|
||||
{
|
||||
W25QXX_Erase_Sector(secpos); //擦除这个扇区
|
||||
for (i = 0; i < secremain; i++) //复制
|
||||
{
|
||||
W25QXX_BUF[i + secoff] = pBuffer[i];
|
||||
}
|
||||
W25QXX_Write_NoCheck(W25QXX_BUF, secpos * 4096, 4096); //写入整个扇区
|
||||
|
||||
}
|
||||
else
|
||||
W25QXX_Write_NoCheck(pBuffer, WriteAddr, secremain); //写已经擦除了的,直接写入扇区剩余区间.
|
||||
if (NumByteToWrite == secremain)
|
||||
break; //写入结束了
|
||||
else //写入未结束
|
||||
{
|
||||
secpos++; //扇区地址增1
|
||||
secoff = 0; //偏移位置为0
|
||||
|
||||
pBuffer += secremain; //指针偏移
|
||||
WriteAddr += secremain; //写地址偏移
|
||||
NumByteToWrite -= secremain; //字节数递减
|
||||
if (NumByteToWrite > 4096)
|
||||
secremain = 4096; //下一个扇区还是写不完
|
||||
else
|
||||
secremain = NumByteToWrite; //下一个扇区可以写完了
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
//擦除整个芯片
|
||||
//等待时间超长...
|
||||
void W25QXX_Erase_Chip(void)
|
||||
{
|
||||
W25QXX_Write_Enable(); //SET WEL
|
||||
W25QXX_Wait_Busy();
|
||||
W25QXX_CS_L(); //使能器件
|
||||
W25QXX_SPI_ReadWriteByte(W25X_ChipErase); //发送片擦除命令
|
||||
W25QXX_CS_H(); //取消片选
|
||||
W25QXX_Wait_Busy(); //等待芯片擦除结束
|
||||
}
|
||||
//擦除一个扇区
|
||||
//Dst_Addr:扇区地址 根据实际容量设置
|
||||
//擦除一个山区的最少时间:150ms
|
||||
void W25QXX_Erase_Sector(uint32_t Dst_Addr)
|
||||
{
|
||||
//监视falsh擦除情况,测试用
|
||||
Dst_Addr *= 4096;
|
||||
W25QXX_Write_Enable(); //SET WEL
|
||||
W25QXX_Wait_Busy();
|
||||
W25QXX_CS_L(); //使能器件
|
||||
W25QXX_SPI_ReadWriteByte(W25X_SectorErase); //发送扇区擦除指令
|
||||
W25QXX_SPI_ReadWriteByte((uint8_t)((Dst_Addr) >> 16)); //发送24bit地址
|
||||
W25QXX_SPI_ReadWriteByte((uint8_t)((Dst_Addr) >> 8));
|
||||
W25QXX_SPI_ReadWriteByte((uint8_t)Dst_Addr);
|
||||
W25QXX_CS_H(); //取消片选
|
||||
W25QXX_Wait_Busy(); //等待擦除完成
|
||||
}
|
||||
//等待空闲
|
||||
void W25QXX_Wait_Busy(void)
|
||||
{
|
||||
while ((W25QXX_ReadSR() & 0x01) == 0x01); // 等待BUSY位清空
|
||||
}
|
||||
//进入掉电模式
|
||||
void W25QXX_PowerDown(void)
|
||||
{
|
||||
W25QXX_CS_L(); //使能器件
|
||||
W25QXX_SPI_ReadWriteByte(W25X_PowerDown); //发送掉电命令
|
||||
W25QXX_CS_H(); //取消片选
|
||||
delay_us(3); //等待TPD
|
||||
}
|
||||
//唤醒
|
||||
void W25QXX_WAKEUP(void)
|
||||
{
|
||||
W25QXX_CS_L(); //使能器件
|
||||
W25QXX_SPI_ReadWriteByte(W25X_ReleasePowerDown); // send W25X_PowerDown command 0xAB
|
||||
W25QXX_CS_H(); //取消片选
|
||||
delay_us(3); //等待TRES1
|
||||
}
|
||||
|
|
@ -57,10 +57,12 @@ void PendSV_Handler(void);
|
|||
void SysTick_Handler(void);
|
||||
void DMA1_Channel1_IRQHandler(void);
|
||||
void TIM1_UP_TIM16_IRQHandler(void);
|
||||
void TIM1_TRG_COM_TIM17_IRQHandler(void);
|
||||
void USART2_IRQHandler(void);
|
||||
void USART3_IRQHandler(void);
|
||||
void EXTI15_10_IRQHandler(void);
|
||||
void TIM6_DAC_IRQHandler(void);
|
||||
void TIM7_IRQHandler(void);
|
||||
/* USER CODE BEGIN EFP */
|
||||
|
||||
/* USER CODE END EFP */
|
||||
|
|
|
@ -38,6 +38,10 @@ extern TIM_HandleTypeDef htim6;
|
|||
|
||||
extern TIM_HandleTypeDef htim7;
|
||||
|
||||
extern TIM_HandleTypeDef htim16;
|
||||
|
||||
extern TIM_HandleTypeDef htim17;
|
||||
|
||||
/* USER CODE BEGIN Private defines */
|
||||
|
||||
/* USER CODE END Private defines */
|
||||
|
@ -45,6 +49,8 @@ extern TIM_HandleTypeDef htim7;
|
|||
void MX_TIM3_Init(void);
|
||||
void MX_TIM6_Init(void);
|
||||
void MX_TIM7_Init(void);
|
||||
void MX_TIM16_Init(void);
|
||||
void MX_TIM17_Init(void);
|
||||
|
||||
void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim);
|
||||
|
||||
|
|
|
@ -101,6 +101,8 @@ int main(void)
|
|||
MX_USART2_UART_Init();
|
||||
MX_USART3_UART_Init();
|
||||
MX_TIM7_Init();
|
||||
MX_TIM16_Init();
|
||||
MX_TIM17_Init();
|
||||
/* USER CODE BEGIN 2 */
|
||||
|
||||
/* USER CODE END 2 */
|
||||
|
@ -173,18 +175,18 @@ void SystemClock_Config(void)
|
|||
* @param htim : TIM handle
|
||||
* @retval None
|
||||
*/
|
||||
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
|
||||
{
|
||||
/* USER CODE BEGIN Callback 0 */
|
||||
// void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
|
||||
// {
|
||||
// /* USER CODE BEGIN Callback 0 */
|
||||
|
||||
/* USER CODE END Callback 0 */
|
||||
if (htim->Instance == TIM1) {
|
||||
HAL_IncTick();
|
||||
}
|
||||
/* USER CODE BEGIN Callback 1 */
|
||||
// /* USER CODE END Callback 0 */
|
||||
// if (htim->Instance == TIM1) {
|
||||
// HAL_IncTick();
|
||||
// }
|
||||
// /* USER CODE BEGIN Callback 1 */
|
||||
|
||||
/* USER CODE END Callback 1 */
|
||||
}
|
||||
// /* USER CODE END Callback 1 */
|
||||
// }
|
||||
|
||||
/**
|
||||
* @brief This function is executed in case of error occurrence.
|
||||
|
|
|
@ -57,6 +57,9 @@
|
|||
/* External variables --------------------------------------------------------*/
|
||||
extern DMA_HandleTypeDef hdma_adc1;
|
||||
extern TIM_HandleTypeDef htim6;
|
||||
extern TIM_HandleTypeDef htim7;
|
||||
extern TIM_HandleTypeDef htim16;
|
||||
extern TIM_HandleTypeDef htim17;
|
||||
extern UART_HandleTypeDef huart2;
|
||||
extern UART_HandleTypeDef huart3;
|
||||
extern TIM_HandleTypeDef htim1;
|
||||
|
@ -225,12 +228,33 @@ void TIM1_UP_TIM16_IRQHandler(void)
|
|||
/* USER CODE BEGIN TIM1_UP_TIM16_IRQn 0 */
|
||||
|
||||
/* USER CODE END TIM1_UP_TIM16_IRQn 0 */
|
||||
HAL_TIM_IRQHandler(&htim1);
|
||||
if (htim1.Instance != NULL)
|
||||
{
|
||||
HAL_TIM_IRQHandler(&htim1);
|
||||
}
|
||||
if (htim16.Instance != NULL)
|
||||
{
|
||||
HAL_TIM_IRQHandler(&htim16);
|
||||
}
|
||||
/* USER CODE BEGIN TIM1_UP_TIM16_IRQn 1 */
|
||||
|
||||
/* USER CODE END TIM1_UP_TIM16_IRQn 1 */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles TIM1 trigger and commutation interrupts and TIM17 global interrupt.
|
||||
*/
|
||||
void TIM1_TRG_COM_TIM17_IRQHandler(void)
|
||||
{
|
||||
/* USER CODE BEGIN TIM1_TRG_COM_TIM17_IRQn 0 */
|
||||
|
||||
/* USER CODE END TIM1_TRG_COM_TIM17_IRQn 0 */
|
||||
HAL_TIM_IRQHandler(&htim17);
|
||||
/* USER CODE BEGIN TIM1_TRG_COM_TIM17_IRQn 1 */
|
||||
|
||||
/* USER CODE END TIM1_TRG_COM_TIM17_IRQn 1 */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles USART2 global interrupt / USART2 wake-up interrupt through EXTI line 26.
|
||||
*/
|
||||
|
@ -288,6 +312,20 @@ void TIM6_DAC_IRQHandler(void)
|
|||
/* USER CODE END TIM6_DAC_IRQn 1 */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles TIM7 global interrupt.
|
||||
*/
|
||||
void TIM7_IRQHandler(void)
|
||||
{
|
||||
/* USER CODE BEGIN TIM7_IRQn 0 */
|
||||
|
||||
/* USER CODE END TIM7_IRQn 0 */
|
||||
HAL_TIM_IRQHandler(&htim7);
|
||||
/* USER CODE BEGIN TIM7_IRQn 1 */
|
||||
|
||||
/* USER CODE END TIM7_IRQn 1 */
|
||||
}
|
||||
|
||||
/* USER CODE BEGIN 1 */
|
||||
|
||||
/* USER CODE END 1 */
|
||||
|
|
123
Core/Src/tim.c
123
Core/Src/tim.c
|
@ -27,6 +27,8 @@
|
|||
TIM_HandleTypeDef htim3;
|
||||
TIM_HandleTypeDef htim6;
|
||||
TIM_HandleTypeDef htim7;
|
||||
TIM_HandleTypeDef htim16;
|
||||
TIM_HandleTypeDef htim17;
|
||||
|
||||
/* TIM3 init function */
|
||||
void MX_TIM3_Init(void)
|
||||
|
@ -88,7 +90,7 @@ void MX_TIM6_Init(void)
|
|||
htim6.Instance = TIM6;
|
||||
htim6.Init.Prescaler = 71;
|
||||
htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
|
||||
htim6.Init.Period = 499;
|
||||
htim6.Init.Period = 29;
|
||||
htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
|
||||
if (HAL_TIM_Base_Init(&htim6) != HAL_OK)
|
||||
{
|
||||
|
@ -137,6 +139,60 @@ void MX_TIM7_Init(void)
|
|||
|
||||
/* USER CODE END TIM7_Init 2 */
|
||||
|
||||
}
|
||||
/* TIM16 init function */
|
||||
void MX_TIM16_Init(void)
|
||||
{
|
||||
|
||||
/* USER CODE BEGIN TIM16_Init 0 */
|
||||
|
||||
/* USER CODE END TIM16_Init 0 */
|
||||
|
||||
/* USER CODE BEGIN TIM16_Init 1 */
|
||||
|
||||
/* USER CODE END TIM16_Init 1 */
|
||||
htim16.Instance = TIM16;
|
||||
htim16.Init.Prescaler = 71;
|
||||
htim16.Init.CounterMode = TIM_COUNTERMODE_UP;
|
||||
htim16.Init.Period = 999;
|
||||
htim16.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
|
||||
htim16.Init.RepetitionCounter = 0;
|
||||
htim16.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
|
||||
if (HAL_TIM_Base_Init(&htim16) != HAL_OK)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
/* USER CODE BEGIN TIM16_Init 2 */
|
||||
|
||||
/* USER CODE END TIM16_Init 2 */
|
||||
|
||||
}
|
||||
/* TIM17 init function */
|
||||
void MX_TIM17_Init(void)
|
||||
{
|
||||
|
||||
/* USER CODE BEGIN TIM17_Init 0 */
|
||||
|
||||
/* USER CODE END TIM17_Init 0 */
|
||||
|
||||
/* USER CODE BEGIN TIM17_Init 1 */
|
||||
|
||||
/* USER CODE END TIM17_Init 1 */
|
||||
htim17.Instance = TIM17;
|
||||
htim17.Init.Prescaler = 71;
|
||||
htim17.Init.CounterMode = TIM_COUNTERMODE_UP;
|
||||
htim17.Init.Period = 199;
|
||||
htim17.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
|
||||
htim17.Init.RepetitionCounter = 0;
|
||||
htim17.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
|
||||
if (HAL_TIM_Base_Init(&htim17) != HAL_OK)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
/* USER CODE BEGIN TIM17_Init 2 */
|
||||
|
||||
/* USER CODE END TIM17_Init 2 */
|
||||
|
||||
}
|
||||
|
||||
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef* tim_pwmHandle)
|
||||
|
@ -180,10 +236,44 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
|
|||
/* USER CODE END TIM7_MspInit 0 */
|
||||
/* TIM7 clock enable */
|
||||
__HAL_RCC_TIM7_CLK_ENABLE();
|
||||
|
||||
/* TIM7 interrupt Init */
|
||||
HAL_NVIC_SetPriority(TIM7_IRQn, 0, 0);
|
||||
HAL_NVIC_EnableIRQ(TIM7_IRQn);
|
||||
/* USER CODE BEGIN TIM7_MspInit 1 */
|
||||
|
||||
/* USER CODE END TIM7_MspInit 1 */
|
||||
}
|
||||
else if(tim_baseHandle->Instance==TIM16)
|
||||
{
|
||||
/* USER CODE BEGIN TIM16_MspInit 0 */
|
||||
|
||||
/* USER CODE END TIM16_MspInit 0 */
|
||||
/* TIM16 clock enable */
|
||||
__HAL_RCC_TIM16_CLK_ENABLE();
|
||||
|
||||
/* TIM16 interrupt Init */
|
||||
HAL_NVIC_SetPriority(TIM1_UP_TIM16_IRQn, 15, 0);
|
||||
HAL_NVIC_EnableIRQ(TIM1_UP_TIM16_IRQn);
|
||||
/* USER CODE BEGIN TIM16_MspInit 1 */
|
||||
|
||||
/* USER CODE END TIM16_MspInit 1 */
|
||||
}
|
||||
else if(tim_baseHandle->Instance==TIM17)
|
||||
{
|
||||
/* USER CODE BEGIN TIM17_MspInit 0 */
|
||||
|
||||
/* USER CODE END TIM17_MspInit 0 */
|
||||
/* TIM17 clock enable */
|
||||
__HAL_RCC_TIM17_CLK_ENABLE();
|
||||
|
||||
/* TIM17 interrupt Init */
|
||||
HAL_NVIC_SetPriority(TIM1_TRG_COM_TIM17_IRQn, 0, 0);
|
||||
HAL_NVIC_EnableIRQ(TIM1_TRG_COM_TIM17_IRQn);
|
||||
/* USER CODE BEGIN TIM17_MspInit 1 */
|
||||
|
||||
/* USER CODE END TIM17_MspInit 1 */
|
||||
}
|
||||
}
|
||||
void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
|
||||
{
|
||||
|
@ -253,10 +343,41 @@ void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle)
|
|||
/* USER CODE END TIM7_MspDeInit 0 */
|
||||
/* Peripheral clock disable */
|
||||
__HAL_RCC_TIM7_CLK_DISABLE();
|
||||
|
||||
/* TIM7 interrupt Deinit */
|
||||
HAL_NVIC_DisableIRQ(TIM7_IRQn);
|
||||
/* USER CODE BEGIN TIM7_MspDeInit 1 */
|
||||
|
||||
/* USER CODE END TIM7_MspDeInit 1 */
|
||||
}
|
||||
else if(tim_baseHandle->Instance==TIM16)
|
||||
{
|
||||
/* USER CODE BEGIN TIM16_MspDeInit 0 */
|
||||
|
||||
/* USER CODE END TIM16_MspDeInit 0 */
|
||||
/* Peripheral clock disable */
|
||||
__HAL_RCC_TIM16_CLK_DISABLE();
|
||||
|
||||
/* TIM16 interrupt Deinit */
|
||||
HAL_NVIC_DisableIRQ(TIM1_UP_TIM16_IRQn);
|
||||
/* USER CODE BEGIN TIM16_MspDeInit 1 */
|
||||
|
||||
/* USER CODE END TIM16_MspDeInit 1 */
|
||||
}
|
||||
else if(tim_baseHandle->Instance==TIM17)
|
||||
{
|
||||
/* USER CODE BEGIN TIM17_MspDeInit 0 */
|
||||
|
||||
/* USER CODE END TIM17_MspDeInit 0 */
|
||||
/* Peripheral clock disable */
|
||||
__HAL_RCC_TIM17_CLK_DISABLE();
|
||||
|
||||
/* TIM17 interrupt Deinit */
|
||||
HAL_NVIC_DisableIRQ(TIM1_TRG_COM_TIM17_IRQn);
|
||||
/* USER CODE BEGIN TIM17_MspDeInit 1 */
|
||||
|
||||
/* USER CODE END TIM17_MspDeInit 1 */
|
||||
}
|
||||
}
|
||||
|
||||
/* USER CODE BEGIN 1 */
|
||||
|
|
|
@ -36,7 +36,7 @@
|
|||
</option>
|
||||
<option>
|
||||
<name>MacFile</name>
|
||||
<state></state>
|
||||
<state />
|
||||
</option>
|
||||
<option>
|
||||
<name>MemOverride</name>
|
||||
|
@ -60,7 +60,7 @@
|
|||
</option>
|
||||
<option>
|
||||
<name>CExtraOptions</name>
|
||||
<state></state>
|
||||
<state />
|
||||
</option>
|
||||
<option>
|
||||
<name>CFpuProcessor</name>
|
||||
|
@ -68,7 +68,7 @@
|
|||
</option>
|
||||
<option>
|
||||
<name>OCDDFArgumentProducer</name>
|
||||
<state></state>
|
||||
<state />
|
||||
</option>
|
||||
<option>
|
||||
<name>OCDownloadSuppressDownload</name>
|
||||
|
@ -104,7 +104,7 @@
|
|||
</option>
|
||||
<option>
|
||||
<name>MacFile2</name>
|
||||
<state></state>
|
||||
<state />
|
||||
</option>
|
||||
<option>
|
||||
<name>CDevice</name>
|
||||
|
@ -120,7 +120,7 @@
|
|||
</option>
|
||||
<option>
|
||||
<name>OCImagesPath1</name>
|
||||
<state></state>
|
||||
<state />
|
||||
</option>
|
||||
<option>
|
||||
<name>OCImagesSuppressCheck2</name>
|
||||
|
@ -128,7 +128,7 @@
|
|||
</option>
|
||||
<option>
|
||||
<name>OCImagesPath2</name>
|
||||
<state></state>
|
||||
<state />
|
||||
</option>
|
||||
<option>
|
||||
<name>OCImagesSuppressCheck3</name>
|
||||
|
@ -136,7 +136,7 @@
|
|||
</option>
|
||||
<option>
|
||||
<name>OCImagesPath3</name>
|
||||
<state></state>
|
||||
<state />
|
||||
</option>
|
||||
<option>
|
||||
<name>OverrideDefFlashBoard</name>
|
||||
|
@ -148,11 +148,11 @@
|
|||
</option>
|
||||
<option>
|
||||
<name>OCImagesOffset2</name>
|
||||
<state></state>
|
||||
<state />
|
||||
</option>
|
||||
<option>
|
||||
<name>OCImagesOffset3</name>
|
||||
<state></state>
|
||||
<state />
|
||||
</option>
|
||||
<option>
|
||||
<name>OCImagesUse1</name>
|
||||
|
@ -184,15 +184,15 @@
|
|||
</option>
|
||||
<option>
|
||||
<name>OCMulticoreWorkspace</name>
|
||||
<state></state>
|
||||
<state />
|
||||
</option>
|
||||
<option>
|
||||
<name>OCMulticoreSlaveProject</name>
|
||||
<state></state>
|
||||
<state />
|
||||
</option>
|
||||
<option>
|
||||
<name>OCMulticoreSlaveConfiguration</name>
|
||||
<state></state>
|
||||
<state />
|
||||
</option>
|
||||
<option>
|
||||
<name>OCDownloadExtraImage</name>
|
||||
|
@ -216,7 +216,7 @@
|
|||
</option>
|
||||
<option>
|
||||
<name>OCMulticoreSessionFile</name>
|
||||
<state></state>
|
||||
<state />
|
||||
</option>
|
||||
<option>
|
||||
<name>OCTpiuBaseOption</name>
|
||||
|
@ -228,7 +228,7 @@
|
|||
</option>
|
||||
<option>
|
||||
<name>OCOverrideSlavePath</name>
|
||||
<state></state>
|
||||
<state />
|
||||
</option>
|
||||
<option>
|
||||
<name>C_32_64Device</name>
|
||||
|
@ -244,11 +244,11 @@
|
|||
</option>
|
||||
<option>
|
||||
<name>AuthSdmManifest</name>
|
||||
<state></state>
|
||||
<state />
|
||||
</option>
|
||||
<option>
|
||||
<name>AuthSdmExplicitLib</name>
|
||||
<state></state>
|
||||
<state />
|
||||
</option>
|
||||
<option>
|
||||
<name>AuthEnforce</name>
|
||||
|
@ -277,7 +277,7 @@
|
|||
</option>
|
||||
<option>
|
||||
<name>OCSimPspConfigFile</name>
|
||||
<state></state>
|
||||
<state />
|
||||
</option>
|
||||
</data>
|
||||
</settings>
|
||||
|
@ -294,7 +294,7 @@
|
|||
</option>
|
||||
<option>
|
||||
<name>Fast Model</name>
|
||||
<state></state>
|
||||
<state />
|
||||
</option>
|
||||
<option>
|
||||
<name>CCADILogFileCheck</name>
|
||||
|
@ -461,7 +461,7 @@
|
|||
</option>
|
||||
<option>
|
||||
<name>OCProbeConfig</name>
|
||||
<state></state>
|
||||
<state />
|
||||
</option>
|
||||
<option>
|
||||
<name>CMSISDAPProbeConfigRadio</name>
|
||||
|
@ -473,7 +473,7 @@
|
|||
</option>
|
||||
<option>
|
||||
<name>ICpuName</name>
|
||||
<state></state>
|
||||
<state />
|
||||
</option>
|
||||
<option>
|
||||
<name>OCJetEmuParams</name>
|
||||
|
@ -481,7 +481,7 @@
|
|||
</option>
|
||||
<option>
|
||||
<name>CCCMSISDAPUsbSerialNo</name>
|
||||
<state></state>
|
||||
<state />
|
||||
</option>
|
||||
<option>
|
||||
<name>CCCMSISDAPUsbSerialNoSelect</name>
|
||||
|
@ -502,7 +502,7 @@
|
|||
</option>
|
||||
<option>
|
||||
<name>CE2UsbSerialNo</name>
|
||||
<state></state>
|
||||
<state />
|
||||
</option>
|
||||
<option>
|
||||
<name>CE2IdCodeEditB</name>
|
||||
|
@ -642,7 +642,7 @@
|
|||
</option>
|
||||
<option>
|
||||
<name>IjetCpuClockEdit</name>
|
||||
<state></state>
|
||||
<state />
|
||||
</option>
|
||||
<option>
|
||||
<name>IjetSwoPrescalerList</name>
|
||||
|
@ -735,7 +735,7 @@
|
|||
</option>
|
||||
<option>
|
||||
<name>OCProbeConfig</name>
|
||||
<state></state>
|
||||
<state />
|
||||
</option>
|
||||
<option>
|
||||
<name>IjetProbeConfigRadio</name>
|
||||
|
@ -755,7 +755,7 @@
|
|||
</option>
|
||||
<option>
|
||||
<name>ICpuName</name>
|
||||
<state></state>
|
||||
<state />
|
||||
</option>
|
||||
<option>
|
||||
<name>OCJetEmuParams</name>
|
||||
|
@ -781,7 +781,7 @@
|
|||
</option>
|
||||
<option>
|
||||
<name>CCIjetUsbSerialNo</name>
|
||||
<state></state>
|
||||
<state />
|
||||
</option>
|
||||
<option>
|
||||
<name>CCIjetUsbSerialNoSelect</name>
|
||||
|
@ -1004,7 +1004,7 @@
|
|||
</option>
|
||||
<option>
|
||||
<name>CCJLinkUsbSerialNo</name>
|
||||
<state></state>
|
||||
<state />
|
||||
</option>
|
||||
<option>
|
||||
<name>CCTcpIpAlt</name>
|
||||
|
@ -1013,11 +1013,11 @@
|
|||
</option>
|
||||
<option>
|
||||
<name>CCJLinkTcpIpSerialNo</name>
|
||||
<state></state>
|
||||
<state />
|
||||
</option>
|
||||
<option>
|
||||
<name>CCCpuClockEdit</name>
|
||||
<state></state>
|
||||
<state />
|
||||
</option>
|
||||
<option>
|
||||
<name>CCSwoClockAuto</name>
|
||||
|
@ -1074,7 +1074,7 @@
|
|||
</option>
|
||||
<option>
|
||||
<name>CCLmiftdiUsbSerialNo</name>
|
||||
<state></state>
|
||||
<state />
|
||||
</option>
|
||||
<option>
|
||||
<name>CCLmiftdiUsbSerialNoSelect</name>
|
||||
|
@ -1227,7 +1227,7 @@
|
|||
</option>
|
||||
<option>
|
||||
<name>CCSTLinkUsbSerialNo</name>
|
||||
<state></state>
|
||||
<state />
|
||||
</option>
|
||||
<option>
|
||||
<name>CCSTLinkUsbSerialNoSelect</name>
|
||||
|
@ -1240,7 +1240,7 @@
|
|||
</option>
|
||||
<option>
|
||||
<name>CCSTLinkDAPNumber</name>
|
||||
<state></state>
|
||||
<state />
|
||||
</option>
|
||||
<option>
|
||||
<name>CCSTLinkDebugAccessPortRadio</name>
|
||||
|
@ -1378,11 +1378,11 @@
|
|||
</option>
|
||||
<option>
|
||||
<name>TIPackage</name>
|
||||
<state></state>
|
||||
<state />
|
||||
</option>
|
||||
<option>
|
||||
<name>BoardFile</name>
|
||||
<state></state>
|
||||
<state />
|
||||
</option>
|
||||
<option>
|
||||
<name>DoLogfile</name>
|
||||
|
@ -1474,7 +1474,7 @@
|
|||
</option>
|
||||
<option>
|
||||
<name>CCXds100CpuClockEdit</name>
|
||||
<state></state>
|
||||
<state />
|
||||
</option>
|
||||
<option>
|
||||
<name>CCXds100SwoClockAuto</name>
|
||||
|
@ -1495,7 +1495,7 @@
|
|||
</option>
|
||||
<option>
|
||||
<name>CCXds100UsbSerialNo</name>
|
||||
<state></state>
|
||||
<state />
|
||||
</option>
|
||||
<option>
|
||||
<name>CCXds100UsbSerialNoSelect</name>
|
||||
|
|
|
@ -358,13 +358,14 @@
|
|||
<state>$PROJ_DIR$/../Drivers/STM32G4xx_HAL_Driver/Inc/Legacy</state>
|
||||
<state>$PROJ_DIR$/../Drivers/CMSIS/Device/ST/STM32G4xx/Include</state>
|
||||
<state>$PROJ_DIR$/../Drivers/CMSIS/Include</state>
|
||||
<state>$PROJ_DIR$/../Middlewares/ST/ARM/DSP/Inc</state>
|
||||
<state>$PROJ_DIR$\..\APP\application\Inc</state>
|
||||
<state>$PROJ_DIR$\..\APP\businessLogic\Inc</state>
|
||||
<state>$PROJ_DIR$\..\APP\functionalModule\Inc</state>
|
||||
<state>$PROJ_DIR$\..\APP\hardwareDriver\Inc</state>
|
||||
<state>$PROJ_DIR$\..\tools\RingQueue</state>
|
||||
<state>$PROJ_DIR$\..\tools</state>
|
||||
<state>$PROJ_DIR$\..\tools\TimeSliceOffset</state>
|
||||
<state>$PROJ_DIR$/../Middlewares/ST/ARM/DSP/Inc</state>
|
||||
</option>
|
||||
<option>
|
||||
<name>CCStdIncCheck</name>
|
||||
|
@ -616,7 +617,7 @@
|
|||
</option>
|
||||
<option>
|
||||
<name>AOutputFile</name>
|
||||
<state></state>
|
||||
<state>$FILE_BNAME$.o</state>
|
||||
</option>
|
||||
<option>
|
||||
<name>ALimitErrorsCheck</name>
|
||||
|
@ -1010,7 +1011,7 @@
|
|||
</option>
|
||||
<option>
|
||||
<name>IlinkTrustzoneImportLibraryOut</name>
|
||||
<state></state>
|
||||
<state>chargeController_import_lib.o</state>
|
||||
</option>
|
||||
<option>
|
||||
<name>OILinkExtraOption</name>
|
||||
|
@ -1102,6 +1103,72 @@
|
|||
<data />
|
||||
</settings>
|
||||
</configuration>
|
||||
<group>
|
||||
<name>APP</name>
|
||||
<group>
|
||||
<name>application</name>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\APP\application\Src\chargControl.c</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\APP\application\Src\comm.c</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\APP\application\Src\start.c</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\APP\application\Src\task.c</name>
|
||||
</file>
|
||||
</group>
|
||||
<group>
|
||||
<name>businessLogic</name>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\APP\businessLogic\Src\abnormalManage.c</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\APP\businessLogic\Src\bl_chargControl.c</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\APP\businessLogic\Src\bl_comm.c</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\APP\businessLogic\Src\inFlash.c</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\APP\businessLogic\Src\parameter.c</name>
|
||||
</file>
|
||||
</group>
|
||||
<group>
|
||||
<name>functionalModule</name>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\APP\functionalModule\Src\capture.c</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\APP\functionalModule\Src\flash.c</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\APP\functionalModule\Src\FM_GPIO.c</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\APP\functionalModule\Src\FM_TIM.c</name>
|
||||
</file>
|
||||
</group>
|
||||
<group>
|
||||
<name>hardwareDriver</name>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\APP\hardwareDriver\Src\HD_ADC.c</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\APP\hardwareDriver\Src\HD_GPIO.c</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\APP\hardwareDriver\Src\HD_TIM.c</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\APP\hardwareDriver\Src\w25qxx.c</name>
|
||||
</file>
|
||||
</group>
|
||||
</group>
|
||||
<group>
|
||||
<name>Application</name>
|
||||
<group>
|
||||
|
@ -1237,4 +1304,13 @@
|
|||
</group>
|
||||
</group>
|
||||
</group>
|
||||
<group>
|
||||
<name>tools</name>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\tools\RingQueue\ring_queue.c</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\tools\TimeSliceOffset\timeSliceOffset.c</name>
|
||||
</file>
|
||||
</group>
|
||||
</project>
|
||||
|
|
|
@ -1426,6 +1426,72 @@
|
|||
</data>
|
||||
</settings>
|
||||
</configuration>
|
||||
<group>
|
||||
<name>APP</name>
|
||||
<group>
|
||||
<name>application</name>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\APP\application\Src\chargControl.c</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\APP\application\Src\comm.c</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\APP\application\Src\start.c</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\APP\application\Src\task.c</name>
|
||||
</file>
|
||||
</group>
|
||||
<group>
|
||||
<name>businessLogic</name>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\APP\businessLogic\Src\abnormalManage.c</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\APP\businessLogic\Src\bl_chargControl.c</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\APP\businessLogic\Src\bl_comm.c</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\APP\businessLogic\Src\inFlash.c</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\APP\businessLogic\Src\parameter.c</name>
|
||||
</file>
|
||||
</group>
|
||||
<group>
|
||||
<name>functionalModule</name>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\APP\functionalModule\Src\capture.c</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\APP\functionalModule\Src\flash.c</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\APP\functionalModule\Src\FM_GPIO.c</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\APP\functionalModule\Src\FM_TIM.c</name>
|
||||
</file>
|
||||
</group>
|
||||
<group>
|
||||
<name>hardwareDriver</name>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\APP\hardwareDriver\Src\HD_ADC.c</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\APP\hardwareDriver\Src\HD_GPIO.c</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\APP\hardwareDriver\Src\HD_TIM.c</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\APP\hardwareDriver\Src\w25qxx.c</name>
|
||||
</file>
|
||||
</group>
|
||||
</group>
|
||||
<group>
|
||||
<name>Application</name>
|
||||
<group>
|
||||
|
@ -1561,4 +1627,13 @@
|
|||
</group>
|
||||
</group>
|
||||
</group>
|
||||
<group>
|
||||
<name>tools</name>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\tools\RingQueue\ring_queue.c</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\tools\TimeSliceOffset\timeSliceOffset.c</name>
|
||||
</file>
|
||||
</group>
|
||||
</project>
|
||||
|
|
|
@ -67,9 +67,11 @@ Mcu.CPN=STM32G431RBT6
|
|||
Mcu.Family=STM32G4
|
||||
Mcu.IP0=ADC1
|
||||
Mcu.IP1=ADC2
|
||||
Mcu.IP10=UART4
|
||||
Mcu.IP11=USART2
|
||||
Mcu.IP12=USART3
|
||||
Mcu.IP10=TIM16
|
||||
Mcu.IP11=TIM17
|
||||
Mcu.IP12=UART4
|
||||
Mcu.IP13=USART2
|
||||
Mcu.IP14=USART3
|
||||
Mcu.IP2=DMA
|
||||
Mcu.IP3=NVIC
|
||||
Mcu.IP4=RCC
|
||||
|
@ -78,7 +80,7 @@ Mcu.IP6=SYS
|
|||
Mcu.IP7=TIM3
|
||||
Mcu.IP8=TIM6
|
||||
Mcu.IP9=TIM7
|
||||
Mcu.IPNb=13
|
||||
Mcu.IPNb=15
|
||||
Mcu.Name=STM32G431R(6-8-B)Tx
|
||||
Mcu.Package=LQFP64
|
||||
Mcu.Pin0=PC13
|
||||
|
@ -110,14 +112,16 @@ Mcu.Pin31=VP_SYS_VS_tim1
|
|||
Mcu.Pin32=VP_SYS_VS_DBSignals
|
||||
Mcu.Pin33=VP_TIM6_VS_ClockSourceINT
|
||||
Mcu.Pin34=VP_TIM7_VS_ClockSourceINT
|
||||
Mcu.Pin35=VP_STMicroelectronics.X-CUBE-ALGOBUILD_VS_DSPOoLibraryJjLibrary_1.4.0_1.4.0
|
||||
Mcu.Pin35=VP_TIM16_VS_ClockSourceINT
|
||||
Mcu.Pin36=VP_TIM17_VS_ClockSourceINT
|
||||
Mcu.Pin37=VP_STMicroelectronics.X-CUBE-ALGOBUILD_VS_DSPOoLibraryJjLibrary_1.4.0_1.4.0
|
||||
Mcu.Pin4=PC2
|
||||
Mcu.Pin5=PA0
|
||||
Mcu.Pin6=PA1
|
||||
Mcu.Pin7=PA2
|
||||
Mcu.Pin8=PA3
|
||||
Mcu.Pin9=PA4
|
||||
Mcu.PinsNb=36
|
||||
Mcu.PinsNb=38
|
||||
Mcu.ThirdParty0=STMicroelectronics.X-CUBE-ALGOBUILD.1.4.0
|
||||
Mcu.ThirdPartyNb=1
|
||||
Mcu.UserConstants=
|
||||
|
@ -136,8 +140,10 @@ NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
|
|||
NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4
|
||||
NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
|
||||
NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:true\:false\:true\:false
|
||||
NVIC.TIM1_TRG_COM_TIM17_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
|
||||
NVIC.TIM1_UP_TIM16_IRQn=true\:15\:0\:false\:false\:true\:false\:true\:true
|
||||
NVIC.TIM6_DAC_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
|
||||
NVIC.TIM7_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
|
||||
NVIC.TimeBase=TIM1_UP_TIM16_IRQn
|
||||
NVIC.TimeBaseIP=TIM1
|
||||
NVIC.USART2_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
|
||||
|
@ -298,7 +304,7 @@ ProjectManager.ToolChainLocation=
|
|||
ProjectManager.UAScriptAfterPath=
|
||||
ProjectManager.UAScriptBeforePath=
|
||||
ProjectManager.UnderRoot=false
|
||||
ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_DMA_Init-DMA-false-HAL-true,4-MX_ADC1_Init-ADC1-false-HAL-true,5-MX_ADC2_Init-ADC2-false-HAL-true,6-MX_SPI1_Init-SPI1-false-HAL-true,7-MX_TIM3_Init-TIM3-false-HAL-true,8-MX_TIM6_Init-TIM6-false-HAL-true,9-MX_UART4_Init-UART4-false-HAL-true,10-MX_USART2_UART_Init-USART2-false-HAL-true,11-MX_USART3_UART_Init-USART3-false-HAL-true,12-MX_TIM7_Init-TIM7-false-HAL-true
|
||||
ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_DMA_Init-DMA-false-HAL-true,4-MX_ADC1_Init-ADC1-false-HAL-true,5-MX_ADC2_Init-ADC2-false-HAL-true,6-MX_SPI1_Init-SPI1-false-HAL-true,7-MX_TIM3_Init-TIM3-false-HAL-true,8-MX_TIM6_Init-TIM6-false-HAL-true,9-MX_UART4_Init-UART4-false-HAL-true,10-MX_USART2_UART_Init-USART2-false-HAL-true,11-MX_USART3_UART_Init-USART3-false-HAL-true,12-MX_TIM7_Init-TIM7-false-HAL-true,13-MX_TIM16_Init-TIM16-false-HAL-true
|
||||
RCC.ADC12Freq_Value=72000000
|
||||
RCC.AHBFreq_Value=72000000
|
||||
RCC.APB1Freq_Value=72000000
|
||||
|
@ -362,11 +368,17 @@ STMicroelectronics.X-CUBE-ALGOBUILD.1.4.0.DSPOoLibraryJjLibrary_Checked=true
|
|||
STMicroelectronics.X-CUBE-ALGOBUILD.1.4.0.IPParameters=LibraryCcDSPOoLibraryJjDSPOoLibrary
|
||||
STMicroelectronics.X-CUBE-ALGOBUILD.1.4.0.LibraryCcDSPOoLibraryJjDSPOoLibrary=true
|
||||
STMicroelectronics.X-CUBE-ALGOBUILD.1.4.0_SwParameter=LibraryCcDSPOoLibraryJjDSPOoLibrary\:true;
|
||||
TIM16.IPParameters=Prescaler,PeriodNoDither
|
||||
TIM16.PeriodNoDither=999
|
||||
TIM16.Prescaler=71
|
||||
TIM17.IPParameters=Prescaler,PeriodNoDither
|
||||
TIM17.PeriodNoDither=199
|
||||
TIM17.Prescaler=71
|
||||
TIM3.Channel-PWM\ Generation4\ CH4=TIM_CHANNEL_4
|
||||
TIM3.IPParameters=PeriodNoDither,Channel-PWM Generation4 CH4
|
||||
TIM3.PeriodNoDither=720
|
||||
TIM6.IPParameters=Prescaler,PeriodNoDither,TIM_MasterOutputTrigger
|
||||
TIM6.PeriodNoDither=499
|
||||
TIM6.PeriodNoDither=29
|
||||
TIM6.Prescaler=71
|
||||
TIM6.TIM_MasterOutputTrigger=TIM_TRGO_UPDATE
|
||||
TIM7.IPParameters=Prescaler,PeriodNoDither,TIM_MasterOutputTrigger
|
||||
|
@ -385,6 +397,10 @@ VP_SYS_VS_DBSignals.Mode=DisableDeadBatterySignals
|
|||
VP_SYS_VS_DBSignals.Signal=SYS_VS_DBSignals
|
||||
VP_SYS_VS_tim1.Mode=TIM1
|
||||
VP_SYS_VS_tim1.Signal=SYS_VS_tim1
|
||||
VP_TIM16_VS_ClockSourceINT.Mode=Enable_Timer
|
||||
VP_TIM16_VS_ClockSourceINT.Signal=TIM16_VS_ClockSourceINT
|
||||
VP_TIM17_VS_ClockSourceINT.Mode=Enable_Timer
|
||||
VP_TIM17_VS_ClockSourceINT.Signal=TIM17_VS_ClockSourceINT
|
||||
VP_TIM6_VS_ClockSourceINT.Mode=Enable_Timer
|
||||
VP_TIM6_VS_ClockSourceINT.Signal=TIM6_VS_ClockSourceINT
|
||||
VP_TIM7_VS_ClockSourceINT.Mode=Enable_Timer
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
/*
|
||||
* ring_queue.c
|
||||
*
|
||||
* Created on: 2024年6月21日
|
||||
* Created on: 2024年6月21日
|
||||
* Author: psx
|
||||
*/
|
||||
|
||||
|
||||
//循环队列
|
||||
//循环队列
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "ring_queue.h"
|
||||
|
@ -19,7 +19,7 @@
|
|||
//void rq_debug(const char *fmt, ...){};
|
||||
//#endif
|
||||
|
||||
//初始化队列
|
||||
//初始化队列
|
||||
int InitRingQueue(RingQueue *q, RQ_ElementType *buff, int size)
|
||||
{
|
||||
q->elems = buff;
|
||||
|
@ -28,8 +28,8 @@ int InitRingQueue(RingQueue *q, RQ_ElementType *buff, int size)
|
|||
return RQ_OK;
|
||||
}
|
||||
|
||||
//遍历队列,
|
||||
//消费者使用,故对生产者可能修改的rear先读取缓存
|
||||
//遍历队列,
|
||||
//消费者使用,故对生产者可能修改的rear先读取缓存
|
||||
int ShowRingQueue(RingQueue *q)
|
||||
{
|
||||
//int i;
|
||||
|
@ -37,25 +37,25 @@ int ShowRingQueue(RingQueue *q)
|
|||
|
||||
if(q->front == rear)
|
||||
{
|
||||
//rq_debug("队列为空\n");
|
||||
//rq_debug("队列为空\n");
|
||||
return RQ_ERROR;
|
||||
}
|
||||
//rq_debug("队列中的元素为:\n");
|
||||
//rq_debug("队列中的元素为:\n");
|
||||
//for(i=((q->front)%q->size); i != rear; i=((i+1)%q->size))
|
||||
//rq_debug(" %c\n",q->elems[i]);
|
||||
|
||||
//rq_debug("\n");
|
||||
//rq_debug("队首元素为%c\n",q->elems[q->front]);
|
||||
//rq_debug("队尾元素为%c\n",q->elems[rear - 1]);
|
||||
//rq_debug("队首元素为%c\n",q->elems[q->front]);
|
||||
//rq_debug("队尾元素为%c\n",q->elems[rear - 1]);
|
||||
return RQ_OK;
|
||||
}
|
||||
|
||||
//向队尾插入元素e
|
||||
//向队尾插入元素e
|
||||
int InRingQueue(RingQueue *q,RQ_ElementType e)
|
||||
{
|
||||
if(RingQueueFull(q))
|
||||
{
|
||||
//rq_debug("空间不足\n");
|
||||
//rq_debug("空间不足\n");
|
||||
return(RQ_OVERFLOW);
|
||||
}
|
||||
q->elems[q->rear] = e;
|
||||
|
@ -64,21 +64,21 @@ int InRingQueue(RingQueue *q,RQ_ElementType e)
|
|||
return RQ_OK;
|
||||
}
|
||||
|
||||
//从队首取回并删除元素
|
||||
//从队首取回并删除元素
|
||||
int OutRingQueue(RingQueue *q, RQ_ElementType *e)
|
||||
{
|
||||
if(RingQueueEmpty(q))
|
||||
{
|
||||
//rq_debug("队列为空\n");
|
||||
//rq_debug("队列为空\n");
|
||||
return RQ_ERROR;
|
||||
}
|
||||
*e = q->elems[q->front];
|
||||
//rq_debug("被删除的队首元素为%c\n",q->elems[q->front]);
|
||||
//rq_debug("被删除的队首元素为%c\n",q->elems[q->front]);
|
||||
q->front = (q->front+1) % q->size;
|
||||
return RQ_OK;
|
||||
}
|
||||
|
||||
//队列中的元素个数
|
||||
//队列中的元素个数
|
||||
int RingQueueLength(RingQueue *q)
|
||||
{
|
||||
return ((q->rear - q->front) + q->size) % q->size;
|
||||
|
|
|
@ -0,0 +1,149 @@
|
|||
/*
|
||||
* timeSliceOffset.c
|
||||
*
|
||||
* Created on: 2024年6月22日
|
||||
* Author: psx
|
||||
*/
|
||||
|
||||
#include "TimeSliceOffset.h"
|
||||
|
||||
|
||||
static STR_TimeSliceOffset* pTimeSliceList = NULL; /**< 时间片链表入口(仅入口,最终直接指向设备实体,所需无需申请空间。链表是单向线性链表) */
|
||||
|
||||
|
||||
/**
|
||||
* @brief 注册
|
||||
* @param[in] pTSlice 时间片对象指针
|
||||
* @param[in] taskFunc 任务函数的函数指针
|
||||
* @param[in] reloadVal 时间片重载值*tick基准即为任务执行间隔
|
||||
* @param[in] offset 偏移量,这是错位的精髓
|
||||
* @return 配置是否成功
|
||||
* - 0 注册成功
|
||||
* - 1 配置完成,但对象已存在,无需加入链表
|
||||
* - -1 pTSlice为空指针,无效对象
|
||||
* @par 注意事项:
|
||||
* - reloadVal设置为零即非定时任务,则offset偏移量无效
|
||||
* @par 示例:
|
||||
* @code
|
||||
*
|
||||
* TimeSliceOffset_Register(&m_timeSlice_1, Task_1, 0, 0); //0,即非定时任务(每次轮询都会执行)
|
||||
* TimeSliceOffset_Register(&m_timeSlice_2, Task_2, 10, 0); //10*1ms,即10ms运行一次
|
||||
* TimeSliceOffset_Register(&m_timeSlice_3, Task_3, 10, 5); //10*1ms,即10ms运行一次,与Task_2错开5ms,这样就不会集中到同一个10ms的时间点上
|
||||
*
|
||||
* @endcode
|
||||
*/
|
||||
int TimeSliceOffset_Register(STR_TimeSliceOffset* pTSlice, \
|
||||
void (*taskFunc)(void), \
|
||||
unsigned short reloadVal, \
|
||||
unsigned short offset)
|
||||
{
|
||||
if(NULL == pTSlice)return -1; /* 返回错误:无效对象 */
|
||||
|
||||
pTSlice->reloadVal = reloadVal;
|
||||
pTSlice->count = reloadVal + offset; /* 添加偏移量,使得同一数值的时间片错开 */
|
||||
pTSlice->taskFunc = taskFunc;
|
||||
if(0 == reloadVal) /* 非定时任务 */
|
||||
{
|
||||
pTSlice->runFlag = 1; /* 非定时任务可运行标志默认为一 */
|
||||
}
|
||||
else /* 定时任务 */
|
||||
{
|
||||
pTSlice->runFlag = 0; /* 定时任务可运行标志默认为零 */
|
||||
}
|
||||
|
||||
/*遍历链表,防止添加重复*/
|
||||
for(STR_TimeSliceOffset* pTemp = pTimeSliceList; pTemp != NULL; pTemp = pTemp->pNext)
|
||||
{
|
||||
if(pTemp == pTSlice)
|
||||
{
|
||||
return 1; /* 返回成功:配置完成,但对象已存在,无需加入链表 */
|
||||
}
|
||||
}
|
||||
/*加入链表*/
|
||||
pTSlice->pNext = pTimeSliceList;
|
||||
pTimeSliceList = pTSlice; /* 把对象加入到链表头部 */
|
||||
|
||||
return 0; /* 返回成功:注册成功 */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 取消注册
|
||||
* @return 取消配置是否成功
|
||||
* - 0 取消配置成功
|
||||
* - 1 取消配置成功,但对象不存在,无需从链表中删除
|
||||
* - -1 pTSlice为空指针,无效对象
|
||||
* @endcode
|
||||
*/
|
||||
int TimeSliceOffset_Unregister(STR_TimeSliceOffset* pTSlice)
|
||||
{
|
||||
if (NULL == pTSlice) return -1; /* 返回错误:无效对象 */
|
||||
|
||||
/* 遍历链表 */
|
||||
for (STR_TimeSliceOffset* pTemp = pTimeSliceList; pTemp != NULL; pTemp = pTemp->pNext) {
|
||||
if (pTemp->pNext == pTSlice) {
|
||||
pTemp->pNext = pTemp->pNext->pNext;
|
||||
return 0; /* 返回成功:取消注册 */
|
||||
} else if (pTemp == pTSlice) {
|
||||
pTimeSliceList = pTemp->pNext;
|
||||
// pTimeSliceList->pNext = pTemp->pNext->pNext;
|
||||
return 0; /* 返回成功:取消注册 */
|
||||
}
|
||||
}
|
||||
return 1; /* 返回成功:对象不存在于链表中 */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 启动时间片错位轮询(代替main的while循环)
|
||||
* @param null
|
||||
* @return null
|
||||
* @par 注意事项:
|
||||
* - null
|
||||
*/
|
||||
void TimeSliceOffset_Start(void)
|
||||
{
|
||||
while(1) /* 代替main的while循环 */
|
||||
{
|
||||
/*遍历时间片链表*/
|
||||
for(STR_TimeSliceOffset* pTemp = pTimeSliceList; pTemp != NULL; pTemp = pTemp->pNext)
|
||||
{
|
||||
if(pTemp->runFlag) /* 可运行则调用任务函数 */
|
||||
{
|
||||
if(pTemp->reloadVal) /* 重载值不为0,即定时任务 */
|
||||
{
|
||||
pTemp->runFlag = 0; /* 可运行标志清零,开启新一轮倒计时 */
|
||||
}
|
||||
pTemp->taskFunc();
|
||||
}
|
||||
|
||||
}
|
||||
// __WFI();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @brief 时间片生成(放到systick或定时器中断处理函数内)
|
||||
* @param null
|
||||
* @return null
|
||||
* @par 注意事项:
|
||||
* - null
|
||||
*/
|
||||
void TimeSliceOffset_Produce(void)
|
||||
{
|
||||
/*遍历时间片链表*/
|
||||
for(STR_TimeSliceOffset* pTemp = pTimeSliceList; pTemp != NULL; pTemp = pTemp->pNext)
|
||||
{
|
||||
if(pTemp->reloadVal) /* 重载值不为0,即定时任务 */
|
||||
{
|
||||
--pTemp->count; /* 计数器递减 */
|
||||
if(0 == pTemp->count) /* 计数器递减到零 */
|
||||
{
|
||||
pTemp->runFlag = 1; /* 允许执行 */
|
||||
pTemp->count = pTemp->reloadVal; /* 计数器重载 */
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,42 @@
|
|||
/*
|
||||
* timeSliceOffset.h
|
||||
*
|
||||
* Created on: 2024年6月22日
|
||||
* Author: psx
|
||||
*/
|
||||
|
||||
#ifndef DRIVERS_TIMESLICEOFFSET_TIMESLICEOFFSET_H_
|
||||
#define DRIVERS_TIMESLICEOFFSET_TIMESLICEOFFSET_H_
|
||||
|
||||
#include "pdebug.h"
|
||||
|
||||
/**时间片类*/
|
||||
typedef struct _STR_TimeSliceOffset{
|
||||
volatile unsigned char runFlag; /**< 可运行标志(1:可运行/0:不可运行) */
|
||||
volatile unsigned short count; /**< 计数器 */
|
||||
unsigned short reloadVal; /**< 重载值 */
|
||||
void (*taskFunc)(void); /**< 任务函数的函数指针 */
|
||||
struct _STR_TimeSliceOffset* pNext; /**< 指向下一个对象 */
|
||||
}STR_TimeSliceOffset;
|
||||
|
||||
|
||||
/********************************************函数声明********************************************/
|
||||
|
||||
|
||||
/* 注册 */
|
||||
int TimeSliceOffset_Register(STR_TimeSliceOffset* pTSlice, \
|
||||
void (*taskFunc)(void), \
|
||||
unsigned short reloadVal, \
|
||||
unsigned short offset);
|
||||
|
||||
/* 取消注册 */
|
||||
int TimeSliceOffset_Unregister(STR_TimeSliceOffset* pTSlice);
|
||||
|
||||
/* 启动时间片错位轮询(代替main的while循环) */
|
||||
void TimeSliceOffset_Start(void);
|
||||
|
||||
/* 时间片生成(放到systick或定时器中断处理函数内) */
|
||||
void TimeSliceOffset_Produce(void);
|
||||
|
||||
|
||||
#endif /* DRIVERS_TIMESLICEOFFSET_TIMESLICEOFFSET_H_ */
|
|
@ -7,7 +7,7 @@ typedef enum {
|
|||
MPPT = 1, /* 最大功率充电 */
|
||||
constantVoltage = 2, /* 恒压充电 */
|
||||
floatCharg = 3 /* 浮充充电 */
|
||||
}chargControlMode;
|
||||
}_chargControlMode;
|
||||
|
||||
|
||||
#endif
|
||||
|
|
|
@ -4,18 +4,18 @@
|
|||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include "uart_dev.h"
|
||||
#include "pdebug.h"
|
||||
// #include "uart_dev.h"
|
||||
// #include "pdebug.h"
|
||||
|
||||
/* Comment out this define to include debug messages */
|
||||
//#define NDEBUG
|
||||
#define NDEBUG
|
||||
|
||||
#define log_info_enable 1
|
||||
#define log_warn_enable 0
|
||||
#define log_error_enable 0
|
||||
|
||||
/* Comment out this define to include log messages */
|
||||
//#define NLOG
|
||||
#define NLOG
|
||||
|
||||
#ifdef NDEBUG
|
||||
#define debug(M, ...) do {}while(0)
|
||||
|
|
Loading…
Reference in New Issue