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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STM8L的RTC詳解及源程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:140343 發表于 2016-10-10 00:01 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
STM8L集成了RTC模塊,這個模塊除了具有時鐘鬧鈴功能外,還具有自動喚醒的功能.自動喚醒在低功耗模式中很有用,因為RTC使用的是LSE(外部32768Hz的時鐘),可以運行在低功耗模式下,可以使用此功能周期性的喚醒CPU,執行任務,而不需要CPU一直運行,這樣可以達到低功耗.
此公眾號已開啟留言功能,歡迎大家留言,評論


從上圖可以看出,RTC共有三個部分,第一部分是時鐘,第二部分是時鐘鬧鈴,第三部分是自動喚醒.本文對自動喚醒功能,不做介紹.

我們先看上圖的時鐘部分,RTC的時鐘選擇LSE,為32768Hz,RTCDIV[2:0]這三位我們設置為0,不分頻.然后進入到PRE_DIV[6:0]這個異步分頻器,這個7位的分頻器,默認值為0x7F,保持默認值.至此時鐘頻率為32768/(127+1)=256Hz.繼續往下走,遇到PREDIV_S[12:0]這個是十三位同步分頻器,此分頻器默認值為0xFF,同樣保持默認值,至此頻率為256/(255+1)=1Hz.提供給時鐘部分的頻率是1Hz,上圖中的Calendar部分,一秒鐘計數一次,更新一次時鐘寄存器,這么低頻率可以降低系統的功耗.

上圖是STM8L的內部時鐘寄存器,對這些寄存器進行寫操作時,需要先解鎖RTC寄存器的寫保護功能,讀操作無需解鎖.
上圖是,RTC時鐘功能的初始化配置流程.主要是配置年月日時分秒的初始值.

上圖是,RTC鬧鐘功能的初始化配置流程,這里主要是設置定時的時間.

要將RTC的寄存器中的時間,讀取出來顯示到液晶屏上,首先要判斷RSF位是否置位,置位說明RTC_TRx,RTC_DRx這些寄存器可以被讀取.讀取時,先讀TR1寄存器,此時其他寄存器中的數據被鎖存,直到RTC_DR3被讀取.


上圖是,本例程執行時的圖片,液晶屏1S更新一次數據,圖中顯示當前時間為21:46:30.同時右下角的藍燈會以2Hz的頻率閃爍,在鬧鐘中斷中取反藍燈控制IO,所以會是2Hz閃爍.
  1. /****************************************************************************************

  2. *開發環境:IAR for stm8 v6.5.3

  3. *硬件平臺:STM8L-DISCOVERY

  4. *功能說明:使用STM8L-DISCOVERY液晶屏顯示時間

  5. *作    者:茗風

  6. ****************************************************************************************/

  7. #include"iostm8l152c6.h"

  8. #include"stdint.h"

  9. #include"stdbool.h"

  10. bool bRTC_Update_Flag = false;//標志位

  11. /*  =========================================================================

  12.                                  LCD MAPPING

  13.     =========================================================================

  14.             A

  15.      _  ----------

  16. COL |_| |\   |J  /|

  17.        F| H  |  K |B

  18.      _  |  \ | /  |

  19. COL |_| --G-- --M--

  20.         |   /| \  |

  21.        E|  Q |  N |C

  22.      _  | /  |P  \|   

  23. DP  |_| -----------  

  24.             D      

  25. */


  26. #define a 0x01

  27. #define b 0x02

  28. #define c 0x04

  29. #define d 0x08

  30. #define e 0x10

  31. #define f 0x20

  32. #define g 0x40

  33. #define m 0x80


  34. const uint8_t LCD_Tab[10] = {

  35.                 a + b + c + d + e + f,                        // Displays "0"

  36.                 b + c,                                        // Displays "1"

  37.                 a + b + m + g + e + d,                        // Displays "2"

  38.                 a + b + m + g + c + d,                        // Displays "3"

  39.                 f + g + m + b + c,                        // Displays "4"

  40.                 a + f + g + m + c +d,                        // Displays "5"

  41.                 a + f + e + d + c + g + m ,                // Displays "6"

  42.                 a + b + c,                                // Displays "7"

  43.                 a + b + c + d + e + f + g + m,                // Displays "8"

  44.                 a + b + c + d + f + g + m                // Displays "9"


  45. };

  46. /******************************************************************************************************

  47. *  名    稱:void GPIO_Init(void)

  48. *  功    能:初始化PC7為高速推挽輸出

  49. *  入口參數:無

  50. *  出口參數:無

  51. *  說    明:

  52. *  范    例:無

  53. ******************************************************************************************************/

  54. void GPIO_Init(void)

  55. {

  56.    PC_CR1_C17  =1;//推挽輸出

  57.    PC_CR2_C27  =1;//高速輸出

  58.    PC_DDR_DDR7 =1;//PC4輸出

  59. //   PC_ODR_ODR7 =0;//輸出低電平

  60. }

  61. /******************************************************************************************************

  62. *  名    稱:void LCD_Config(void)

  63. *  功    能:配置LCD

  64. *  入口參數:無

  65. *  出口參數:無

  66. *  說    明:

  67. *  范    例:無

  68. ******************************************************************************************************/

  69. void LCD_Config(void)

  70. {

  71. //------打開LCD/RTC時鐘------

  72. //  CLK_PCKENR2_PCKEN22=1;//打開RTC時鐘,LCD刷新頻率與此時鐘有關

  73.   CLK_PCKENR2_PCKEN23=1;//打開LCD時鐘,讀寫LCD寄存器用到此時鐘

  74.   

  75. //---選擇LSE作為RTC時鐘---

  76. //  CLK_CRTCR_RTCSEL0=0;

  77. //  CLK_CRTCR_RTCSEL1=0;

  78. //  CLK_CRTCR_RTCSEL2=0;

  79. //  CLK_CRTCR_RTCSEL3=1;

  80. /* 0000: No clock selected

  81.    0001: HSI clock used as RTC clock source

  82.    0010: LSI clock used as RTC clock source

  83.    0100: HSE clock used as RTC clock source

  84.    1000: LSE clock used as RTC clock sourc*/

  85.   

  86. //----設置RTC時鐘分頻值----

  87. //  CLK_CRTCR_RTCDIV0=0;

  88. //  CLK_CRTCR_RTCDIV1=0;

  89. //  CLK_CRTCR_RTCDIV2=0;

  90. /*000: RTC clock source/1

  91.   001: RTC clock source /2

  92.   010: RTC clock source /4

  93.   011: RTC clock source /8

  94.   100: RTC clock source /16

  95.   101: RTC clock source /32

  96.   110: RTC clock source /64

  97.   111: RTC clock source /128*/

  98.   

  99.   

  100. //----設置LCD預分頻值----  

  101.   LCD_FRQ_PS0=0;// 2^PS[3:0]

  102.   LCD_FRQ_PS1=0;//分頻值為1

  103.   LCD_FRQ_PS2=0;

  104.   LCD_FRQ_PS3=0;

  105.   

  106. //----設置LCD分頻值----  

  107.   LCD_FRQ_DIV0=1;//DIV[3:0]+16

  108.   LCD_FRQ_DIV1=1;//分頻值為15+16=31

  109.   LCD_FRQ_DIV2=1;

  110.   LCD_FRQ_DIV3=1;  



  111. //以上分頻值的設置,最為了得到適合的LCD的刷新頻率,如果增大分頻值,會導致

  112. //LCD刷新頻率變低,會看到LCD顯示出現閃爍

  113. //比如,我們將PS[3:0]設置為0011,會看到液晶閃爍  

  114.   

  115. //----1/4 duty----  

  116.   LCD_CR1_DUTY0=1;//1/4 duty

  117.   LCD_CR1_DUTY1=1;

  118. /* Duty ratio selection

  119.    00: Static duty

  120.    01: 1/2 duty

  121.    10: 1/3 duty

  122.    11: 1/4 duty      */


  123. //----1/3 bias----     

  124.   LCD_CR1_B2=0;//1/3 bias

  125. /* 0: 1/3 bias

  126.    1: 1/2 bias  */


  127. //----內部電壓源----   

  128.   LCD_CR2_VSEL=0;

  129.   

  130. //----打開引腳的SEG功能----     

  131. // LCD_PM0=0xFF;//頭文件這個地方定義錯誤,無法直接向LCD_PM0寫入數據

  132. // LCD_PM1=0xFF;//PM0寄存器定義錯誤,導致PM1也無法直接寫入

  133. // LCD_PM2=0xFF;//PM0寄存器定義錯誤,導致PM2也無法直接寫入

  134.   *((uint8_t *)0x5404)=0xFF;//直接向LCD_PM0寄存器的地址寫入數據

  135.   *((uint8_t *)0x5405)=0xFF;//直接向LCD_PM1寄存器的地址寫入數據

  136.   *((uint8_t *)0x5406)=0xFF;//直接向LCD_PM2寄存器的地址寫入數據

  137.   

  138. //----To set contrast to mean value----   

  139.   LCD_CR2_CC0=0;//對比度

  140.   LCD_CR2_CC1=1;

  141.   LCD_CR2_CC2=0;

  142. /*  000: VLCD0  2.6V

  143.     001: VLCD1  2.7V

  144.     010: VLCD2  2.8V

  145.     011: VLCD3  2.9V

  146.     100: VLCD4  3.0V

  147.     101: VLCD5  3.1V

  148.     110: VLCD6  3.2V

  149.     111: VLCD7    */

  150.        

  151. //----Dead time 0----        

  152.   LCD_CR3_DEAD0=0;//no dead time

  153.   LCD_CR3_DEAD1=0;  

  154.   LCD_CR3_DEAD2=0;

  155. //----LCD_PulseOnDuration_1----

  156.   LCD_CR2_PON0=1;

  157.   LCD_CR2_PON1=0;  

  158.   LCD_CR2_PON2=0;         

  159. /*  000: 0 CLKps pulses

  160.     001: 1 CLKps pulses

  161.     010: 2 CLKps pulses

  162.     011: 3 CLKps pulses

  163.     100: 4 CLKps pulses

  164.     101: 5 CLKps pulses

  165.     110: 6 CLKps pulses

  166.     111: 7 CLKps pulses  */

  167.        

  168. //----Enable LCD peripheral----       

  169.   LCD_CR3_LCDEN=1;

  170. }

  171. /******************************************************************************************************

  172. *  名          稱:LCD_DisplayNum(uint8_t number)

  173. *  功            能:控制段式液晶屏的數字顯示部分

  174. *  入口參數:number:要顯示的數字

  175. *  出口參數:無

  176. *  說          明:根據數字的長度,判斷要顯示的長度,長度大于6位,只顯示后六位

  177. *  范          例:無

  178. ******************************************************************************************************/

  179. void LCD_DisplayNum(uint32_t number)

  180. {

  181.   uint8_t cnts=0,tmp=0;

  182.   

  183.   if(number<10)cnts=1;

  184.   else if(number<100)cnts=2;

  185.   else if(number<1000)cnts=3;

  186.   else if(number<10000)cnts=4;

  187.   else if(number<100000)cnts=5;

  188.   else if(number<(uint32_t) 1000000)cnts=6;

  189.   else cnts=6;


  190.   //判斷需要顯示數字的長度,確定在LCD屏上需要的位數

  191.   switch(cnts)

  192.   {

  193.     case 6:

  194.            tmp = LCD_Tab[number%1000000/100000];

  195.            ((tmp&m)==0)?(LCD_RAM0&=~0x02):(LCD_RAM0 |=0x02) ;

  196.            ((tmp&e)==0)?(LCD_RAM0&=~0x01):(LCD_RAM0 |=0x01) ;

  197.            ((tmp&g)==0)?(LCD_RAM2&=~0x80):(LCD_RAM2 |=0x80) ;

  198.            ((tmp&b)==0)?(LCD_RAM2&=~0x40):(LCD_RAM2 |=0x40) ;

  199.            ((tmp&f)==0)?(LCD_RAM6&=~0x08):(LCD_RAM6 |=0x08) ;

  200.            ((tmp&a)==0)?(LCD_RAM6&=~0x04):(LCD_RAM6 |=0x04) ;

  201.            ((tmp&c)==0)?(LCD_RAM3&=~0x20):(LCD_RAM3 |=0x20) ;

  202.            ((tmp&d)==0)?(LCD_RAM3&=~0x10):(LCD_RAM3 |=0x10) ;                     

  203.     case 5:

  204.            tmp = LCD_Tab[number%100000/10000];

  205.            ((tmp&m)==0)?(LCD_RAM0&=~0x08):(LCD_RAM0 |=0x08) ;

  206.            ((tmp&e)==0)?(LCD_RAM0&=~0x04):(LCD_RAM0 |=0x04) ;

  207.            ((tmp&g)==0)?(LCD_RAM2&=~0x20):(LCD_RAM2 |=0x20) ;

  208.            ((tmp&b)==0)?(LCD_RAM2&=~0x10):(LCD_RAM2 |=0x10) ;

  209.            ((tmp&f)==0)?(LCD_RAM6&=~0x02):(LCD_RAM6 |=0x02) ;

  210.            ((tmp&a)==0)?(LCD_RAM6&=~0x01):(LCD_RAM6 |=0x01) ;

  211.            ((tmp&c)==0)?(LCD_RAM3&=~0x80):(LCD_RAM3 |=0x80) ;

  212.            ((tmp&d)==0)?(LCD_RAM3&=~0x40):(LCD_RAM3 |=0x40) ;           

  213.            

  214.     case 4:

  215.            tmp = LCD_Tab[number%10000/1000];


  216.            ((tmp&m)==0)?(LCD_RAM0&=~0x20):(LCD_RAM0 |=0x20) ;

  217.            ((tmp&e)==0)?(LCD_RAM0&=~0x10):(LCD_RAM0 |=0x10) ;

  218.            ((tmp&g)==0)?(LCD_RAM2&=~0x08):(LCD_RAM2 |=0x08) ;

  219.            ((tmp&b)==0)?(LCD_RAM2&=~0x04):(LCD_RAM2 |=0x04) ;

  220.            ((tmp&f)==0)?(LCD_RAM5&=~0x80):(LCD_RAM5 |=0x80) ;

  221.            ((tmp&a)==0)?(LCD_RAM5&=~0x40):(LCD_RAM5 |=0x40) ;

  222.            ((tmp&c)==0)?(LCD_RAM4&=~0x02):(LCD_RAM4 |=0x02) ;

  223.            ((tmp&d)==0)?(LCD_RAM4&=~0x01):(LCD_RAM4 |=0x01) ;           

  224.     case 3:

  225.            tmp = LCD_Tab[number%1000/100];

  226.            ((tmp&m)==0)?(LCD_RAM0&=~0x80):(LCD_RAM0 |=0x80) ;

  227.            ((tmp&e)==0)?(LCD_RAM0&=~0x40):(LCD_RAM0 |=0x40) ;

  228.            ((tmp&g)==0)?(LCD_RAM2&=~0x02):(LCD_RAM2 |=0x02) ;

  229.            ((tmp&b)==0)?(LCD_RAM2&=~0x01):(LCD_RAM2 |=0x01) ;

  230.            ((tmp&f)==0)?(LCD_RAM5&=~0x20):(LCD_RAM5 |=0x20) ;

  231.            ((tmp&a)==0)?(LCD_RAM5&=~0x10):(LCD_RAM5 |=0x10) ;

  232.            ((tmp&c)==0)?(LCD_RAM4&=~0x08):(LCD_RAM4 |=0x08) ;

  233.            ((tmp&d)==0)?(LCD_RAM4&=~0x04):(LCD_RAM4 |=0x04) ;


  234.    case 2:

  235.            tmp = LCD_Tab[number%100/10];

  236.            ((tmp&m)==0)?(LCD_RAM1&=~0x02):(LCD_RAM1 |=0x02) ;

  237.            ((tmp&e)==0)?(LCD_RAM1&=~0x01):(LCD_RAM1 |=0x01) ;

  238.            ((tmp&g)==0)?(LCD_RAM1&=~0x80):(LCD_RAM1 |=0x80) ;

  239.            ((tmp&b)==0)?(LCD_RAM1&=~0x40):(LCD_RAM1 |=0x40) ;

  240.            ((tmp&f)==0)?(LCD_RAM5&=~0x08):(LCD_RAM5 |=0x08) ;

  241.            ((tmp&a)==0)?(LCD_RAM5&=~0x04):(LCD_RAM5 |=0x04) ;

  242.            ((tmp&c)==0)?(LCD_RAM4&=~0x20):(LCD_RAM4 |=0x20) ;

  243.            ((tmp&d)==0)?(LCD_RAM4&=~0x10):(LCD_RAM4 |=0x10) ;


  244.    case 1:

  245.            tmp = LCD_Tab[number%10];

  246.            ((tmp&m)==0)?(LCD_RAM1&=~0x08):(LCD_RAM1 |=0x08) ;

  247.            ((tmp&e)==0)?(LCD_RAM1&=~0x04):(LCD_RAM1 |=0x04) ;

  248.            ((tmp&g)==0)?(LCD_RAM1&=~0x20):(LCD_RAM1 |=0x20) ;

  249.            ((tmp&b)==0)?(LCD_RAM1&=~0x10):(LCD_RAM1 |=0x10) ;

  250.            ((tmp&f)==0)?(LCD_RAM5&=~0x02):(LCD_RAM5 |=0x02) ;

  251.            ((tmp&a)==0)?(LCD_RAM5&=~0x01):(LCD_RAM5 |=0x01) ;

  252.            ((tmp&c)==0)?(LCD_RAM4&=~0x80):(LCD_RAM4 |=0x80) ;

  253.            ((tmp&d)==0)?(LCD_RAM4&=~0x40):(LCD_RAM4 |=0x40) ;

  254.     break;


  255.     default:break;

  256.   }

  257. }

  258. /******************************************************************************************************

  259. *  名    稱:LCD_DisplayTime(uint8_t number)

  260. *  功    能:調用LCD數字顯示程序,顯示RTC的時分秒

  261. *  入口參數:無

  262. *  出口參數:1:運行出錯,退出  0:函數執行完成

  263. *  說   明:此函數,首先將RTC的時分秒寄存器按照順序,組合成一個數,然后調用上面的函數進行顯示

  264. *  范   例:無

  265. ******************************************************************************************************/

  266. uint8_t LCD_DisplayTime(void)

  267. {

  268.   uint32_t tmp=0;

  269.   if(RTC_ISR1_RSF==0)return 1;//判斷RTC時分秒寄存器的值有沒有被拷貝到TR影子寄存器,沒有就退出

  270.   

  271.   tmp += (uint32_t)RTC_TR1_SU;

  272.   tmp += (uint32_t)RTC_TR1_ST*10;

  273.   tmp += (uint32_t)RTC_TR2_MNU*100;

  274.   tmp += (uint32_t)RTC_TR2_MNT*1000;

  275.   tmp += (uint32_t)RTC_TR3_HU*10000;

  276.   tmp += (uint32_t)RTC_TR3_HT*100000;

  277.   RTC_ISR1_RSF=0;             //清零

  278.   LCD_DisplayNum(tmp);

  279.   return 0;

  280. }

  281. /******************************************************************************************************

  282. *  名    稱:void RTC_Config(void)

  283. *  功    能:重新設置RTC的時分秒年月日,同時鬧鈴設置為一秒進入一次中斷

  284. *  入口參數:無

  285. *  出口參數:無

  286. *  說    明:

  287. *  范    例:無

  288. ******************************************************************************************************/

  289. void RTC_Config(void)

  290. {   

  291. //------打開LCD/RTC時鐘------

  292.   CLK_PCKENR2_PCKEN22=1;

  293.   

  294. //---選擇LSE作為RTC時鐘---

  295.   CLK_CRTCR_RTCSEL0=0;

  296.   CLK_CRTCR_RTCSEL1=0;

  297.   CLK_CRTCR_RTCSEL2=0;

  298.   CLK_CRTCR_RTCSEL3=1;

  299. /* 0000: No clock selected

  300.    0001: HSI clock used as RTC clock source

  301.    0010: LSI clock used as RTC clock source

  302.    0100: HSE clock used as RTC clock source

  303.    1000: LSE clock used as RTC clock sourc*/

  304.   

  305. //----設置RTC時鐘分頻值----

  306.   CLK_CRTCR_RTCDIV0=0;

  307.   CLK_CRTCR_RTCDIV1=0;

  308.   CLK_CRTCR_RTCDIV2=0;

  309. /*000: RTC clock source/1

  310.   001: RTC clock source /2

  311.   010: RTC clock source /4

  312.   011: RTC clock source /8

  313.   100: RTC clock source /16

  314.   101: RTC clock source /32

  315.   110: RTC clock source /64

  316.   111: RTC clock source /128*/

  317.   

  318.   //關閉RTC寄存器的寫保護功能

  319.   RTC_WPR=0xCA;

  320.   RTC_WPR=0x53;

  321.   

  322.   RTC_ISR1_INIT=1;//進入初始化模式,計數器停止工作



  323.   while(!RTC_ISR1_INITF);//等待同步完成



  324. //初始化時間和日期

  325.   RTC_TR1_ST=0;//second tens

  326.   RTC_TR1_SU=0;//second units



  327.   RTC_TR2_MNT=4;//minute tens

  328.   RTC_TR2_MNU=7;//minute units

  329.   

  330.   RTC_TR3_PM=0;//AM/PM

  331.   RTC_TR3_HT=2;//hour tens

  332.   RTC_TR3_HU=1;//hour units



  333.   RTC_DR1_DT=2;//date tens

  334.   RTC_DR1_DU=6;//date units



  335.   RTC_DR2_WDU=1;//week day units

  336.   RTC_DR2_MT=0;//month tens  

  337.   RTC_DR2_MU=9;//month units


  338.   RTC_DR3_YT=1;//year tens

  339.   RTC_DR3_YU=6;//year units



  340.   RTC_CR1_FMT=0;//24小時模式

  341.   

  342. //  RTC_APRER=0x7F;//保持默認值0x7F

  343. //  RTC_SPRERL=0x00;

  344. //  RTC_SPRERL=0xFF;//保持默認值0xFF

  345. //以上兩個RTC時鐘分頻值保持默認

  346. //最終提供給日歷模塊的時鐘為 32768Hz/( (127+1)*(255+1) ) =1Hz



  347.   RTC_ISR1_INIT=0;//退出初始化模式

  348.   

  349. //設置鬧鐘

  350.   RTC_CR2_ALRAE=0;//disable the alarm

  351.   while(!RTC_ISR1_ALRAWF);//

  352. //設置鬧鐘時間

  353. //屏蔽了所有時間,導致鬧鐘1秒中執行一次,進入一次鬧鐘中斷

  354.   RTC_ALRMAR1_MSK1=1;//屏蔽秒定時

  355.   RTC_ALRMAR1_ALST=2;//second tens

  356.   RTC_ALRMAR1_ALSU=0;//second units



  357.   RTC_ALRMAR2_MSK2=1;//屏蔽分鐘定時

  358.   RTC_ALRMAR2_ALMNT=0;//minute tens

  359.   RTC_ALRMAR2_ALMNU=0;//minute units



  360.   RTC_ALRMAR3_MSK3=1;//屏蔽小時定時

  361.   RTC_ALRMAR3_ALHT=0;//hour tens

  362.   RTC_ALRMAR3_ALHU=6;//hour units

  363.   RTC_ALRMAR3_PM=0;



  364.   RTC_ALRMAR4_MSK4=1;//屏蔽關閉天定時

  365.   RTC_ALRMAR4_ALDT=0;

  366.   RTC_ALRMAR4_ALDU=0;

  367.   RTC_ALRMAR4_WDSEL=0;


  368.   RTC_CR2_ALRAE=1;//使能鬧鈴功能

  369.   RTC_CR2_ALRAIE=1;//使能鬧鈴中斷

  370.   

  371.   //programming the auto-wakeup timer

  372.   // RTC_CR2_WUTE=0;//disable the wakeup timer

  373.   // while(!RTC_ISR1_WUTWF);  


  374.   // RTC_WUTRH=0;//裝初值

  375.   // RTC_WUTRL=8;//

  376.    

  377.        

  378.   //配置自動喚醒分頻值

  379.   //RTC_CR1_WUCKSEL=0x03;//32768Hz/2=16384Hz

  380.   /*  000: RTCCLK/16 clock is selected

  381.    001: RTCCLK/8 clock is selected

  382.    010: RTCCLK/4 clock is selected

  383.    011: RTCCLK/2 clock is selected   */

  384.   // RTC_CR2_WUTE=0;//enable the tiemr again

  385.   // RTC_CR2_WUTIE=0;

  386.   

  387.   RTC_WPR=0x55;//使能寫保護

  388.   RTC_WPR=0x55;

  389. }

  390. void main(void)

  391. {

  392.   GPIO_Init();

  393.   LCD_Config();

  394.   RTC_Config();

  395.   asm("rim");               //enable interrupts

  396.   while(1)

  397.   {

  398.     if(bRTC_Update_Flag)

  399.     {

  400.       bRTC_Update_Flag=false;

  401.       LCD_DisplayTime();

  402.     }

  403.     asm("halt");//執行此條語句后,STM8L152C6進入低功耗模式,主時鐘關閉,但RTC仍然在運行

  404.   }

  405. }

  406. #pragma vector=RTC_ALARM_vector

  407. __interrupt void RTC_ALARM_ISR(void)

  408. {

  409.   PC_ODR_ODR7 ^=0x01;

  410.   bRTC_Update_Flag=true;

  411.   RTC_ISR2_ALRAF=0;

  412. }
復制代碼




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

使用道具 舉報

沙發
ID:405183 發表于 2023-7-13 12:50 | 只看該作者
這里不用讀取DR3的值也能更新時間么?
回復

使用道具 舉報

板凳
ID:405183 發表于 2023-7-13 15:14 | 只看該作者
大佬,還有個問題,你這個鬧鐘中斷,鬧鐘時間是這么設置的。有點懵
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: www.亚洲精品 | 国产福利91精品 | 欧美综合视频 | 欧美激情一区二区三级高清视频 | 亚洲一区二区三区视频 | 亚洲精品福利在线 | 亚洲精品在线观看视频 | 国产成人综合在线 | 欧美综合在线观看 | 成人免费视频网站在线看 | 亚洲国产精品人人爽夜夜爽 | 国产一级黄色网 | 美女黄视频网站 | a级性视频| 精品一区二区三区免费视频 | 中文字幕在线视频一区二区三区 | 精品免费国产一区二区三区四区 | 中文字幕av一区 | av在线成人 | 日韩视频观看 | 久草资源 | 亚洲精品久久久 | 久久在线 | 精品一区二区三区91 | 三级在线免费 | 日本亚洲精品成人欧美一区 | 亚洲国产一区视频 | 台湾佬成人网 | 91精品午夜窝窝看片 | 99精品电影| 99精品久久久国产一区二区三 | 福利色导航| 全部免费毛片在线播放网站 | 亚洲精品电影 | 免费在线看黄 | 大陆一级毛片免费视频观看 | 青青久在线视频 | 欧美成人精品一区二区男人看 | 夜夜精品视频 | 国产高清视频在线观看 | 天啪 |