在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

GD32F470的RTC時(shí)間設(shè)置和獲取,以及其中BCD碼的坑

撞上電子 ? 2023-12-26 08:00 ? 次閱讀

一,背景知識(shí)

1、RTC時(shí)鐘源:有三種:IRC32K,內(nèi)部低速時(shí)鐘源,不精確,溫漂大;LXTAL:外部低速時(shí)鐘源,32.768KHz,精度高;HXTAL:外部高速時(shí)鐘源。

2、實(shí)時(shí)時(shí)鐘 (RTC) 是一個(gè)獨(dú)立的 BCD 定時(shí)器/計(jì)數(shù)器;32 位寄存器包含 BCD 格式的秒、分鐘、小時(shí)(12 或 24 小時(shí)制)、星期幾、日期、月份和年份。

3、BCD進(jìn)制:BCD進(jìn)制是便于人們快速進(jìn)行二進(jìn)制和十進(jìn)制之間的轉(zhuǎn)換產(chǎn)生的,是由4位bit表示十進(jìn)制中的0~9。4位bit可以表示的范圍是2^4=16,所以BCD進(jìn)制也有幾種分類:

8421碼:因?yàn)閺淖蟮接疫@4位bit,每位為1其他位為0時(shí)分別對(duì)應(yīng)十進(jìn)制數(shù)值8/4/2/1,以此得名。

d4f3217e-a381-11ee-9788-92fbcf53809c.png

余3碼:在8421碼的基礎(chǔ)上偏移3

d50005ba-a381-11ee-9788-92fbcf53809c.png

2421碼:

d4f3217e-a381-11ee-9788-92fbcf53809c.png

二、RTC初始化

初始化部分按照GD的RTC例程,去掉提示信息printf這些不需要的東西。初始化先隨意設(shè)置一個(gè)時(shí)間,第二章節(jié)會(huì)講解如何按照用戶需求設(shè)定時(shí)間。

1、宏定義和全局變量:

選定RTC的時(shí)鐘源--LXTAL,定義RTC的句柄全局變量。

#define RTC_CLOCK_SOURCE_LXTAL //使用外部32.768K晶振#define BKP_VALUE 0x32F1 rtc_parameter_struct rtc_initpara; //RTC句柄

2、RTC的初始化:

使能寄存器寫入,選擇時(shí)鐘源,設(shè)置分頻值產(chǎn)生1Hz時(shí)鐘頻率:時(shí)鐘源頻率/( prescaler_a * prescaler_s)=32768/(0x7f * 0xff)=1,使能外設(shè)時(shí)鐘。

void RTC_Init(void){ /* enable PMU clock */ rcu_periph_clock_enable(RCU_PMU); /* enable the access of the RTC registers */ pmu_backup_write_enable(); rtc_pre_config(); /* get RTC clock entry selection */ RTCSRC_FLAG = GET_BITS(RCU_BDCTL, 8, 9); /* check if RTC has aready been configured */ if ((BKP_VALUE != RTC_BKP0) || (0x00 == RTCSRC_FLAG)) { /* backup data register value is not correct or not yet programmed or RTC clock source is not configured (when the first time the program is executed or data in RCU_BDCTL is lost due to Vbat feeding) */ rtc_setup(); } rcu_all_reset_flag_clear();} /*! \brief RTC configuration function \param[in] none \param[out] none \retval none*/void rtc_pre_config(void){ #if defined (RTC_CLOCK_SOURCE_IRC32K) rcu_osci_on(RCU_IRC32K); rcu_osci_stab_wait(RCU_IRC32K); rcu_rtc_clock_config(RCU_RTCSRC_IRC32K); prescaler_s = 0x13F; prescaler_a = 0x63; #elif defined (RTC_CLOCK_SOURCE_LXTAL) rcu_osci_on(RCU_LXTAL); rcu_osci_stab_wait(RCU_LXTAL); rcu_rtc_clock_config(RCU_RTCSRC_LXTAL); prescaler_s = 0xFF; prescaler_a = 0x7F; #else #error RTC clock source should be defined. #endif /* RTC_CLOCK_SOURCE_IRC32K */ rcu_periph_clock_enable(RCU_RTC); rtc_register_sync_wait();} /*! \brief use hyperterminal to setup RTC time and alarm \param[in] none \param[out] none \retval none*/void rtc_setup(void){ /* setup RTC time value */ uint32_t tmp_hh = 0x00, tmp_mm = 0x00, tmp_ss = 0x00; rtc_initpara.factor_asyn = prescaler_a; rtc_initpara.factor_syn = prescaler_s; rtc_initpara.year = 0x16; rtc_initpara.day_of_week = 0; rtc_initpara.month = RTC_APR; rtc_initpara.date = 0x30; rtc_initpara.display_format = RTC_24HOUR; rtc_initpara.am_pm = RTC_AM; rtc_initpara.hour = tmp_hh; rtc_initpara.minute = tmp_mm; rtc_initpara.second = tmp_ss; /* RTC current time configuration */ if(ERROR != rtc_init(&rtc_initpara)) { RTC_BKP0 = BKP_VALUE; }}

三、設(shè)置時(shí)間和獲取時(shí)間1、BCD和二進(jìn)制轉(zhuǎn)換函數(shù):

/** * @brief Convert a 2 digit decimal to BCD format. * @param Value: Byte to be converted * @retval Converted byte */uint8_t byte_to_bcd(uint8_t Value){ uint32_t bcdhigh = 0; while(Value >= 10) { bcdhigh++; Value -= 10; } return ((uint8_t)(bcdhigh << 4) | Value);} /** * @brief Convert from 2 digit BCD to Binary. * @param Value: BCD value to be converted * @retval Converted word */uint8_t bcd_to_byte(uint8_t Value){ uint32_t tmp = 0; tmp = ((uint8_t)(Value & (uint8_t)0xF0) >> (uint8_t)0x4) * 10; return (tmp + (Value & (uint8_t)0x0F));}

2、設(shè)置指定時(shí)間:

注意一定要將年月日時(shí)分秒等參數(shù)從二進(jìn)制轉(zhuǎn)換成BCD,再賦值給rtc_initpara

typedefstruct{uint8_t year;uint8_t month;uint8_t date;uint8_t hour;uint8_t minute;uint8_t second;}S_RTCTimeInfo;//均為二進(jìn)制格式 S_RTCTimeInfo RTCTime;//RTC全局變量,存儲(chǔ)外界輸入的待設(shè)定的時(shí)間 /*需要設(shè)定時(shí)間時(shí)調(diào)用此函數(shù),將時(shí)間賦值給RTC句柄*/void RtcSetTime(S_RTCTimeInfo time){ rtc_initpara.year = byte_to_bcd(time.year); rtc_initpara.month= byte_to_bcd(time.month); rtc_initpara.date= byte_to_bcd(time.date); rtc_initpara.hour= byte_to_bcd(time.hour); rtc_initpara.minute= byte_to_bcd(time.minute); rtc_initpara.second= byte_to_bcd(time.second); rtc_init(&rtc_initpara);}

3、獲取當(dāng)前時(shí)間:

void RtcGetTime(void){ rtc_current_time_get(&rtc_initpara); RTCTime.year = bcd_to_byte(rtc_initpara.year); RTCTime.month= bcd_to_byte(rtc_initpara.year); RTCTime.date= bcd_to_byte(rtc_initpara.year); RTCTime.hour= bcd_to_byte(rtc_initpara.year); RTCTime.minute= bcd_to_byte(rtc_initpara.year); RTCTime.second= bcd_to_byte(rtc_initpara.year);}

四、遇到的問(wèn)題

1、如果不使用周幾,可以將rtc_initpara.day_of_week設(shè)為0,這樣就不啟用這項(xiàng)了。如果初始化時(shí)設(shè)置了day_of_week,后續(xù)修改設(shè)定時(shí)間時(shí)沒(méi)有將這項(xiàng)對(duì)應(yīng)修改,會(huì)造成設(shè)置的時(shí)間不準(zhǔn)。因?yàn)樵O(shè)定時(shí)間賦值后會(huì)進(jìn)行rtc_init,day_of_week會(huì)影響reg_date。

/*gd32f4xx_rtc.c文件中*/ErrStatus rtc_init(rtc_parameter_struct *rtc_initpara_struct){ ErrStatus error_status = ERROR; uint32_t reg_time = 0U, reg_date = 0U; reg_date = (DATE_YR(rtc_initpara_struct->year) | \ DATE_DOW(rtc_initpara_struct->day_of_week) | \ DATE_MON(rtc_initpara_struct->month) | \ DATE_DAY(rtc_initpara_struct->date));...省略部分代碼}

2、當(dāng)沒(méi)有使用宏定義,而是使用數(shù)字給rtc_initpara 的年月日時(shí)分秒賦值時(shí),一定要進(jìn)行二進(jìn)制到BCD的轉(zhuǎn)換。對(duì)于此問(wèn)題,STM32H7的HAL庫(kù)就封裝的很人性化,HAL庫(kù)函數(shù)提供了可以選擇使用哪種進(jìn)制,,用戶只需要選擇對(duì)應(yīng)的進(jìn)制,傳入?yún)?shù)即可,不需要自己進(jìn)行進(jìn)制轉(zhuǎn)換。

/*stm32h7xx_hal_rtc.c文件*/ /** * @brief Set RTC current date. * @param hrtc: RTC handle * @param sDate: Pointer to date structure * @param Format: specifies the format of the entered parameters. * This parameter can be one of the following values: * @arg RTC_FORMAT_BIN: Binary data format * @arg RTC_FORMAT_BCD: BCD data format * @retval HAL status */HAL_StatusTypeDefHAL_RTC_SetDate(RTC_HandleTypeDef*hrtc,RTC_DateTypeDef*sDate,uint32_tFormat);

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • BCD
    BCD
    +關(guān)注

    關(guān)注

    1

    文章

    88

    瀏覽量

    29734
  • RTC
    RTC
    +關(guān)注

    關(guān)注

    2

    文章

    538

    瀏覽量

    66529
  • 時(shí)鐘源
    +關(guān)注

    關(guān)注

    0

    文章

    93

    瀏覽量

    15965
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    GD32F470紫藤派開發(fā)板使用手冊(cè)】第九講 USART-printf打印實(shí)驗(yàn)

    通過(guò)本實(shí)驗(yàn)主要學(xué)習(xí)以下內(nèi)容: 串口簡(jiǎn)介 GD32F470串口工作原理 使用printf打印信息
    的頭像 發(fā)表于 05-13 10:14 ?1740次閱讀
    【<b class='flag-5'>GD32F470</b>紫藤派開發(fā)板使用手冊(cè)】第九講  USART-printf打印實(shí)驗(yàn)

    GD32F470紫藤派開發(fā)板使用手冊(cè)】第十一講 SPI-SPI NOR FLASH讀寫實(shí)驗(yàn)

    通過(guò)本實(shí)驗(yàn)主要學(xué)習(xí)以下內(nèi)容: ?SPI簡(jiǎn)介 ?GD32F470 SPI簡(jiǎn)介 ?SPI NOR FLASH——GD25Q32ESIGR簡(jiǎn)介 ?使用GD32F470 SPI接口實(shí)現(xiàn)對(duì)GD2
    的頭像 發(fā)表于 05-17 09:57 ?1798次閱讀
    【<b class='flag-5'>GD32F470</b>紫藤派開發(fā)板使用手冊(cè)】第十一講 SPI-SPI NOR FLASH讀寫實(shí)驗(yàn)

    采用GD32F470高性能MCU的PowerWriter X1多功能調(diào)試燒錄器

    GD32F470/F427/F425系列Cortex-M4內(nèi)核高性能MCU 以高性能、強(qiáng)實(shí)時(shí)、大容量特性,強(qiáng)化更為廣泛的市場(chǎng)領(lǐng)先優(yōu)勢(shì)。采用Arm Cortex-M4內(nèi)核,處理器主頻高達(dá)240MHz,可支持算法復(fù)雜度更高的嵌入式應(yīng)
    的頭像 發(fā)表于 08-22 09:43 ?2079次閱讀
    采用<b class='flag-5'>GD32F470</b>高性能MCU的PowerWriter X1多功能調(diào)試燒錄器

    使用GD32F470編譯drv_adc.c時(shí)報(bào)錯(cuò)怎么解決?

    使用GD32F470芯片,編譯drv_adc.c時(shí)報(bào)錯(cuò)好幾個(gè)編譯錯(cuò)誤,可能是適配GD32F470芯片沒(méi)有適配好。 編譯問(wèn)題如下圖:
    發(fā)表于 02-23 06:55

    GD32F103的RTC實(shí)現(xiàn)

    一、GDRTC:只有GD32F405、GD32F407和GD32F450帶完整的時(shí)間和日歷功能
    發(fā)表于 08-16 11:17

    GD32F4系列,RTC鬧鐘如何設(shè)置成每天固定時(shí)間起作用?

    目前配置的只能是當(dāng)天的鬧鐘,如何做到每天在設(shè)置的那個(gè)時(shí)間點(diǎn)進(jìn)鬧鐘呢?哪位大佬幫忙解答下。GD32跟STM32不太一樣,沒(méi)法參照。以下是我做的鬧鐘代碼,該如何修改成每天的鬧鐘。用的是庫(kù)函數(shù)提供的寄存器
    發(fā)表于 01-20 11:20

    現(xiàn)有的BSP工程可以直接在GD32F470上進(jìn)行開發(fā)嗎

    大家好:有關(guān)于GD32F470的BSP工程的問(wèn)題咨詢,我在GD官網(wǎng)上查照資料了解470和450是很相似的,目前因?yàn)轫?xiàng)目需要使用的470芯片,想使用rt-thread的操作系統(tǒng),但是不知
    發(fā)表于 08-01 10:39

    移植RT-Thread BSP中GDF450工程運(yùn)行在GD32F470芯片上失敗如何修改

    各位好:如題,移植GD32F450的工程運(yùn)行在GD32F470的芯片上,加載成功后程序會(huì)死在rt_smem_alloc函數(shù)里面的289行代碼,RT_ASSERT()函數(shù),經(jīng)過(guò)調(diào)試發(fā)現(xiàn)感覺(jué)是因?yàn)?/div>
    發(fā)表于 11-07 14:18

    GD32F207-RTC

    單片機(jī)GD32F207學(xué)習(xí)例程之GD32F207-RTC例程源碼
    發(fā)表于 06-03 15:40 ?15次下載

    基于GD32F307的嵌入式學(xué)習(xí)之路--RTC

    GD32F307之RTC
    發(fā)表于 11-29 16:36 ?10次下載
    基于<b class='flag-5'>GD32F</b>307的嵌入式學(xué)習(xí)之路--<b class='flag-5'>RTC</b>

    ---GD32 MCU---RTC使用LXTAL時(shí)鐘源異常

    問(wèn)題描述:客戶在使用40K的內(nèi)部時(shí)鐘時(shí)鐘發(fā)現(xiàn)計(jì)時(shí)異常,然后切換到LXTAL時(shí)鐘,時(shí)鐘停止無(wú)法運(yùn)行。原因:40k時(shí)鐘計(jì)數(shù)異常,是應(yīng)為RTC時(shí)間存儲(chǔ)格式是BCD,需要轉(zhuǎn)換,客戶沒(méi)有轉(zhuǎn)換
    發(fā)表于 12-02 14:51 ?6次下載
    ---<b class='flag-5'>GD</b>32 MCU---<b class='flag-5'>RTC</b>使用LXTAL時(shí)鐘源異常

    什么是BCD

    在使用RTC外設(shè)時(shí),我們常常會(huì)接觸 BCD的概念,同時(shí)魚鷹在介紹 USB 協(xié)議版本時(shí)也說(shuō)了 BCD ,那么什么是
    的頭像 發(fā)表于 09-07 09:10 ?1.6w次閱讀

    GD32F470xx 數(shù)據(jù)表

    GD32F470xx 數(shù)據(jù)表
    發(fā)表于 02-22 18:23 ?2次下載
    <b class='flag-5'>GD32F470</b>xx 數(shù)據(jù)表

    芯片GD32與以太網(wǎng)芯片的

    GD32F470平臺(tái)后,一直卡在卡在gd32fxx_enet.c中enet_phy_config,經(jīng)過(guò)排查發(fā)現(xiàn)GD32的官方庫(kù)文件也需要修改,分別為gd32f4
    的頭像 發(fā)表于 01-16 08:00 ?2111次閱讀
    芯片<b class='flag-5'>GD</b>32與以太網(wǎng)芯片的<b class='flag-5'>坑</b>

    GD32F470紫藤派開發(fā)板使用手冊(cè)】第八講 ADC-規(guī)則組多通道采樣實(shí)驗(yàn)

    通過(guò)本實(shí)驗(yàn)主要學(xué)習(xí)以下內(nèi)容: ?ADC的簡(jiǎn)介 ?GD32F470 ADC工作原理 ?DMA原理 ?規(guī)則組多通道循環(huán)采樣
    的頭像 發(fā)表于 05-12 10:00 ?770次閱讀
    【<b class='flag-5'>GD32F470</b>紫藤派開發(fā)板使用手冊(cè)】第八講 ADC-規(guī)則組多通道采樣實(shí)驗(yàn)
    主站蜘蛛池模板: 亚洲国产精品日韩专区avtube | 日韩精品系列产品| 狠狠色丁香婷婷综合| 手机看片国产精品| xxxx 欧美| 婷五月综合| 国产一二三区在线| 国产小视频在线观看| 999影院成 人在线影院| 欧美一级片手机在线观看| 夜夜操美女| 亚洲伊人天堂| 全黄色一级片| 天天碰天天操| 美女扒开尿口给男人看大全| 欧美一级特黄aaa大片| 天天看天天干| 狠狠色 综合色区| 黄 色 毛片免费| 成人黄色免费网站| 天堂视频在线免费观看| 成人精品在线观看| h视频在线观看网站| 日本黄视频在线观看| 天天都色| 中文天堂最新版www| 国产婷婷综合丁香亚洲欧洲| 波多野结衣久久精品| 婷婷丁香激情| 午夜老湿影院| a网站免费| 国产高清美女一级a毛片| 日韩亚射吧| 欧美十次| 国产福利在线免费| 四虎影在永久地址在线观看| 夭天干天天做天天免费看| 69日本xxxxxxxxx56| 欧美成人天天综合在线视色| 久久精品影院永久网址| 婷婷久久综合网|