<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32學(xué)習(xí)筆記——實(shí)時(shí)時(shí)鐘RTC

          STM32學(xué)習(xí)筆記——實(shí)時(shí)時(shí)鐘RTC

          作者: 時(shí)間:2016-11-28 來源:網(wǎng)絡(luò) 收藏

          本文引用地址:http://www.ex-cimer.com/article/201611/322893.htm

          if(HSEStartUpStatus==SUCCESS)//外部高速時(shí)鐘已經(jīng)準(zhǔn)別好

          {

          //開啟FLASH的預(yù)取功能

          FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

          //FLASH延遲2個周期

          FLASH_SetLatency(FLASH_Latency_2);

          //配置AHB(HCLK)時(shí)鐘=SYSCLK

          RCC_HCLKConfig(RCC_SYSCLK_Div1);

          //配置APB2(PCLK2)鐘=AHB時(shí)鐘

          RCC_PCLK2Config(RCC_HCLK_Div1);

          //配置APB1(PCLK1)鐘=AHB1/2時(shí)鐘

          RCC_PCLK1Config(RCC_HCLK_Div2);

          //配置PLL時(shí)鐘==外部高速晶體時(shí)鐘*9PLLCLK=8MHz*9=72MHz

          RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);

          //使能PLL時(shí)鐘

          RCC_PLLCmd(ENABLE);

          //等待PLL時(shí)鐘就緒

          while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET)

          {

          }

          //配置系統(tǒng)時(shí)鐘=PLL時(shí)鐘

          RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

          //檢查PLL時(shí)鐘是否作為系統(tǒng)時(shí)鐘

          while(RCC_GetSYSCLKSource()!=0x08)

          {

          }

          }

          //啟動GPIO

          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);

          //啟動AFIO

          RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

          }

          voidNVIC_Configuration(void)

          {

          NVIC_InitTypeDefNVIC_InitStructure;//定義NVIC配置的結(jié)構(gòu)體變量

          #ifdefVECT_TAB_RAM

          NVIC_SetVectorTable(NVIC_VectTab_RAM,0x0);

          #else

          NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);

          #endif

          NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

          NVIC_InitStructure.NVIC_IRQChannel=RTC_IRQChannel;//指定是RTC全局中斷

          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;

          NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;

          NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;

          NVIC_Init(&NVIC_InitStructure);

          }

          voidGPIO_Configuration(void)

          {

          GPIO_InitTypeDefGPIO_InitStructure;//定義配置GPIO的結(jié)構(gòu)體變量

          GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);//改變指定管腳的映射

          //第一個參數(shù)選擇重映射的管腳用以選擇用作事件輸出的GPIO端口在這里是SWJ完全失能詳見《STM32函數(shù)說明》P132

          //第二個參數(shù)指定管腳重映射的新狀態(tài),可以是:ENABLE或DISABLE

          GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;//選擇所有管腳

          GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽輸出模式

          GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//引腳頻率50M

          GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化PA

          GPIO_Init(GPIOB,&GPIO_InitStructure);//初始化PB

          //????

          GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;

          GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;

          GPIO_Init(GPIOB,&GPIO_InitStructure);

          }

          voidRTC_Configuration(void)

          {

          //啟用PWR和BKP的時(shí)鐘(fromAPB1)

          RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP,ENABLE);

          //后備域解鎖

          PWR_BackupAccessCmd(ENABLE);//使能后備寄存器訪問

          //備份寄存器模塊復(fù)位

          BKP_DeInit();//將BKP的全部寄存器重設(shè)為缺省值

          RCC_LSEConfig(RCC_LSE_ON);//設(shè)置外部低速晶振(LSE)32.768K參數(shù)指定LSE的狀態(tài),可以是:RCC_LSE_ON:LSE晶振ON

          //RCC_LSE_ON:LSE晶振OFF,RCC_LSE_Bypass:LSE晶振被外部時(shí)鐘旁路

          //等待穩(wěn)定

          while(RCC_GetFlagStatus(RCC_FLAG_LSERDY)==RESET)

          {}

          //RTC時(shí)鐘源配置成LSE(外部32.768K)

          RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);//設(shè)置RTC時(shí)鐘,參數(shù)指定RTC時(shí)鐘,可以是:RCC_RTCCLKSource_LSE:選擇LSE作為RTC時(shí)鐘

          //RCC_RTCCLKSource_LSI:選擇LSI作為RTC時(shí)鐘,RCC_RTCCLKSource_HSE_Div128:選擇HSE時(shí)鐘128分頻作為RTC時(shí)鐘

          //RTC開啟

          RCC_RTCCLKCmd(ENABLE);

          //開啟后需要等待APB1時(shí)鐘與RTC時(shí)鐘同步,才能讀寫寄存器

          RTC_WaitForSynchro();

          //每一次讀寫寄存器前,要確定上一個操作已經(jīng)結(jié)束

          RTC_WaitForLastTask();//等待最近一次對RTC寄存器的寫操作完成

          //使能秒中斷

          RTC_ITConfig(RTC_IT_SEC,ENABLE);

          //讀寫寄存器前,要確定上一個操作已經(jīng)結(jié)束

          RTC_WaitForLastTask();

          //設(shè)置RTC分頻器,使RTC時(shí)鐘為1Hz

          //RTCperiod=RTCCLK/RTC_PR=(32.768KHz)/(32767+1)

          RTC_SetPrescaler(32767);

          //等待寄存器寫入完成

          RTC_WaitForLastTask();

          //等待寫入完成

          RTC_WaitForLastTask();

          }

          voidTime_Adjust(void)//校準(zhǔn)時(shí)間函數(shù)

          {

          RTC_WaitForLastTask();

          RTC_SetCounter(12*3600+2*60+0);//設(shè)置RTC計(jì)數(shù)器的值參數(shù)是新的RTC計(jì)數(shù)器的值

          //在使用本函數(shù)前必須先調(diào)用函數(shù)RTC_WaitForLastTask(),等待標(biāo)志位RTOFF被設(shè)置

          RTC_WaitForLastTask();

          }

          voidTime_Display(u32TimeVar)//把RTC計(jì)數(shù)器的值轉(zhuǎn)化為時(shí),分,秒進(jìn)制

          {

          THH=TimeVar/3600;

          TMM=(TimeVar%3600)/60;

          TSS=(TimeVar%3600)%60;

          }

          voidassert_failed(u8*file,u32line)

          {

          while(1)

          {}

          }

          中斷服務(wù)程序在stm32f10x_it.c文件中,其中RTC中斷處理函數(shù)如下:

          voidRTC_IRQHandler(void)//RTC的中斷服務(wù)程序

          {

          GPIO_WriteBit(GPIOB,GPIO_Pin_7,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_7)));//B7口取反

          if(RTC_GetITStatus(RTC_IT_SEC)!=RESET)

          {

          RTC_ClearITPendingBit(RTC_IT_SEC);//清除RTC的中斷待處理位

          GPIO_WriteBit(GPIOB,GPIO_Pin_7,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_7)));

          TimeDisplay=1;

          RTC_WaitForLastTask();

          if(RTC_GetCounter()==0x00015180)

          {

          RTC_SetCounter(0x0);

          RTC_WaitForLastTask();

          }

          }

          }


          上一頁 1 2 下一頁

          評論


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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();