找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 13775|回復(fù): 2
收起左側(cè)

STM8L的RTC詳解及源程序

[復(fù)制鏈接]
ID:140343 發(fā)表于 2016-10-10 00:01 | 顯示全部樓層 |閱讀模式
STM8L集成了RTC模塊,這個(gè)模塊除了具有時(shí)鐘鬧鈴功能外,還具有自動(dòng)喚醒的功能.自動(dòng)喚醒在低功耗模式中很有用,因?yàn)镽TC使用的是LSE(外部32768Hz的時(shí)鐘),可以運(yùn)行在低功耗模式下,可以使用此功能周期性的喚醒CPU,執(zhí)行任務(wù),而不需要CPU一直運(yùn)行,這樣可以達(dá)到低功耗.
此公眾號(hào)已開啟留言功能,歡迎大家留言,評(píng)論


從上圖可以看出,RTC共有三個(gè)部分,第一部分是時(shí)鐘,第二部分是時(shí)鐘鬧鈴,第三部分是自動(dòng)喚醒.本文對(duì)自動(dòng)喚醒功能,不做介紹.

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

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

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

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


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

  2. *開發(fā)環(huán)境:IAR for stm8 v6.5.3

  3. *硬件平臺(tái):STM8L-DISCOVERY

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

  5. *作    者:茗風(fēng)

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

  7. #include"iostm8l152c6.h"

  8. #include"stdint.h"

  9. #include"stdbool.h"

  10. bool bRTC_Update_Flag = false;//標(biāo)志位

  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. *  入口參數(shù):無

  50. *  出口參數(shù):無

  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. *  入口參數(shù):無

  65. *  出口參數(shù):無

  66. *  說    明:

  67. *  范    例:無

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

  69. void LCD_Config(void)

  70. {

  71. //------打開LCD/RTC時(shí)鐘------

  72. //  CLK_PCKENR2_PCKEN22=1;//打開RTC時(shí)鐘,LCD刷新頻率與此時(shí)鐘有關(guān)

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

  74.   

  75. //---選擇LSE作為RTC時(shí)鐘---

  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. //----設(shè)置RTC時(shí)鐘分頻值----

  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. //----設(shè)置LCD預(yù)分頻值----  

  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. //----設(shè)置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. //以上分頻值的設(shè)置,最為了得到適合的LCD的刷新頻率,如果增大分頻值,會(huì)導(dǎo)致

  112. //LCD刷新頻率變低,會(huì)看到LCD顯示出現(xiàn)閃爍

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

  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. //----內(nèi)部電壓源----   

  128.   LCD_CR2_VSEL=0;

  129.   

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

  131. // LCD_PM0=0xFF;//頭文件這個(gè)地方定義錯(cuò)誤,無法直接向LCD_PM0寫入數(shù)據(jù)

  132. // LCD_PM1=0xFF;//PM0寄存器定義錯(cuò)誤,導(dǎo)致PM1也無法直接寫入

  133. // LCD_PM2=0xFF;//PM0寄存器定義錯(cuò)誤,導(dǎo)致PM2也無法直接寫入

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

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

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

  137.   

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

  139.   LCD_CR2_CC0=0;//對(duì)比度

  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. *  功            能:控制段式液晶屏的數(shù)字顯示部分

  174. *  入口參數(shù):number:要顯示的數(shù)字

  175. *  出口參數(shù):無

  176. *  說          明:根據(jù)數(shù)字的長度,判斷要顯示的長度,長度大于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.   //判斷需要顯示數(shù)字的長度,確定在LCD屏上需要的位數(shù)

  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. *  功    能:調(diào)用LCD數(shù)字顯示程序,顯示RTC的時(shí)分秒

  261. *  入口參數(shù):無

  262. *  出口參數(shù):1:運(yùn)行出錯(cuò),退出  0:函數(shù)執(zhí)行完成

  263. *  說   明:此函數(shù),首先將RTC的時(shí)分秒寄存器按照順序,組合成一個(gè)數(shù),然后調(diào)用上面的函數(shù)進(jìn)行顯示

  264. *  范   例:無

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

  266. uint8_t LCD_DisplayTime(void)

  267. {

  268.   uint32_t tmp=0;

  269.   if(RTC_ISR1_RSF==0)return 1;//判斷RTC時(shí)分秒寄存器的值有沒有被拷貝到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. *  功    能:重新設(shè)置RTC的時(shí)分秒年月日,同時(shí)鬧鈴設(shè)置為一秒進(jìn)入一次中斷

  284. *  入口參數(shù):無

  285. *  出口參數(shù):無

  286. *  說    明:

  287. *  范    例:無

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

  289. void RTC_Config(void)

  290. {   

  291. //------打開LCD/RTC時(shí)鐘------

  292.   CLK_PCKENR2_PCKEN22=1;

  293.   

  294. //---選擇LSE作為RTC時(shí)鐘---

  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. //----設(shè)置RTC時(shí)鐘分頻值----

  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.   //關(guān)閉RTC寄存器的寫保護(hù)功能

  319.   RTC_WPR=0xCA;

  320.   RTC_WPR=0x53;

  321.   

  322.   RTC_ISR1_INIT=1;//進(jìn)入初始化模式,計(jì)數(shù)器停止工作



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



  324. //初始化時(shí)間和日期

  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小時(shí)模式

  341.   

  342. //  RTC_APRER=0x7F;//保持默認(rèn)值0x7F

  343. //  RTC_SPRERL=0x00;

  344. //  RTC_SPRERL=0xFF;//保持默認(rèn)值0xFF

  345. //以上兩個(gè)RTC時(shí)鐘分頻值保持默認(rèn)

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



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

  348.   

  349. //設(shè)置鬧鐘

  350.   RTC_CR2_ALRAE=0;//disable the alarm

  351.   while(!RTC_ISR1_ALRAWF);//

  352. //設(shè)置鬧鐘時(shí)間

  353. //屏蔽了所有時(shí)間,導(dǎo)致鬧鐘1秒中執(zhí)行一次,進(jìn)入一次鬧鐘中斷

  354.   RTC_ALRMAR1_MSK1=1;//屏蔽秒定時(shí)

  355.   RTC_ALRMAR1_ALST=2;//second tens

  356.   RTC_ALRMAR1_ALSU=0;//second units



  357.   RTC_ALRMAR2_MSK2=1;//屏蔽分鐘定時(shí)

  358.   RTC_ALRMAR2_ALMNT=0;//minute tens

  359.   RTC_ALRMAR2_ALMNU=0;//minute units



  360.   RTC_ALRMAR3_MSK3=1;//屏蔽小時(shí)定時(shí)

  361.   RTC_ALRMAR3_ALHT=0;//hour tens

  362.   RTC_ALRMAR3_ALHU=6;//hour units

  363.   RTC_ALRMAR3_PM=0;



  364.   RTC_ALRMAR4_MSK4=1;//屏蔽關(guān)閉天定時(shí)

  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.   //配置自動(dòng)喚醒分頻值

  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;//使能寫保護(hù)

  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");//執(zhí)行此條語句后,STM8L152C6進(jìn)入低功耗模式,主時(shí)鐘關(guān)閉,但RTC仍然在運(yùn)行

  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. }
復(fù)制代碼




回復(fù)

使用道具 舉報(bào)

ID:405183 發(fā)表于 2023-7-13 12:50 | 顯示全部樓層
這里不用讀取DR3的值也能更新時(shí)間么?
回復(fù)

使用道具 舉報(bào)

ID:405183 發(fā)表于 2023-7-13 15:14 | 顯示全部樓層
大佬,還有個(gè)問題,你這個(gè)鬧鐘中斷,鬧鐘時(shí)間是這么設(shè)置的。有點(diǎn)懵
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表