找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 12660|回复: 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 15:14 | 只看该作者
大佬,还有个问题,你这个闹钟中断,闹钟时间是这么设置的。有点懵
回复

使用道具 举报

楼主
ID:405183 发表于 2023-7-13 12:50 | 只看该作者
这里不用读取DR3的值也能更新时间么?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表