电源管理芯片MAX17048驱动

  • 芯片功能
  • 电路
  • 配置
  • 代码
  • 关于电量补偿

最近调试MAX17048,做个简单的记录。
基于STM32H743

芯片功能

MAX17048为小尺寸、微功耗电池电量计,用于手持及便携产品的锂离子(Li+)电池。
MAX17048配置工作在单节锂电池,MAX17049配置工作在2节串联锂电池,两者都是标准I2C接口通讯。

电路

配置

打开图形化配置工具Cubemax,选择快速模式以支持400Khz,7Bit地址,开启中断,GPIO上拉


代码

/***  @file Voltameter_Port.c**  @date 2021-03-04**  @author aron566**  @copyright Copyright (c) 2021 aron566 <aron566@163.com>.**  @brief 电池电量监控接口**  @details 1、SCL RISE MIN KEEP 20ns*           2、SCL FALL MIN KEEP 20ns*           3、写: S. SAddr W. A. MAddr. A. Data0. A. Data1. A. P*           4、读: 先写S. SAddr W. A. MAddr. A 再读 Sr. SAddr R. A. Data0. A. Data1. N. P*           5、使用Fastmode 最高速率400Khz**  @version V1.0*/
#ifdef __cplusplus ///<use C compiler
extern "C" {#endif
/** Includes -----------------------------------------------------------------*/
/* Private includes ----------------------------------------------------------*/
#include "main.h"
#include "Voltameter_Port.h"
/** Private typedef ----------------------------------------------------------*/
/** Private macros -----------------------------------------------------------*/
#define ENABLE_MAX17048_DEBUG   0/**< 启动打印调试*/
/*MAX17048设备I2C地址*/
#define DEV_ADDR                0x6C
/*MAX17048设备I2C写操作地址*/
#define DEV_ADDR_WRITE          (DEV_ADDR|0x00)
/*MAX17048设备I2C读操作地址*/
#define DEV_ADDR_READ           (DEV_ADDR|0x01)/*MAX17048寄存器地址*/
#define REG_V_CELL              0x02
#define REG_SOC                 0x04
#define REG_MODE                0x06
#define REG_VERSION             0x08
#define REG_HIBRT               0x0A
#define REG_CONFIG              0x0C
#define REG_VALRT               0x14
#define REG_CRATE               0x16
#define REG_V_RESET             0x18
#define REG_STATUS              0x1A#define REG_TABLE               0x40/**< REG RANGE:0x40 to 0x70*/
#define REG_TABLE_END           0x70#define REG_CMD                 0xFE/*16BIT位*/
#define REG_BIT0                (1U<<0)
#define REG_BIT1                (1U<<1)
#define REG_BIT2                (1U<<2)
#define REG_BIT3                (1U<<3)
#define REG_BIT4                (1U<<4)
#define REG_BIT5                (1U<<5)
#define REG_BIT6                (1U<<6)
#define REG_BIT7                (1U<<7)
#define REG_BIT8                (1U<<8)
#define REG_BIT9                (1U<<9)
#define REG_BIT10               (1U<<10)
#define REG_BIT11               (1U<<11)
#define REG_BIT12               (1U<<12)
#define REG_BIT13               (1U<<13)
#define REG_BIT14               (1U<<14)
#define REG_BIT15               (1U<<15)
/** Private constants --------------------------------------------------------*/
/** Public variables ---------------------------------------------------------*/
extern I2C_HandleTypeDef hi2c1;
/** Private variables --------------------------------------------------------*/
static uint16_t Battery_Soc = 0;/**< 电池电量百分比*/
static uint16_t Battery_Voltage = 0;/**< 电池电压*/
static uint8_t Send_Val_Buf[2];
static uint8_t Reg_Val_Buf[2];
/** Private function prototypes ----------------------------------------------*/
#if ENABLE_MAX17048_DEBUG
static void Display_Alarm_Info(uint8_t Alarm_Value);
#endif
static void I2C_State_Reset(void);
static void Power_On_Reset(void);
static uint16_t Read_Vcell_Update(uint32_t Block_Time);
static uint16_t Read_Soc_Update(uint32_t Block_Time);
/** Private user code --------------------------------------------------------*/
/** Private application code -------------------------------------------------*/
/*******************************************************************************
*
*       Static code
*
********************************************************************************
*/
/********************************************************************* @brief   I2C 异常状态恢复* @param   [in]None.* @return  None.* @author  aron566* @version V1.0* @date    2021-03-09*******************************************************************/
static inline void I2C_State_Reset(void)
{__HAL_I2C_DISABLE(&hi2c1);HAL_Delay(1);__HAL_I2C_ENABLE(&hi2c1);
}/********************************************************************* @brief   MAX17048 报警信息打印* @param   [in]None.* @return  None.* @author  aron566* @version V1.0* @date    2021-03-08*******************************************************************/
#if ENABLE_MAX17048_DEBUG
static void Display_Alarm_Info(uint8_t Alarm_Value)
{if(Alarm_Value & REG_BIT0){printf("POWER ON IC NO CONFIG.\r\n");}if(Alarm_Value & REG_BIT1){printf("VCELL HIGH THAN ALRT.VALRTMAX.\r\n");}if(Alarm_Value & REG_BIT2){printf("VCELL LOW THAN ALRT.VALRTMIN.\r\n");}if(Alarm_Value & REG_BIT3){printf("VOLTAGE RESET.\r\n");}if(Alarm_Value & REG_BIT4){printf("SOC LOW THAN CONFIG.ATHD.\r\n");}if(Alarm_Value & REG_BIT5){printf("SOC CHANGE VALUE ARRIVE %%1.\r\n");}if(Alarm_Value & REG_BIT6){printf("ENABLE VOLTAGE RESET ALARM.\r\n");}
}
#endif
/********************************************************************* @brief   MAX17048 上电复位* @param   [in]None.* @return  None.* @author  aron566* @version V1.0* @date    2021-03-08*******************************************************************/
static void Power_On_Reset(void)
{/*复位上电*/uint8_t WriteData[3] = {REG_CMD, 0x54, 0x00};HAL_I2C_Master_Transmit(&hi2c1, DEV_ADDR_WRITE, WriteData, 3, 100);/*Wait*/HAL_Delay(100);/*快速启动*/WriteData[0] = REG_MODE;WriteData[1] = 0x00;WriteData[2] |= REG_BIT6;/*使能休眠模式*/WriteData[2] |= REG_BIT5;HAL_I2C_Master_Transmit(&hi2c1, DEV_ADDR_WRITE, WriteData, 3, 100);
}/********************************************************************* @brief   清除MAX17048 报警状态* @param   [in]None.* @return  None.* @author  aron566* @version V1.0* @date    2021-03-04*******************************************************************/
static void Alarm_State_Reset(void)
{uint8_t RegData = 0;uint8_t RecData[2] = {0};uint8_t SendData[3] = {0};/*读取报警状态信息*/RegData = REG_STATUS;HAL_I2C_Master_Transmit(&hi2c1, DEV_ADDR_WRITE, &RegData, 1, 100);HAL_I2C_Master_Receive(&hi2c1, DEV_ADDR_READ, RecData, 2, 100);
#if ENABLE_MAX17048_DEBUG  printf("Status REG:%02X:VAL:%02X%02X.\r\n", RegData, RecData[0], RecData[1]);Display_Alarm_Info(RecData[0]);
#endif/*清除报警信息*/SendData[0] = RegData;SendData[1] = (RecData[0]&(~0x7F));SendData[2] = RecData[1];HAL_I2C_Master_Transmit(&hi2c1, DEV_ADDR_WRITE, SendData, 3, 100);
#if ENABLE_MAX17048_DEBUG  printf("Set Status REG:%02X:VAL:%02X%02X.\r\n", RegData, SendData[1], SendData[2]);
#endif
#if ENABLE_MAX17048_DEBUG  HAL_I2C_Master_Transmit(&hi2c1, DEV_ADDR_WRITE, &RegData, 1, 100);HAL_I2C_Master_Receive(&hi2c1, DEV_ADDR_READ, RecData, 2, 100);printf("After Status REG:%02X:VAL:%02X%02X.\r\n", RegData, RecData[0], RecData[1]);
#endif/*读取配置信息*/RegData = REG_CONFIG;HAL_I2C_Master_Transmit(&hi2c1, DEV_ADDR_WRITE, &RegData, 1, 100);HAL_I2C_Master_Receive(&hi2c1, DEV_ADDR_READ, RecData, 2, 100);
#if ENABLE_MAX17048_DEBUG  printf("Config REG:%02X:VAL:%02X%02X.\r\n", RegData, RecData[0], RecData[1]);
#endif/*设置报警阈值 BIT0-4 可设范围1-32% 设置10%则32-10*/RecData[1] = ((RecData[1]&0xE0)|(32-10));/*清除报警状态位 BIT5*/RecData[1] &= (~REG_BIT5);SendData[0] = RegData;SendData[1] = RecData[0];SendData[2] = RecData[1];HAL_I2C_Master_Transmit(&hi2c1, DEV_ADDR_WRITE, SendData, 3, 100);
#if ENABLE_MAX17048_DEBUG  printf("Set Config REG:%02X:VAL:%02X%02X.\r\n", RegData, SendData[1], SendData[2]);
#endif
#if ENABLE_MAX17048_DEBUG  HAL_I2C_Master_Transmit(&hi2c1, DEV_ADDR_WRITE, &RegData, 1, 100);HAL_I2C_Master_Receive(&hi2c1, DEV_ADDR_READ, RecData, 2, 100);printf("After Config REG:%02X:VAL:%02X%02X.\r\n", RegData, RecData[0], RecData[1]);
#endif/*读取版本信息*/
#if ENABLE_MAX17048_DEBUGRegData = REG_VERSION;HAL_I2C_Master_Transmit(&hi2c1, DEV_ADDR_WRITE, &RegData, 1, 100);HAL_I2C_Master_Receive(&hi2c1, DEV_ADDR_READ, RecData, 2, 100);printf("Version REG:%02X:VAL:%02X%02X.\r\n", RegData, RecData[0], RecData[1]);
#endif
}/********************************************************************* @brief   读取MAX17048 Vcell电压数值 78.125uV/Vcell* @param   [in]Block_Time 阻塞读取时间* @return  电量数据* @author  aron566* @version V1.0* @date    2021-03-04*******************************************************************/
static uint16_t Read_Vcell_Update(uint32_t Block_Time)
{Send_Val_Buf[0] = REG_V_CELL;if(Block_Time == 0){if(HAL_OK != HAL_I2C_Master_Transmit_IT(&hi2c1, DEV_ADDR_WRITE, Send_Val_Buf, 1)){return Battery_Voltage;}}else if(Block_Time > 0){if(HAL_OK != HAL_I2C_Master_Transmit(&hi2c1, DEV_ADDR_WRITE, Send_Val_Buf, 1, Block_Time)){return Battery_Voltage;}if(HAL_OK != HAL_I2C_Master_Receive(&hi2c1, DEV_ADDR_READ, Reg_Val_Buf, 2, Block_Time)){return Battery_Voltage;}Battery_Voltage = (Reg_Val_Buf[0]<<8)+Reg_Val_Buf[1];Battery_Voltage = (uint16_t)(((double)Battery_Voltage * 78.125)/1000000);return Battery_Voltage;}return Battery_Voltage;
}/********************************************************************* @brief   读取MAX17048 SOC(Battery state of charge)电量数值 1%/256* @param   [in]Block_Time 阻塞读取时间* @return  电量数据* @author  aron566* @version V1.0* @date    2021-03-04*******************************************************************/
static uint16_t Read_Soc_Update(uint32_t Block_Time)
{Send_Val_Buf[0] = REG_SOC;if(Block_Time == 0){if(HAL_OK != HAL_I2C_Master_Transmit_IT(&hi2c1, DEV_ADDR_WRITE, Send_Val_Buf, 1)){return Battery_Soc;}}else if(Block_Time > 0){if(HAL_OK != HAL_I2C_Master_Transmit(&hi2c1, DEV_ADDR_WRITE, Send_Val_Buf, 1, Block_Time)){I2C_State_Reset();return Battery_Soc;}if(HAL_OK != HAL_I2C_Master_Receive(&hi2c1, DEV_ADDR_READ, Reg_Val_Buf, 2, Block_Time)){return Battery_Soc;}uint16_t Battery_Soc_Temp = (Reg_Val_Buf[0]<<8) + Reg_Val_Buf[1];Battery_Soc_Temp /= 256;Battery_Soc = Battery_Soc_Temp > 100?100:Battery_Soc_Temp;return Battery_Soc;}return Battery_Soc;
}/** Public application code --------------------------------------------------*/
/*******************************************************************************
*
*       Public code
*
********************************************************************************
*/
/********************************************************************* @brief   I2C发送完成回调* @param   [in]None.* @return  None.* @author  aron566* @version V1.0* @date    2021-03-04*******************************************************************/
void Voltameter_Port_I2C_MasterTxCpltCallback(void)
{/*TODO:READ*/HAL_I2C_Master_Receive_IT(&hi2c1, DEV_ADDR_READ, Reg_Val_Buf, 2);
}/********************************************************************* @brief   I2C接收完成回调* @param   [in]None.* @return  None.* @author  aron566* @version V1.0* @date    2021-03-04*******************************************************************/
void Voltameter_Port_I2C_MasterRxCpltCallback(void)
{/*TODO:UPDATE VAL*/if(Send_Val_Buf[0] == REG_V_CELL){uint16_t Battery_Voltage_Temp = (Reg_Val_Buf[0]<<8)+Reg_Val_Buf[1];Battery_Voltage_Temp = (uint16_t)(((double)Battery_Voltage_Temp * 78.125)/1000000);Battery_Voltage = Battery_Voltage_Temp;}else if(Send_Val_Buf[0] == REG_SOC){uint16_t Battery_Soc_Temp = (Reg_Val_Buf[0]<<8) + Reg_Val_Buf[1];Battery_Soc_Temp /= 256;Battery_Soc = Battery_Soc_Temp > 100?100:Battery_Soc_Temp;}
}/********************************************************************* @brief   获取电池电量及电压信息* @param   [in]None* @return  电量数据* @author  aron566* @version V1.0* @date    2021-03-04*******************************************************************/
uint16_t Voltameter_Port_Get_Battery_Electric_Quantity(void)
{Read_Soc_Update(10);Read_Vcell_Update(0);return Battery_Soc;
}/********************************************************************* @brief   获取电池充电状态* @param   [in]None* @return  1 为充电状态* @author  aron566* @version V1.0* @date    2021-03-04*******************************************************************/
uint8_t Voltameter_Port_Get_Battery_Charge_State(void)
{if(HAL_GPIO_ReadPin(BAT_STAT_GPIO_Port, BAT_STAT_Pin) == GPIO_PIN_SET){return 1;}else{return 0;}
}/********************************************************************* @brief   MAX17048 休眠设置* @param   [in]Sleep_En 睡眠使能.* @return  None.* @author  aron566* @version V1.0* @date    2021-07-07*******************************************************************/
void Voltameter_Port_OnOff_Sleep(bool Sleep_En)
{ uint8_t RegData = 0;uint8_t RecData[2] = {0};uint8_t SendData[3] = {0};/*读取配置信息*/RegData = REG_CONFIG;HAL_I2C_Master_Transmit(&hi2c1, DEV_ADDR_WRITE, &RegData, 1, 100);HAL_I2C_Master_Receive(&hi2c1, DEV_ADDR_READ, RecData, 2, 100);
#if ENABLE_MAX17048_DEBUG  printf("Config REG:%02X:VAL:%02X%02X.\r\n", RegData, RecData[0], RecData[1]);
#endifSendData[1] = RegData;SendData[1] = RecData[0];SendData[2] = RecData[1];if(Sleep_En == true){/*进入休眠 config.sleep = 1*/SendData[1] |= REG_BIT7;}else{/*退出休眠 config.sleep = 0*/SendData[1] &= ~REG_BIT7;}HAL_I2C_Master_Transmit(&hi2c1, DEV_ADDR_WRITE, SendData, 3, 100);
}/********************************************************************* @brief   电池监控接口初始化* @param   [in]None* @return  None.* @author  aron566* @version V1.0* @date    2021-03-04*******************************************************************/
void Voltameter_Port_Init(void)
{/*上电复位MAX17048*/Power_On_Reset();/*报警复位*/Alarm_State_Reset();
}#ifdef __cplusplus ///<end extern c
}
#endif
/******************************** End of file *********************************/

关于电量补偿

芯片带配置温补的区域,不过温度检测的区域为电池温度,可能条件不允许。

#define RCOMP0                  0x97/**< 温度补偿值*/
static int8_t Rcomp = RCOMP0;
/********************************************************************* @brief   温度补偿* @param   [in]Temperatur 电池温度.* @return  None.* @author  aron566* @version V1.0* @date    2021-04-16*******************************************************************/
void MAX17048_Driver_Compensate(float Temperature)
{uint8_t RegData = 0;uint8_t RecData[2] = {0};uint8_t SendData[3] = {0};if(Temperature > 20) {Rcomp = (int8_t)(RCOMP0 + (Temperature - 20) * -0.5);}else {Rcomp = (int8_t)(RCOMP0 + (Temperature - 20) * -5.0);}/*读取配置数据*/RegData = REG_CONFIG;HAL_I2C_Master_Transmit(MAX17048_I2C_HANDLE, DEV_ADDR_WRITE, &RegData, 1, 100);HAL_I2C_Master_Receive(MAX17048_I2C_HANDLE, DEV_ADDR_READ, RecData, 2, 100);/*设置温度补偿RCOMP*/SendData[0] = RegData;SendData[1] = (uint8_t)Rcomp;SendData[2] = RecData[1];HAL_I2C_Master_Transmit(MAX17048_I2C_HANDLE, DEV_ADDR_WRITE, SendData, 3, 100);
}

手动补偿90%-100%电量区域

/*充电耗时记录*/
typedef struct rectification
{uint32_t Start_Time_Sec;// uint32_t End_Time_Sec;// uint32_t Next_Time_Sec;// uint32_t Elapsed;uint16_t Compensation_Soc;
}RECTIFICATION_Typedef_t;/*设备参考实测功率*/
#define DEVICE_REF_POWER        150   /**< 150mA/h*/
#define BATTERY_CAPACITY        1000  /**< 1000mAh*/
#define CAN_USE_MIN_TOTAL       (BATTERY_CAPACITY*60/DEVICE_REF_POWER)/*电量时间补偿记录*/
static RECTIFICATION_Typedef_t E_Record[11] = {0};/********************************************************************* @brief   修正补偿MAX17048 SOC(Battery state of charge)电量数值* @param   [in]Current_Soc 当前电量数值* @return  修正后电量数据* @author  aron566* @version V1.0* @date    2021-04-22*******************************************************************/
static uint16_t Soc_Compensation(uint16_t Current_Soc)
{static uint16_t last_soc_val = 0;uint16_t range_num = Current_Soc - 90;/*无需补偿*/if(Current_Soc == 100){return Current_Soc;}/*充电中进行补偿运算*/if(last_soc_val != Current_Soc && Current_Soc >= 90 && MAX17048_Driver_Get_Battery_Charge_State() == 1){E_Record[range_num].Start_Time_Sec = Timer_Port_Get_Current_Time(TIMER_SEC);E_Record[range_num].Compensation_Soc = Current_Soc;last_soc_val = Current_Soc;return Current_Soc;}if(last_soc_val == Current_Soc && Current_Soc >= 90 && MAX17048_Driver_Get_Battery_Charge_State() == 1){/*电量值在90%区域,补偿*/if(range_num < 2){if((Timer_Port_Get_Current_Time(TIMER_SEC) - E_Record[range_num].Start_Time_Sec) > 60*30){E_Record[range_num].Start_Time_Sec = Timer_Port_Get_Current_Time(TIMER_SEC);E_Record[range_num].Compensation_Soc += 1;}}else{uint32_t ref_time = E_Record[range_num].Start_Time_Sec - E_Record[range_num-1].Start_Time_Sec;uint32_t elapsed_time = Timer_Port_Get_Current_Time(TIMER_SEC) - E_Record[range_num].Start_Time_Sec;if(elapsed_time > ref_time && elapsed_time > 2*ref_time){E_Record[range_num].Start_Time_Sec = Timer_Port_Get_Current_Time(TIMER_SEC);E_Record[range_num-1].Start_Time_Sec = E_Record[range_num].Start_Time_Sec - ref_time;E_Record[range_num].Compensation_Soc += 1;}}E_Record[range_num].Compensation_Soc = E_Record[range_num].Compensation_Soc >= 100?100:E_Record[range_num].Compensation_Soc;return E_Record[range_num].Compensation_Soc;}/*电量值在90%区域,放电电量控制*/if(Current_Soc >= 90 && MAX17048_Driver_Get_Battery_Charge_State() == 0){/*属修正值*/if(E_Record[range_num].Compensation_Soc > Current_Soc){/*计算耗电时间*/uint32_t elapsed_time_min = (Timer_Port_Get_Current_Time(TIMER_SEC) - E_Record[range_num].Start_Time_Sec)/60;float pow = (float)elapsed_time_min/(float)CAN_USE_MIN_TOTAL;E_Record[range_num].Compensation_Soc = (uint16_t)((float)E_Record[range_num].Compensation_Soc - (100.f * pow));E_Record[range_num].Compensation_Soc = E_Record[range_num].Compensation_Soc < Current_Soc?Current_Soc:E_Record[range_num].Compensation_Soc;return E_Record[range_num].Compensation_Soc;}}return Current_Soc;
}

电源管理芯片MAX17048驱动相关推荐

  1. 电源管理芯片:nxp电源管理芯片的参考与设计

    电源管理芯片:nxp电源管理芯片的参考和设计充电和监控功能.我们的产品旨在满足工业.通信.汽车.消费.医疗市场等不同领域的电源设计应用需求.提供工业-领先的电池管理IC解决方案,以应对当今的设计挑战- ...

  2. 中国工程师最喜欢的10大TWS耳机电源管理芯片,钰泰ETA9084名列其中

    TWS耳机经过了几年的快速发展,技术的不断进步,推动了TWS耳机基础功能的不断完善,并且主动降噪.通话降噪.快速充电等新功能的加入,有效提升用户体验,具有了更加丰富的应用场景,越来越受到消费者的认可, ...

  3. 单节磷酸铁锂电池充电管理芯片IC驱动方案3.6V充电芯片手电筒_低压应急球泡灯适用

    单节磷酸铁锂电池充电管理芯片IC驱动方案3.6V充电芯片手电筒_低压应急球泡灯适用 2:品牌名称:泛海微 3方案特点: 4.(1)产品特点 特点:   3.6V独立的单节磷酸铁锂电池充电管理    ...

  4. 如何选择电源管理芯片

    目录 线性电源vs开关电源 输入输出电压范围 输入输出最大电压差 线性电源的耗散功率 电压降(drop voltage) 最大输出电流 输入输出电容 负载与负载电流 使能与Power Good   电 ...

  5. 电源管理芯片:nxp电源管理芯片的能量和组合

    nxp电源管理芯片是无线充电操控器等.用于汽车电气化和能源管理解决方案的电源管理芯片.nxp电源管理芯片可以供应经过验证.牢靠.一流的解决方案,在电源.线路调理和集成方面表现最佳.由电源管理芯片操作的 ...

  6. AP8851L 宽电压降压恒压DC-DC 电源管理芯片

    AP8851L 一款宽电压范围降压型 DC-DC 电源管理芯片,内部集成使能 开关控制.基准电源.误差放大器.过 热保护.限流保护.短路保护等功能, 非常适合在宽输入电压范围具有优良 的负载和线性调整 ...

  7. nxp电源管理芯片:我国电源芯片的市场现状

    nxp电源管理芯片:我国电源芯片的市场现状,同时包含众多非停产器材.电子能够供应全面的生产服务,包含规划.晶圆加工.封装.测验.可靠性验证和IP存档服务,通过交钥匙方式供应一站式解决方案,从而加快产品 ...

  8. 磷酸铁锂电池应用前景广阔,英集芯响应市场推出IP2366电源管理芯片

    正极材料是锂电池的核心材料之一,其性能直接影响锂电池的能量密度.安全性.寿命和应用等,占电池总材料成本中的比例超过30%.目前行业内常见的锂离子电池正极材料主要可分为磷酸铁锂(LFP).三元材料(NC ...

  9. CT0514是一个完善的单片锂离子电池恒流/恒压线形 电源管理芯片

    产品描述: CT0514是一个完善的单片锂离子电池恒流/恒压线形 电源管理芯片.它薄的尺寸和小的外包装使它便于便携应用. 更值得一提的是,CT0514专门设计适用于USB 的供电规 格.得益于内部的M ...

最新文章

  1. flash,tornada demo
  2. 利用TensorFlow实现多元线性回归
  3. ubuntu12.04手动安装virtualbox增强功能
  4. zend怎么保存php,Zend Framework页面缓存实例
  5. 【风险管理】信贷核心业务流程
  6. coroSync packmarker
  7. ios开发(6)uiimageView
  8. SAP JAM里的用户profile功能
  9. C# 数据结构--排序[下]
  10. SignalR ——Android实践
  11. wins宝塔安装提示已经有php,centOS安装宝塔提示报错
  12. 三层交换机配置实例及说明
  13. HDU1213How Many Tables
  14. 华为回应美新规:不涉及产品买卖;微软 GitHub 帐户疑被黑;GCC 10.1 发布 | 极客头条...
  15. python编程入门 pdf-Python编程从入门到精通.pdf
  16. 搭建springmvc项目遇到的问题
  17. java生成流程图_java源代码转换为流程图
  18. 如何利用MATLAB(plot 3函数和fplot3函数)绘制三维曲线?
  19. cad调了比例因子没反应_10个常见cad问题的解决方法!学会了这几招不再求人
  20. “好工作”的最关键指标:场景足够复杂、数据量足够大、杠杆率足够高

热门文章

  1. MySQL 日期时间类型精确到毫秒
  2. 【中土世界】贝烈瑞安德简介
  3. 逆向学习-UltraEdit安装
  4. python小游戏 拼图小游戏设计与实现
  5. Java访问权限(public、protected、友好的、private)定义
  6. 飞机大战(wsad上下左右,空格发射子弹,击中敌机加一分,分数达到10,20,30难度增加,敌机飞出显示屏幕游戏失败)
  7. 一起学JAVA 方法 局部变量 成员变量
  8. 201512-2消除类游戏
  9. 虎牙直播抓取,数据保存到Excel表格中
  10. ETL流程、数据流图及ETL过程解决方案