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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5300|回復: 0
打印 上一主題 下一主題
收起左側

RTC實時時鐘驅動函數固件庫版和寄存器版對比

[復制鏈接]
跳轉到指定樓層
樓主
ID:72008 發表于 2015-1-12 15:17 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
      前天,有個朋友問:如果電腦突然掉電導致一些重要數據丟失怎么辦?我覺得對于STM32而言無需外掛E2PROM,憑借自身資源就可以解決:1,大容量STM32一般有512k的flash,可以在程序運行當中實時將重要數據更新到片內flash中;具體如何操作可以參考IAP例程,這個例程很好,不光可以學習IAP(在應用編程功能),還可以學到CM3內核的一些結構知識和對片內flash的操作;2,STM32的備份域(BKP)有42個u16類型數據寄存器,只要按流程操作這42個16位的備份域數據寄存器就可以當E2PROM用,當然必須配有電池。通過對備份域的操作還可以做一個鬧鐘。

       STM32的資源很豐富對應每個功能,STM32的軟件工程師為其搭配了相應的庫函數。有了這個固件庫使得我們對STM32的應用程序開發更加簡單,節省開發時間。但是我感覺要熟練運用庫函數也不是一件容易的事,必須經常練習。

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

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

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

  44. }
復制代碼

      該函數用的就是固件庫中關于RTC部分的函數,整個操作都是按數據手冊的操作流程來執行;其中用到了c語言編程技巧,臨時變量temp防止程序死機。中斷如何配置?一般都有固定格式。

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

  24. RCC->BDCR|=1<<8; //LSI作為RTC時鐘     
  25. RCC->BDCR|=1<<15;//RTC時鐘使能  
  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;          //時鐘周期設置(有待觀察,看是否跑慢了?)理論值:32767
  33.    
  34. RTC_Set(2012,9,7,13,16,55);  //設置時間  
  35. RTC->CRL&=~(1<<4);           //配置更新
  36. while(!(RTC->CRL&(1<<5)));   //等待RTC寄存器操作完成   
  37. BKP->DR1=0X5050;  
  38. printf("FIRST TIME\n");
  39. }else//系統繼續計時
  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);//優先級設置   
  47. RTC_Get();//更新時間
  48. return 0; //ok
  49. }
復制代碼



就個人而言偏愛寄存器版本函數,思路清晰;同時可以學習如何操作寄存器。


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品久久久久久久岛一牛影视 | 欧美亚州综合 | 97免费在线视频 | 日韩高清国产一区在线 | 日韩免费一区 | 天天视频成人 | 国产主播第一页 | 在线观看国产网站 | 草草网 | 日韩精品一区二区三区 | 欧美 日韩 中文 | 久久美女网| 日日干天天操 | 久久中文一区二区 | 精品综合视频 | 欧美日韩在线一区二区 | 久久久久久久久久久久91 | 91动漫在线观看 | 黑人精品欧美一区二区蜜桃 | 成人在线免费视频观看 | 久久久久国色av免费观看性色 | 亚洲高清在线观看 | 亚洲视频一区二区三区 | 日韩在线精品 | 91原创视频在线观看 | 国产精品爱久久久久久久 | 国产专区在线 | 日韩不卡一区二区三区 | 国产午夜精品一区二区三区在线观看 | 曰批视频在线观看 | 日韩和的一区二在线 | 午夜在线视频一区二区三区 | 在线播放国产一区二区三区 | 午夜理伦三级理论三级在线观看 | 91色视频在线 | 亚洲国产视频一区二区 | 国产成人网 | 欧美一级在线观看 | 亚洲精品美女视频 | 欧美操操操 | 欧美福利精品 |