久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標(biāo)題: RTC實(shí)時(shí)時(shí)鐘驅(qū)動(dòng)函數(shù)固件庫(kù)版和寄存器版對(duì)比 [打印本頁(yè)]

作者: liuyy    時(shí)間: 2015-1-12 15:17
標(biāo)題: RTC實(shí)時(shí)時(shí)鐘驅(qū)動(dòng)函數(shù)固件庫(kù)版和寄存器版對(duì)比
      前天,有個(gè)朋友問:如果電腦突然掉電導(dǎo)致一些重要數(shù)據(jù)丟失怎么辦?我覺得對(duì)于STM32而言無(wú)需外掛E2PROM,憑借自身資源就可以解決:1,大容量STM32一般有512k的flash,可以在程序運(yùn)行當(dāng)中實(shí)時(shí)將重要數(shù)據(jù)更新到片內(nèi)flash中;具體如何操作可以參考IAP例程,這個(gè)例程很好,不光可以學(xué)習(xí)IAP(在應(yīng)用編程功能),還可以學(xué)到CM3內(nèi)核的一些結(jié)構(gòu)知識(shí)和對(duì)片內(nèi)flash的操作;2,STM32的備份域(BKP)有42個(gè)u16類型數(shù)據(jù)寄存器,只要按流程操作這42個(gè)16位的備份域數(shù)據(jù)寄存器就可以當(dāng)E2PROM用,當(dāng)然必須配有電池。通過對(duì)備份域的操作還可以做一個(gè)鬧鐘。

       STM32的資源很豐富對(duì)應(yīng)每個(gè)功能,STM32的軟件工程師為其搭配了相應(yīng)的庫(kù)函數(shù)。有了這個(gè)固件庫(kù)使得我們對(duì)STM32的應(yīng)用程序開發(fā)更加簡(jiǎn)單,節(jié)省開發(fā)時(shí)間。但是我感覺要熟練運(yùn)用庫(kù)函數(shù)也不是一件容易的事,必須經(jīng)常練習(xí)。

下面是RTC實(shí)時(shí)時(shí)鐘固件庫(kù)版驅(qū)動(dòng)函數(shù)(原子例程):
  1. //實(shí)時(shí)時(shí)鐘配置
  2. //初始化RTC時(shí)鐘,同時(shí)檢測(cè)時(shí)鐘是否工作正常
  3. //BKP->DR1用于保存是否第一次配置的設(shè)置
  4. //返回0:正常
  5. //其他:錯(cuò)誤代碼
  6. u8 RTC_Init(void)
  7. {
  8. //檢查是不是第一次配置時(shí)鐘
  9. u8 temp=0;

  10. if (BKP_ReadBackupRegister(BKP_DR1) != 0x5050)//從指定的后備寄存器中讀出數(shù)據(jù):讀出了與寫入的指定數(shù)據(jù)不相乎
  11. {
  12. RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);//使能PWR和BKP外設(shè)時(shí)鐘   
  13. PWR_BackupAccessCmd(ENABLE);//使能后備寄存器訪問
  14. BKP_DeInit();//復(fù)位備份區(qū)域
  15. RCC_LSEConfig(RCC_LSE_ON);//設(shè)置外部低速晶振(LSE),使用外設(shè)低速晶振
  16. while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)//檢查指定的RCC標(biāo)志位設(shè)置與否,等待低速晶振就緒
  17. {
  18. temp++;
  19. delay_ms(10);
  20. }
  21. if(temp>=250)return 1;//初始化時(shí)鐘失敗,晶振有問題   
  22. RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);//設(shè)置RTC時(shí)鐘(RTCCLK),選擇LSE作為RTC時(shí)鐘   
  23. RCC_RTCCLKCmd(ENABLE);//使能RTC時(shí)鐘  
  24. RTC_WaitForLastTask();//等待最近一次對(duì)RTC寄存器的寫操作完成
  25. RTC_WaitForSynchro();//等待RTC寄存器同步  
  26. RTC_ITConfig(RTC_IT_SEC, ENABLE);//使能RTC秒中斷
  27. RTC_WaitForLastTask();//等待最近一次對(duì)RTC寄存器的寫操作完成
  28. RTC_EnterConfigMode();/// 允許配置
  29. RTC_SetPrescaler(32767); //設(shè)置RTC預(yù)分頻的值
  30. RTC_WaitForLastTask();//等待最近一次對(duì)RTC寄存器的寫操作完成
  31. RTC_Set(2009,12,2,10,0,55);  //設(shè)置時(shí)間
  32. RTC_ExitConfigMode(); //退出配置模式  
  33. BKP_WriteBackupRegister(BKP_DR1, 0X5050);//向指定的后備寄存器中寫入用戶程序數(shù)據(jù)
  34. }
  35. else//系統(tǒng)繼續(xù)計(jì)時(shí)
  36. {

  37. RTC_WaitForSynchro();//等待最近一次對(duì)RTC寄存器的寫操作完成
  38. RTC_ITConfig(RTC_IT_SEC, ENABLE);//使能RTC秒中斷
  39. RTC_WaitForLastTask();//等待最近一次對(duì)RTC寄存器的寫操作完成
  40. }
  41. RTC_NVIC_Config();//RCT中斷分組設(shè)置         
  42. RTC_Get();//更新時(shí)間
  43. return 0; //ok

  44. }
復(fù)制代碼

      該函數(shù)用的就是固件庫(kù)中關(guān)于RTC部分的函數(shù),整個(gè)操作都是按數(shù)據(jù)手冊(cè)的操作流程來(lái)執(zhí)行;其中用到了c語(yǔ)言編程技巧,臨時(shí)變量temp防止程序死機(jī)。中斷如何配置?一般都有固定格式。

下面是RTC實(shí)時(shí)時(shí)鐘寄存器版驅(qū)動(dòng)函數(shù)(原子例程):
  1. //實(shí)時(shí)時(shí)鐘配置
  2. //初始化RTC時(shí)鐘,同時(shí)檢測(cè)時(shí)鐘是否工作正常
  3. //BKP->DR1用于保存是否第一次配置的設(shè)置
  4. //返回0:正常
  5. //其他:錯(cuò)誤代碼
  6. u8 RTC_Init(void)
  7. {
  8. //檢查是不是第一次配置時(shí)鐘
  9. u8 temp=0;
  10. if(BKP->DR1!=0X5050)//第一次配置
  11. {
  12. RCC->APB1ENR|=1<<28;     //使能電源時(shí)鐘   
  13. RCC->APB1ENR|=1<<27;     //使能備份時(shí)鐘   
  14. PWR->CR|=1<<8;           //取消備份區(qū)寫保護(hù)
  15. RCC->BDCR|=1<<16;        //備份區(qū)域軟復(fù)位   
  16. RCC->BDCR&=~(1<<16);     //備份區(qū)域軟復(fù)位結(jié)束   
  17.    RCC->BDCR|=1<<0;         //開啟外部低速振蕩器
  18.    while((!(RCC->BDCR&0X02))&&temp<250)//等待外部時(shí)鐘就緒
  19. {
  20. temp++;
  21. delay_ms(10);
  22. };
  23. if(temp>=250)return 1;//初始化時(shí)鐘失敗,晶振有問題   

  24. RCC->BDCR|=1<<8; //LSI作為RTC時(shí)鐘     
  25. RCC->BDCR|=1<<15;//RTC時(shí)鐘使能  
  26. while(!(RTC->CRL&(1<<5)));//等待RTC寄存器操作完成
  27.     while(!(RTC->CRL&(1<<3)));//等待RTC寄存器同步  
  28.     RTC->CRH|=0X01;    //允許秒中斷
  29.     while(!(RTC->CRL&(1<<5)));//等待RTC寄存器操作完成
  30. RTC->CRL|=1<<4;              //允許配置

  31. RTC->PRLH=0X0000;
  32. RTC->PRLL=32767;          //時(shí)鐘周期設(shè)置(有待觀察,看是否跑慢了?)理論值:32767
  33.    
  34. RTC_Set(2012,9,7,13,16,55);  //設(shè)置時(shí)間  
  35. RTC->CRL&=~(1<<4);           //配置更新
  36. while(!(RTC->CRL&(1<<5)));   //等待RTC寄存器操作完成   
  37. BKP->DR1=0X5050;  
  38. printf("FIRST TIME\n");
  39. }else//系統(tǒng)繼續(xù)計(jì)時(shí)
  40. {
  41.     while(!(RTC->CRL&(1<<3)));//等待RTC寄存器同步  
  42.     RTC->CRH|=0X01;    //允許秒中斷
  43.     while(!(RTC->CRL&(1<<5)));//等待RTC寄存器操作完成
  44. printf("OK\n");
  45. }      
  46. MY_NVIC_Init(0,0,RTC_IRQChannel,2);//優(yōu)先級(jí)設(shè)置   
  47. RTC_Get();//更新時(shí)間
  48. return 0; //ok
  49. }
復(fù)制代碼



就個(gè)人而言偏愛寄存器版本函數(shù),思路清晰;同時(shí)可以學(xué)習(xí)如何操作寄存器。







歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 久久精品欧美一区二区三区不卡 | 久久国产精品视频 | 四虎网站| 四虎影视av| 午夜精品视频 | 国产超碰人人模人人爽人人添 | 欧美精品入口蜜桃 | 日韩精品久久久久久免费 | 欧美一区二区视频在线观看 | 欧美做受喷浆在线观看 | 夜夜操天天 | 狠狠狠狠干 | 久久久久久久久国产精品 | 中文精品一区 | 日韩一区二区三区在线 | 欧美顶级黄色大片免费 | 国产精品久久久久永久免费看 | 久久精品在线观看 | 欧美操操操 | 99热在线免费观看 | 久久国| 午夜在线观看视频 | 在线免费观看av网站 | 亚洲激情文学 | 国产精品国产三级国产 | 天天操夜夜骑 | 91黄色免费 | 少妇一级淫片免费观看 | 四虎新网址 | 国产精品二区一区二区aⅴ污介绍 | 免费av不卡| 国产精品久久久久久久免费看 | 日韩三级久久 | 特级黄色大片 | 欧美一区二区三区的 | 黄色片在线观看视频 | 一级真人毛片 | 久久久一级片 | 日韩一级免费视频 | www.久草.com| 午夜在线观看视频 |