1. 程式人生 > 實用技巧 >HAL庫呼叫RTC晶片SD3178示例

HAL庫呼叫RTC晶片SD3178示例

HAL庫呼叫RTC晶片SD3178程式碼如下:

1、用到函式HAL_I2C_Mem_Write(); //帶裝置地址,暫存器地址

extern I2C_HandleTypeDef hi2c2;

/****************** 本地變數 **********************/
u8    data_Buf[8];
u8    VBAT_Buf[2];
u16    VBAT_VAL;
Time_Def time_init={0x01,0x19,0x12,0x05,0x23,0x10,0x20};    //初始化實時時間2020-10-23 12:19:01
Time_Def Alarm_init={0x30,0x19
,0x17,0x00,0x15,0x08,0x18}; //初始化報警時間 Time_Def sysTime; /********************************************* * 函式名:WriteRTC_Enable * 描 述:RTC寫允許程式 * 輸 入:無 * 輸 出:TRUE:操作成功,FALSE:操作失敗 ********************************************/ HAL_StatusTypeDef WriteRTC_Enable(void) { uint8_t ret=0x80; static
HAL_StatusTypeDef i; i = HAL_I2C_Mem_Write(&hi2c2,RTC_Address,CTR2,I2C_MEMADD_SIZE_8BIT,&ret,1,100); ret=0x84; i = HAL_I2C_Mem_Write(&hi2c2,RTC_Address,CTR1,I2C_MEMADD_SIZE_8BIT,&ret,1,100); return i; } /********************************************* * 函式名:WriteRTC_Disable * 描 述:RTC寫禁止程式 * 輸 入:無 * 輸 出:TRUE:操作成功,FALSE:操作失敗 *******************************************
*/ HAL_StatusTypeDef WriteRTC_Disable(void) { uint8_t ret[]={0x0,0x0}; static HAL_StatusTypeDef i; i = HAL_I2C_Mem_Write(&hi2c2,RTC_Address,CTR1,I2C_MEMADD_SIZE_8BIT,ret,2,100); return i; } /********************************************* * 函式名:RTC_WriteDate * 描 述:寫RTC實時資料暫存器 * 輸 入:時間結構體指標 * 輸 出:TRUE:操作成功,FALSE:操作失敗 ********************************************/ HAL_StatusTypeDef RTC_WriteDate(Time_Def *psRTC) //寫時間操作要求一次對實時時間暫存器(00H~06H)依次寫入, { //不可以單獨對7個時間資料中的某一位進行寫操作,否則可能會引起時間資料的錯誤進位. //要修改其中某一個數據 , 應一次性寫入全部 7 個實時時鐘資料. static HAL_StatusTypeDef i; psRTC->hour=psRTC->hour|0x80; i =I2CWriteSerial(RTC_Address, 0, 7, (uint8_t *)psRTC); return i; } /********************************************* * 函式名:RTC_ReadDate * 描 述:讀RTC實時資料暫存器 * 輸 入:時間結構體指標 * 輸 出:TRUE:操作成功,FALSE:操作失敗 ********************************************/ HAL_StatusTypeDef RTC_ReadDate(Time_Def *psRTC) { static HAL_StatusTypeDef i; i=I2CReadSerial(RTC_Address, 0, 7, (uint8_t *)psRTC); psRTC->hour=psRTC->hour & 0x7F; return i; } /********************************************* * 函式名 :I2CWriteSerial * 描 述 :I2C在指定地址寫N位元組資料 * Device_Addr:I2C裝置地址 * Address :內部地址 * length :位元組長度 * ps :快取區指標 * 輸出 :TRUE 成功,FALSE 失敗 ********************************************/ HAL_StatusTypeDef I2CWriteSerial(u8 DeviceAddress, u8 Address, u8 length, u8 *ps) { static HAL_StatusTypeDef i; if(DeviceAddress == RTC_Address) WriteRTC_Enable(); i = HAL_I2C_Mem_Write(&hi2c2,DeviceAddress,Address,I2C_MEMADD_SIZE_8BIT,ps,length,100); HAL_Delay(5); if(DeviceAddress == RTC_Address) WriteRTC_Disable(); return i; } /********************************************* * 函式名 :I2CReadSerial * 描 述 :I2C在指定地址寫N位元組資料 * Device_Addr:I2C裝置地址 * Address :內部地址 * length :位元組長度 * ps :快取區指標 * 輸出 :TRUE 成功,FALSE 失敗 ********************************************/ HAL_StatusTypeDef I2CReadSerial(u8 DeviceAddress, u8 Address, u8 length, u8 *ps) { static HAL_StatusTypeDef i; if(DeviceAddress == RTC_Address) WriteRTC_Enable(); i=HAL_I2C_Mem_Read(&hi2c2,DeviceAddress,Address,I2C_MEMADD_SIZE_8BIT,ps,length,100); HAL_Delay(5); if(DeviceAddress == RTC_Address) WriteRTC_Disable(); return i; } /********************************************* * 函式名:Set_CountDown * 描 述:設定倒計時中斷 * 輸 入:CountDown_Init 倒計時中斷結構體指標 * 輸 出:無 ********************************************/ void Set_CountDown(CountDown_Def *CountDown_Init) { u8 buf[6]; u8 tem=0xF0; buf[0] = (CountDown_Init->IM<<6)|0xB4; //10H buf[1] = CountDown_Init->d_clk<<4; //11H buf[2] = 0; //12H buf[3] = CountDown_Init->init_val & 0x0000FF; //13H buf[4] = (CountDown_Init->init_val & 0x00FF00) >> 8;//14H buf[5] = (CountDown_Init->init_val & 0xFF0000) >> 16;//15H I2CWriteSerial(RTC_Address,CTR2,1,&tem); I2CWriteSerial(RTC_Address,CTR2,6,buf); } /********************************************* * 函式名:Set_Alarm * 描 述:設定報警中斷(鬧鐘功能) * Enable_config:使能設定 * psRTC:報警時間的時間結構體指標 * 輸 出:無 ********************************************/ void Set_Alarm(u8 Enable_config, Time_Def *psRTC) { u8 buf[10]; buf[0] = psRTC->second; buf[1] = psRTC->minute; buf[2] = psRTC->hour; buf[3] = 0; buf[4] = psRTC->day; buf[5] = psRTC->month; buf[6] = psRTC->year; buf[7] = Enable_config; buf[8] = 0xFF; buf[9] = 0x92; I2CWriteSerial(RTC_Address,Alarm_SC,10,buf); } /********************************************* * 函式名:SetFrq * 描 述:設定RTC頻率中斷,從INT腳輸出頻率方波 * 輸 入:頻率值 * 輸 出:無 ********************************************/ void SetFrq(enum Freq F_Out) { u8 buf[2]; buf[0] = 0xA1; buf[1] = F_Out; I2CWriteSerial(RTC_Address,CTR2,2,buf); } /********************************************* * 函式名:ClrINT * 描 述:禁止中斷 * int_EN:中斷型別 INTDE、INTDE、INTDE * 輸 出:無 ********************************************/ void ClrINT(u8 int_EN) { u8 buf; buf = 0x80 & (~int_EN); I2CWriteSerial(RTC_Address,CTR2,1,&buf); } /*********************************************END OF FILE**********************/