在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            STM32F4DiscoveryRTC

            作者: 時(shí)間:2016-11-26 來源:網(wǎng)絡(luò) 收藏
            STM32F4DiscoveryRTC調(diào)試手記
            實(shí)現(xiàn)功能:配置RTC實(shí)現(xiàn)計(jì)時(shí)功能,并通過喚醒中斷輸出當(dāng)前時(shí)間。
            一、硬件改動(dòng)
            本次調(diào)試使用32768Hz晶振,而STM32F4Discovery上并未焊接該晶振,于是硬件需要作出幾個(gè)改動(dòng):
            1.
            2013-8-20 17:05 上傳
            下載附件(19.52 KB)
            焊接晶振X3 32768Hz(負(fù)載電容為6pF)C16、C27 6pF
            2.
            因VBAT直接接到VDD上了,而RTC需要電池供電支持,因而需要拆掉R26,并在VBAT那個(gè)焊盤接電池正極
            硬件改動(dòng)效果圖:
            二、所使用的庫函數(shù)
            在本次實(shí)驗(yàn)中,主要使用了stm32f4xx_pwr.c,stm32f4xx_rcc.c, stm32f4xx_rtc.c中的函數(shù),下面對(duì)部分函數(shù)進(jìn)行簡單的介紹:
            stm32f4xx_pwr.c:
            PWR_BackupAccessCmd:通過位帶實(shí)現(xiàn)設(shè)置PWR_CR[8] DBP,該位用于使能/失能RTC、RTC備份寄存器及備份SRAM的訪問。
            stm32f4xx_rcc.c:
            RCC_LSEConfig:實(shí)現(xiàn)對(duì)RCC_BDCR寄存器的設(shè)置,主要是對(duì)[2]LSEBYP和[0]LSEON進(jìn)行設(shè)置。這里用于啟動(dòng)32768Hz晶振。
            RCC_RTCCLKConfig:實(shí)現(xiàn)對(duì)RCC_BDCR[9:8]RTCSEL設(shè)置,用于選擇RTC時(shí)鐘的時(shí)鐘源。同時(shí),可能對(duì)RCC_CFGR[20:16]RTCPRE設(shè)置(使用HSE作為RTC時(shí)鐘時(shí)設(shè)置)。
            RCC_RTCCLKCmd:位帶操作實(shí)現(xiàn)對(duì)RCC_BDCR[15]RTCEN設(shè)置,用于使能/失能RTC。
            stm32f4xx_rtc.c:
            首先先看三個(gè)結(jié)構(gòu)體:
            typedef struct
            {
            uint32_t RTC_HourFormat;
            uint32_t RTC_AsynchPrediv;
            uint32_t RTC_SynchPrediv;
            }RTC_InitTypeDef;
            此結(jié)構(gòu)體用于RTC_Init,即RTC初始化。
            其中,RTC_HourFormat影響RTC_CR[6] FMT:時(shí)鐘格式,該位影響時(shí)鐘的表達(dá)方式:AM/PM或24小時(shí)表達(dá)方式。
            RTC_AsynchPrediv和RTC_SynchPrediv則影響RTC_PRER寄存器的值,
            RTC_AsynchPrediv影響[22:16]PREDIV_A[6:0],該值決定ck_apre的頻率。
            ck_apre = RTCCLK/(PREDIV_A + 1)
            RTC_SynchPrediv影響[14:0]PREDIV_S,該值決定ck_spre頻率。
            ck_spre = ck_apre/( PREDIV_S + 1)
            因此處采用32768Hz晶振,為生成1Hz時(shí)鐘,故使用:
            RTC_InitStructure.RTC_SynchPrediv = 0xFF;
            RTC_InitStructure.RTC_AsynchPrediv = 0x7F;
            typedef struct
            {
            uint8_t RTC_Hours;
            uint8_t RTC_Minutes;
            uint8_t RTC_Seconds;
            uint8_t RTC_H12;
            }RTC_TimeTypeDef;
            typedef struct
            {
            uint8_t RTC_WeekDay;
            uint8_t RTC_Month;
            uint8_t RTC_Date;
            uint8_t RTC_Year;
            }RTC_DateTypeDef;
            上述兩個(gè)結(jié)構(gòu)體用于保存時(shí)間或日期,格式可以為BCD碼或二進(jìn)制數(shù),注意年份RTC_Year的取值范圍為0-99。
            下面是RTC部分函數(shù)。
            RTC_Init:RTC初始化
            RTC_EnterInitMode:用于設(shè)置RTC_ISR(RTC初始化和狀態(tài)寄存器)[7]INIT初始化模式,在初始化模式下,RTC_TR、RTC_CR、RTC_PRER均可修改。計(jì)時(shí)停止直至INIT復(fù)位。
            RTC_ExitInitMode:復(fù)位RTC_ISR[7]INIT。
            時(shí)間配置及獲取函數(shù):
            ErrorStatus RTC_SetTime(uint32_tRTC_Format, RTC_TimeTypeDef* RTC_TimeStruct); void RTC_GetTime(uint32_tRTC_Format, RTC_TimeTypeDef* RTC_TimeStruct);
            ErrorStatus RTC_SetDate(uint32_tRTC_Format, RTC_DateTypeDef* RTC_DateStruct); void RTC_GetDate(uint32_tRTC_Format, RTC_DateTypeDef* RTC_DateStruct);
            這幾個(gè)函數(shù)實(shí)現(xiàn)對(duì)RTC_TR和RTC_DR的訪問獲得當(dāng)前時(shí)間及日期。最終,存入這兩個(gè)寄存器的值為BCD碼。而這些函數(shù)第二個(gè)參數(shù)的結(jié)構(gòu)體中所存入的值可以為BCD碼,也可以為二進(jìn)制數(shù),其格式由第一個(gè)參數(shù)(RTC_Format_BIN/RTC_Format_BCD)指定。
            喚醒中斷相關(guān)函數(shù):
            RTC_WakeUpClockConfig:影響RTC_CR[2:0]WUCKSEL,確定喚醒時(shí)鐘ck_wut的時(shí)鐘源。
            RTC_SetWakeUpCounter:設(shè)置RTC_WUTR[15:0]WUT,當(dāng)WUTE=1時(shí),WUTF標(biāo)志位每隔(WUT+1)個(gè)ck_wut時(shí)鐘周期置位。
            RTC_WakeUpCmd:影響RTC_CR[10]WUTE喚醒時(shí)鐘使能位。
            備份寄存器:
            在STM32F1中是在stm32f10x.bkp.c中實(shí)現(xiàn),這里由RTC實(shí)現(xiàn)了。
            RTC_WriteBackupRegister、RTC_ReadBackupRegister實(shí)現(xiàn)對(duì)相應(yīng)備份寄存器的讀寫。
            中斷相關(guān):
            RTC_ITConfig:影響RTC_CR[15]TSIE時(shí)間戳中斷使能、[14]WUTIE喚醒時(shí)鐘中斷使能、[13-12]ALRA(B)IE:鬧鈴A/B中斷使能。
            三、初始化流程及代碼
            初始化流程大致如下:
            1) 使能時(shí)鐘,配置RTC時(shí)鐘及分頻比,獲得1Hz的ck_spre時(shí)鐘。
            2) 配置NVIC相關(guān)參數(shù)
            3) 喚醒中斷配置。因此處需要實(shí)現(xiàn)秒中斷,故采用ck_spre時(shí)鐘作為ck_wut時(shí)鐘源,喚醒時(shí)鐘計(jì)數(shù)器設(shè)置為0,則可實(shí)現(xiàn)秒中斷。
            static void RTC_Configuration(void)
            {
            RTC_InitTypeDefRTC_InitStructure;
            RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
            PWR_BackupAccessCmd(ENABLE);
            RCC_LSEConfig(RCC_LSE_ON);
            while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
            {}
            RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
            RCC_RTCCLKCmd(ENABLE);
            RTC_WaitForSynchro();
            RTC_InitStructure.RTC_HourFormat= RTC_HourFormat_24; //24 hour format
            //32768/ (1 + 0x7F) = 32768 /128 = 256Hz,
            //256/ (1 + 0xFF) = 1Hz, This is the calender frequecy~
            RTC_InitStructure.RTC_SynchPrediv= 0xFF;
            RTC_InitStructure.RTC_AsynchPrediv= 0x7F;
            if(RTC_Init(&RTC_InitStructure) == ERROR)
            printf("RTCinit failed");
            else
            printf("RTCinit success");
            NVIC_Configuration();
            RTC_WakeUpCmd(DISABLE); //important
            //Configure the RTC WakeUp Clock source: CK_SPRE (1Hz)
            RTC_WakeUpClockConfig(RTC_WakeUpClock_CK_SPRE_16bits);
            RTC_SetWakeUpCounter(0x0);
            RTC_WakeUpCmd(ENABLE);
            RTC_ClearITPendingBit(RTC_IT_WUT);
            RTC_ITConfig(RTC_IT_WUT,ENABLE);
            }
            中斷配置流程見RM009023.5節(jié)RTC interrupt
            使能喚醒中斷初始化序列:
            1) 配置并使能EXTI Line22進(jìn)入中斷模式并選擇上升沿觸發(fā)。
            2) 在NVIC中配置RTC_WKUP_IRQ
            3) 配置RTC來產(chǎn)生RTC喚醒時(shí)鐘事件
            static void NVIC_Configuration(void)
            {
            NVIC_InitTypeDef NVIC_InitStructure;
            EXTI_InitTypeDefEXTI_InitStructure;
            EXTI_ClearITPendingBit(EXTI_Line22);
            EXTI_InitStructure.EXTI_Line= EXTI_Line22;
            EXTI_InitStructure.EXTI_Mode= EXTI_Mode_Interrupt;
            EXTI_InitStructure.EXTI_Trigger= EXTI_Trigger_Rising;
            EXTI_InitStructure.EXTI_LineCmd= ENABLE;
            EXTI_Init(&EXTI_InitStructure);
            NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
            NVIC_InitStructure.NVIC_IRQChannel = RTC_WKUP_IRQn;
            NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
            NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
            NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
            NVIC_Init(&NVIC_InitStructure);
            }


            關(guān)鍵詞: STM32F4DiscoveryRT

            評(píng)論


            技術(shù)專區(qū)

            關(guān)閉