娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

STM32開發(fā) -- UTC、UNIX時(shí)間戳、北京時(shí)間之間的轉(zhuǎn)換

發(fā)布者:翠綠山水最新更新時(shí)間:2019-09-02 來源: eefocus關(guān)鍵字:STM32  UTC  UNIX時(shí)間戳  北京時(shí)間  轉(zhuǎn)換 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

我碰到的問題,GPS上UTC時(shí)間轉(zhuǎn)北京時(shí)間和STM32上UNIX時(shí)間戳轉(zhuǎn)北京時(shí)間。

這部分之前講RTC和GPS的時(shí)候有涉及到一部分。

具體的RTC如何得到UNIX時(shí)間戳,和GNRMC如何解析得到UTC時(shí)間可以參看一下。

參看:STM32開發(fā) – RTC詳解

參看:STM32開發(fā) – GPS模塊開發(fā)詳解


擴(kuò)展:C語言再學(xué)習(xí) – 時(shí)間函數(shù)


這里主要看三者轉(zhuǎn)換方法:


一、UTC時(shí)間轉(zhuǎn)換為北京時(shí)間

參看:UTC時(shí)間轉(zhuǎn)換為北京時(shí)間


時(shí)間類型結(jié)構(gòu)體


//UTC時(shí)間信息

__packed typedef struct  

{     

  uint16_t year; //年份

uint8_t month; //月份

uint8_t date; //日期

uint8_t hour; //小時(shí)

uint8_t min; //分鐘

uint8_t sec; //秒鐘

}nmea_time;


UTC時(shí)間轉(zhuǎn)任意時(shí)區(qū)時(shí)間


其中,北京時(shí)間 = UTC time + 8 hours


void UTC_to_BJtime(nmea_time* utc_time, int8_t timezone)

{

int year,month,day,hour;

    int lastday = 0; //last day of this month

    int lastlastday = 0; //last day of last month


    year = utc_time->year; //utc time

    month  = utc_time->month;

    day = utc_time->date;

    hour = utc_time->hour + timezone; 

    if(month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12){

        lastday = 31;

        if(month == 3){

            if((year%400 == 0)||(year%4 == 0 && year%100 != 0)) //if this is lunar year

                lastlastday = 29;

            else

                lastlastday = 28;

        }

        if(month == 8)

            lastlastday = 31;

    }

    else if(month == 4 || month == 6 || month == 9 || month == 11){

        lastday = 30;

        lastlastday = 31;

    }

    else{

        lastlastday = 31;

        if((year%400 == 0)||(year%4 == 0 && year%100 != 0))

            lastday = 29;

        else

            lastday = 28;

    }


    if(hour >= 24){ // if >24, day+1

            hour -= 24;

            day += 1; 


            if(day > lastday){ // next month,  day-lastday of this month

                day -= lastday;

                month += 1;


                if(month > 12){ // next year , month-12

                    month -= 12;

                    year += 1;

                }

            }

        }

    if(hour < 0){ // if <0, day-1

            hour += 24;

            day -= 1; 

            if(day < 1){   // month-1, day=last day of last month

                day = lastlastday;

                month -= 1;

                if(month < 1){ // last year , month=12

                    month = 12;

                    year -= 1;

                }

            }

        }

   // transfer value to NMEA_result.local_time

NMEA_result.local_time.year  = year;

NMEA_result.local_time.month = month;

NMEA_result.local_time.date  = day;

NMEA_result.local_time.hour  = hour;

NMEA_result.local_time.min = utc_time->min;

NMEA_result.local_time.sec = utc_time->sec;

}


二、UNIX Time 時(shí)間戳 與 北京時(shí)間 相互轉(zhuǎn)換

參看:UNIX Time 時(shí)間戳 與 北京時(shí)間 相互轉(zhuǎn)換


typedef struct t_xtime {

  int year; int month;  int day;  

  int hour; int minute;  int second;

} _xtime ;

 

#define xMINUTE   (60             ) //1分的秒數(shù)

#define xHOUR      (60*xMINUTE) //1小時(shí)的秒數(shù)

#define xDAY        (24*xHOUR   ) //1天的秒數(shù)

#define xYEAR       (365*xDAY   ) //1年的秒數(shù)


1、將localtime(UTC+8北京時(shí)間)轉(zhuǎn)為UNIX TIME,以1970年1月1日為起點(diǎn)

unsigned int  xDate2Seconds(_xtime *time)

{

  static unsigned int  month[12]={

    /*01月*/xDAY*(0),

    /*02月*/xDAY*(31),

    /*03月*/xDAY*(31+28),

    /*04月*/xDAY*(31+28+31),

    /*05月*/xDAY*(31+28+31+30),

    /*06月*/xDAY*(31+28+31+30+31),

    /*07月*/xDAY*(31+28+31+30+31+30),

    /*08月*/xDAY*(31+28+31+30+31+30+31),

    /*09月*/xDAY*(31+28+31+30+31+30+31+31),

    /*10月*/xDAY*(31+28+31+30+31+30+31+31+30),

    /*11月*/xDAY*(31+28+31+30+31+30+31+31+30+31),

    /*12月*/xDAY*(31+28+31+30+31+30+31+31+30+31+30)

  };

  unsigned int  seconds = 0;

  unsigned int  year = 0;

  year = time->year-1970;       //不考慮2100年千年蟲問題

  seconds = xYEAR*year + xDAY*((year+1)/4);  //前幾年過去的秒數(shù)

  seconds += month[time->month-1];      //加上今年本月過去的秒數(shù)

  if( (time->month > 2) && (((year+2)%4)==0) )//2008年為閏年

    seconds += xDAY;            //閏年加1天秒數(shù)

  seconds += xDAY*(time->day-1);         //加上本天過去的秒數(shù)

  seconds += xHOUR*time->hour;           //加上本小時(shí)過去的秒數(shù)

  seconds += xMINUTE*time->minute;       //加上本分鐘過去的秒數(shù)

  seconds += time->second;               //加上當(dāng)前秒數(shù)
 seconds -= 8 * xHOUR;

  return seconds;

}


2、將UNIX時(shí)間轉(zhuǎn)為UTC+8 即北京時(shí)間

//UNIX轉(zhuǎn)為UTC 已進(jìn)行時(shí)區(qū)轉(zhuǎn)換 北京時(shí)間UTC+8

void xSeconds2Date(unsigned long seconds,_xtime *time )

{

    static unsigned int month[12]={

        /*01月*/31, 

        /*02月*/28, 

        /*03月*/31, 

        /*04月*/30, 

        /*05月*/31, 

        /*06月*/30, 

        /*07月*/31, 

        /*08月*/31, 

        /*09月*/30, 

        /*10月*/31, 

        /*11月*/30, 

        /*12月*/31 

    };

    unsigned int days; 

    unsigned short leap_y_count; 

    time->second      = seconds % 60;//獲得秒 

    seconds          /= 60; 

    time->minute      =  seconds % 60;//獲得分 

    seconds          += 8 * 60 ;        //時(shí)區(qū)矯正 轉(zhuǎn)為UTC+8 bylzs

    seconds          /= 60; 

    time->hour        = seconds % 24;//獲得時(shí) 

    days              = seconds / 24;//獲得總天數(shù) 

    leap_y_count = (days + 365) / 1461;//過去了多少個(gè)閏年(4年一閏) 

    if( ((days + 366) % 1461) == 0) 

    {//閏年的最后1天 

        time->year = 1970 + (days / 366);//獲得年 

        time->month = 12;              //調(diào)整月 

        time->day = 31; 

        return; 

    } 

    days -= leap_y_count; 

    time->year = 1970 + (days / 365);     //獲得年 

    days %= 365;                       //今年的第幾天 

    days = 01 + days;                  //1日開始 

    if( (time->year % 4) == 0 ) 

    { 

        if(days > 60)--days;            //閏年調(diào)整 

        else 

        { 

            if(days == 60) 

            { 

                time->month = 2; 

                time->day = 29; 

                return; 

            } 

        } 

    } 

    for(time->month = 0;month[time->month] < days;time->month++) 

    { 

        days -= month[time->month]; 

    } 

    ++time->month;               //調(diào)整月 

    time->day = days;           //獲得日 

}


3、UTC(字符串)轉(zhuǎn)UNIX時(shí)間

/*******************************************************************************

* Function Name  : ConvertTimeToSecond

* Description    : Convert GPS Date to Log buffer.

* Input          : @date: format 'DDMMYY,HHMMSS.SSS'

* Output         : None

* Return         : Sencod

*******************************************************************************/

static u32 ConvertDateToSecond(const u8 *date)

{

u32 sencods = 0;

u16 temp = 1970;

u16 days = 0;

if(NULL == date) {

return 0;

}

//year

temp = (date[4] - 0x30) * 10 + (date[5] - 0x30) + 2000;

if(0 == (temp % 4)) {

days += 1;

}

temp -= 1;

//UTC time start 1970

for(; temp >= 1970; temp--) {

if(temp % 4) {

days += 365;

} else {

//leap year

days += 366;

[1] [2]
關(guān)鍵字:STM32  UTC  UNIX時(shí)間戳  北京時(shí)間  轉(zhuǎn)換 引用地址:STM32開發(fā) -- UTC、UNIX時(shí)間戳、北京時(shí)間之間的轉(zhuǎn)換

上一篇:STM32開發(fā) -- 看門狗詳解
下一篇:STM32開發(fā) -- 外部中斷詳解

推薦閱讀最新更新時(shí)間:2025-05-23 04:16

STM32 IAR工程->Keil MDK轉(zhuǎn)換詳解
簡介:我在STM32的學(xué)習(xí)中發(fā)現(xiàn),大部分的STM32示例程序都是基于IAR開發(fā)環(huán)境的,但我認(rèn)為使用Keil MDK開發(fā)環(huán)境更加方便,可以利用RVMDK強(qiáng)大的外設(shè)仿真功能加速STM32的開發(fā)。我在以前的Blog文章里介紹過如何在RVMDK中建立 ... 關(guān)鍵字: STM32 我在STM32的學(xué)習(xí)中發(fā)現(xiàn),大部分的STM32示例程序都是基于IAR開發(fā)環(huán)境的,但我認(rèn)為使用Keil MDK開發(fā)環(huán)境更加方便,可以利用RVMDK強(qiáng)大的外設(shè)仿真功能加速STM32的開發(fā)。我在以前的Blog文章里介紹過如何在RVMDK中建立STM32工程,以及如何使用RVMDK的軟件仿真功能,下面我將詳細(xì)說明怎樣將已有的IAR工程移植到RVMDK。
[單片機(jī)]
L2-2 Keil5-MDK軟件STM32工程仿真(USART篇)
前置條件 已創(chuàng)建STM32工程(本文以STM32F103ZE系列芯片為例) 已完成USART1的驅(qū)動(dòng)程序編寫(包括printf的硬件重定向) 代碼示例 usart.h #ifndef _USART_H_ #define _USART_H_ #include stm32f10x.h #ifdef __GNUC__ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif void Usart_Init(void); // 對(duì)外提供的
[單片機(jī)]
stm32型號(hào)命名規(guī)則
stm32型號(hào)命名規(guī)則示例: STM32 | F | 100 | C | 6 | T | 6 | B | XXX 1 2 3 4 5 6 7 8 9 從上面的料號(hào)可以看出以下信息: ST品牌ARM Cortex-Mx系列內(nèi)核32位超值型MCU,LQFP -48封裝 閃存容量32KB 溫度范圍-40℃-85℃; 產(chǎn)品系列:STM32代表ST品牌Cortex-Mx系列內(nèi)核(ARM)的32位MCU; 產(chǎn)品類型: F:通用快閃(Flash Memory);L:低電壓(1.65~3.6V); F類型中F0xx和 F1xx系列為2.0~3.6V; F2xx和F4xx系列為1.8~3.6V; W:無線系統(tǒng)芯片,開發(fā)版.產(chǎn)品
[單片機(jī)]
stm32編寫基本led
LED流水燈程序初始化流程 //1.定義結(jié)構(gòu)體變量 GPIO_InitTypeDef GPIO_InitStructure; //2.開啟GPIOC的外部時(shí)鐘,不同的外設(shè)開啟不同的時(shí)鐘,IO口復(fù)用時(shí)兩個(gè)時(shí)鐘都要開啟。stmf10x_rcc.h RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); //3.設(shè)置要控制的GPIO管腳 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5; //4.設(shè)置管腳模式,推挽輸出 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
[單片機(jī)]
STM32學(xué)習(xí)記錄】2、GPIO輸入—按鍵檢測(cè)
2.1硬件設(shè)計(jì) 彈性按鍵機(jī)械觸點(diǎn)斷開、閉合時(shí),由于觸點(diǎn)的彈性作用,按鍵開關(guān)不會(huì)馬上穩(wěn)定接通或一 下子斷開,使用按鍵時(shí)會(huì)產(chǎn)生如圖帶波紋信號(hào),需要用軟件消抖處理濾波,不方便輸入檢測(cè)。當(dāng)然有專用的去抖電路,也有專用的去抖芯片,但通常我們用軟件延時(shí)的方法就能解決抖動(dòng)問題,沒有必要添加多余的硬件電路。 2.2軟件設(shè)計(jì) 同 LED 的工程,為了使工程更加有條理,我們把按鍵相關(guān)的代碼獨(dú)立分開存儲(chǔ),方便 以后移植。在“工程模板”之上新建“bsp_key.c”及“bsp_key.h”文件,這些文件也可根 據(jù)您的喜好命名,這些文件不屬于 STM32標(biāo)準(zhǔn)庫的內(nèi)容,是由我們自己根據(jù)應(yīng)用需要編寫 的。 2.2.1編程要點(diǎn) 使能 GPIO端口時(shí)鐘;
[單片機(jī)]
STM32中斷系統(tǒng)
中斷與異常 中斷與異常這個(gè)概念其實(shí)可以說是一回事。最早出現(xiàn)中斷概念的時(shí)候就管它就叫中斷。外設(shè)某些時(shí)候需要中斷(Interrupt)CPU的運(yùn)行,來處理自己的請(qǐng)求。此時(shí)中斷用于外設(shè)響應(yīng)。但是系統(tǒng)內(nèi)部也會(huì)出現(xiàn)錯(cuò)誤,必須要中止CPU的運(yùn)行。為了區(qū)分這兩者所引發(fā)的中斷,便有了內(nèi)中斷與外中斷概念。內(nèi)中斷指的是系統(tǒng)內(nèi)部的錯(cuò)誤,外中斷是外設(shè)的請(qǐng)求。為了區(qū)分兩者,內(nèi)中斷就被稱為異常(Exception)了。從此有了中斷和異常的概念,外設(shè)請(qǐng)求叫中斷,內(nèi)部錯(cuò)誤叫異常。外中斷這個(gè)概念就有了新的含義,就是芯片外部發(fā)來的中斷請(qǐng)求。在STM32芯片中,由GPIO管腳產(chǎn)生的中斷,稱為EXTI(External Interrupts 外部中斷)。 NVIC NV
[單片機(jī)]
stm32特制版源碼編譯及調(diào)試--Apple的學(xué)習(xí)筆記
一,前言 qemu虛擬機(jī)還有下文,因?yàn)閝emu最吸引我的地方就是二次開發(fā),可以模擬各種外設(shè)。可以參考我之前的blog qemu虛化原理入門--Apple的學(xué)習(xí)筆記 和 Qemu2.8虛擬機(jī)源碼分析—Apple的學(xué)習(xí)筆記 我已經(jīng)掌握了qemu2.8源碼的基礎(chǔ)及2.8源碼的編譯。并且我也使用過了基于stm32開發(fā)板的qemu二次開發(fā)環(huán)境。但是我的目的是能修改qemu源碼,達(dá)到更加深入的理解程度,而stm32的qemu二次開發(fā)源碼就成為了我現(xiàn)在主要研究的對(duì)象。 二:編譯可調(diào)試的stm32_qemu二次開發(fā)源碼 通過查看版本發(fā)現(xiàn)是基于qemu2.8開發(fā)的,對(duì)比STM32二次開發(fā)的源碼和qemu2.8。能發(fā)現(xiàn)CONFIG_GNU_MCU_E
[單片機(jī)]
STM32的備份電池壽命
請(qǐng)教諸位使用STM32的兄弟: 如果用50mah的備份電池給STM32的RTC供電,能堅(jiān)持多長時(shí)間?規(guī)格書上IDD_VBAT是。而VBAT的范圍是1.8~3.6V。 ST是否有相應(yīng)針對(duì)特定電池的數(shù)據(jù)。 -------------------------------------------------------------------- 半導(dǎo)體公司不會(huì)給出一個(gè)準(zhǔn)確的數(shù)據(jù),一般自己計(jì)算一下就好了。 比如50mAh的電池按照1.4uA放電,可以使用的時(shí)間為:50mAh / 1.4uA = 35714小時(shí) CR2025電池 電壓3.0V,容量150,尺寸20.0X2.5mm, 重量2.4g 150mAh / 1.4uA =
[單片機(jī)]
小廣播
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章
隨便看看

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京B2-20211791 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 平乐县| 什邡市| 武清区| 内黄县| 阿尔山市| 泸水县| 夏津县| 郁南县| 南华县| 科技| 兰溪市| 鄂州市| 桃源县| 郁南县| 高州市| 普定县| 芜湖县| 郑州市| 辉县市| 滨州市| 辽阳市| 金湖县| 迁安市| 深水埗区| 冷水江市| 新津县| 津市市| 兰西县| 承德市| 昌吉市| 乡城县| 宜黄县| 杭锦旗| 延庆县| 永胜县| 高青县| 石楼县| 会宁县| 青川县| 潞城市| 札达县|