新聞中心

        STM32F4DiscoveryRTC

        作者: 時間:2016-11-26 來源:網(wǎng)絡(luò) 收藏
        STM32F4DiscoveryRTC調(diào)試手記
        實現(xiàn)功能:配置RTC實現(xiàn)計時功能,并通過喚醒中斷輸出當(dāng)前時間。
        一、硬件改動
        本次調(diào)試使用32768Hz晶振,而STM32F4Discovery上并未焊接該晶振,于是硬件需要作出幾個改動:
        1.
        2013-8-20 17:05 上傳
        下載附件(19.52 KB)
        焊接晶振X3 32768Hz(負(fù)載電容為6pF)C16、C27 6pF
        2.
        因VBAT直接接到VDD上了,而RTC需要電池供電支持,因而需要拆掉R26,并在VBAT那個焊盤接電池正極
        硬件改動效果圖:
        二、所使用的庫函數(shù)
        在本次實驗中,主要使用了stm32f4xx_pwr.c,stm32f4xx_rcc.c, stm32f4xx_rtc.c中的函數(shù),下面對部分函數(shù)進(jìn)行簡單的介紹:
        stm32f4xx_pwr.c:
        PWR_BackupAccessCmd:通過位帶實現(xiàn)設(shè)置PWR_CR[8] DBP,該位用于使能/失能RTC、RTC備份寄存器及備份SRAM的訪問。
        stm32f4xx_rcc.c:
        RCC_LSEConfig:實現(xiàn)對RCC_BDCR寄存器的設(shè)置,主要是對[2]LSEBYP和[0]LSEON進(jìn)行設(shè)置。這里用于啟動32768Hz晶振。
        RCC_RTCCLKConfig:實現(xiàn)對RCC_BDCR[9:8]RTCSEL設(shè)置,用于選擇RTC時鐘的時鐘源。同時,可能對RCC_CFGR[20:16]RTCPRE設(shè)置(使用HSE作為RTC時鐘時設(shè)置)。
        RCC_RTCCLKCmd:位帶操作實現(xiàn)對RCC_BDCR[15]RTCEN設(shè)置,用于使能/失能RTC。
        stm32f4xx_rtc.c:
        首先先看三個結(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:時鐘格式,該位影響時鐘的表達(dá)方式:AM/PM或24小時表達(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時鐘,故使用:
        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;
        上述兩個結(jié)構(gòu)體用于保存時間或日期,格式可以為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均可修改。計時停止直至INIT復(fù)位。
        RTC_ExitInitMode:復(fù)位RTC_ISR[7]INIT。
        時間配置及獲取函數(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);
        這幾個函數(shù)實現(xiàn)對RTC_TR和RTC_DR的訪問獲得當(dāng)前時間及日期。最終,存入這兩個寄存器的值為BCD碼。而這些函數(shù)第二個參數(shù)的結(jié)構(gòu)體中所存入的值可以為BCD碼,也可以為二進(jìn)制數(shù),其格式由第一個參數(shù)(RTC_Format_BIN/RTC_Format_BCD)指定。
        喚醒中斷相關(guān)函數(shù):
        RTC_WakeUpClockConfig:影響RTC_CR[2:0]WUCKSEL,確定喚醒時鐘ck_wut的時鐘源。
        RTC_SetWakeUpCounter:設(shè)置RTC_WUTR[15:0]WUT,當(dāng)WUTE=1時,WUTF標(biāo)志位每隔(WUT+1)個ck_wut時鐘周期置位。
        RTC_WakeUpCmd:影響RTC_CR[10]WUTE喚醒時鐘使能位。
        備份寄存器:
        在STM32F1中是在stm32f10x.bkp.c中實現(xiàn),這里由RTC實現(xiàn)了。
        RTC_WriteBackupRegister、RTC_ReadBackupRegister實現(xiàn)對相應(yīng)備份寄存器的讀寫。
        中斷相關(guān):
        RTC_ITConfig:影響RTC_CR[15]TSIE時間戳中斷使能、[14]WUTIE喚醒時鐘中斷使能、[13-12]ALRA(B)IE:鬧鈴A/B中斷使能。
        三、初始化流程及代碼
        初始化流程大致如下:
        1) 使能時鐘,配置RTC時鐘及分頻比,獲得1Hz的ck_spre時鐘。
        2) 配置NVIC相關(guān)參數(shù)
        3) 喚醒中斷配置。因此處需要實現(xiàn)秒中斷,故采用ck_spre時鐘作為ck_wut時鐘源,喚醒時鐘計數(shù)器設(shè)置為0,則可實現(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喚醒時鐘事件
        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

        評論


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

        關(guān)閉
        主站蜘蛛池模板: 吉林省| 鄂州市| 永登县| 福贡县| 梅河口市| 长沙县| 浦城县| 伊宁县| 龙海市| 兴和县| 耒阳市| 纳雍县| 山东| 辛集市| 浙江省| 中方县| 庆云县| 巨野县| 抚顺县| 扬州市| 建昌县| 兴城市| 蒙自县| 安庆市| 和龙市| 甘洛县| 东辽县| 石泉县| 凤城市| 屯昌县| 临漳县| 淮北市| 瓮安县| 左云县| 兴安县| 伊通| 疏勒县| 洛宁县| 德州市| 平果县| 西昌市|