{"id":11193,"date":"2016-03-18T12:05:42","date_gmt":"2016-03-18T16:05:42","guid":{"rendered":"http:\/\/embedded-lab.com\/blog\/?p=11193"},"modified":"2023-04-20T23:10:32","modified_gmt":"2023-04-21T03:10:32","slug":"stm32s-internal-rtc","status":"publish","type":"post","link":"https:\/\/embedded-lab.com\/blog\/stm32s-internal-rtc\/","title":{"rendered":"STM32\u2019s internal RTC"},"content":{"rendered":"<p style=\"text-align: justify\">A Real Time Clock (RTC) is a timing element dedicated for keeping time. In many applications, especially where precise timed-operations are needed to be performed, a RTC is a very useful tool. Examples of such applications apart from clocks and watches include washing machines, medicine dispensers, data loggers, etc. Basically a RTC is a timer-counter but unlike other timers of a MCU it is much more accurate. Previous to this post, we explored STM32 timers but those were useful for applications like PWM generation, time-bases and other waveform-related tasks. Those were not suitable for precise time-keeping. In most 8-bit MCUs like the regular PICs and AVRs, there are no built-in RTC modules and so we need to use dedicated RTC chips like the popular DS1302 or PCF8563 when we need an on-board precise time-keeping device. Those chips also need some additional circuitry, wiring and circuit board space. At present, however, most modern MCUs come packed with literally every possible hardware a designer may think of. It is only up to a designer to decide which resources to use from a modern-era micro to meet a specific design goal. Gone are the days when MCUs were manufactured for application specific requirements and also gone are the days of implementing and involving multiple assets in a design. Thus cost, time and space are dramatically reduced, resulting smarter, sleeker and smaller affordable devices. Fortunately STM32s are in that list of those modern era microcontrollers. STM32 MCUs come with built-in RTC modules that require no additional hardware support. This tutorial covers basic features of STM32&#8217;s internal RTC and \u00a0how to use it for time-keeping applications.<\/p>\n<p style=\"text-align: justify\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2016\/03\/Block_Diagram_Simplified.bmp\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-11197 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2016\/03\/Block_Diagram_Simplified.bmp\" alt=\"Block_Diagram_Simplified\" width=\"494\" height=\"372\" \/><\/a><\/p>\n<p style=\"text-align: justify\"><!--more--><\/p>\n<h4>Feature of STM32 RTC Block<\/h4>\n<p style=\"text-align: justify\">The embedded RTC of a STM32 micro is an independent binary-coded-decimal (BCD) timer counter. The RTC core consists of counters, prescalers, clock dividers, alarm data registers, etc. Like with any standard RTC chip, the embedded RTC can be used to provide a full-featured software-based calendar along with alarm functions. However more needs to be done on the software end rather than the hardware end. When using RTC chips, it is only required to read or write individual date-time registers. In a STM32 micro, we need to do more than that as no separate date-time registers exist.<\/p>\n<p style=\"text-align: justify\">Resetting or waking up the MCU from a sleep\/standby mode does not reinitializes time once set. It gets even better if there is a battery backup on battery backup (<strong><em>VBAT<\/em><\/strong>) pin. All VDDs of a STM32 can be turned off or in other words the entire MCU core can be fully shut down but the battery backup keeps the RTC and the backup domain running. Thus time is not varied or lost during powered down and sleep modes. Key features of the STM32 embedded RTC are highlighted below:<\/p>\n<ul>\n<li>Programmable prescaler: division factor up to .<\/li>\n<li>32-bit programmable counter for long-term measurement<\/li>\n<li>Two separate clocks: PCLK1 for the APB1 interface and RTC clock.<\/li>\n<li>The RTC clock source could be any of the following ones\n<ul>\n<li>HSE clock divided by 128.<\/li>\n<li>LSE oscillator clock.<\/li>\n<li>LSI oscillator clock.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2016\/03\/RTC-Clock-Sources.bmp\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-11203 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2016\/03\/RTC-Clock-Sources-580x189.bmp\" alt=\"RTC Clock Sources\" width=\"580\" height=\"189\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2016\/03\/RTC-Clock-Sources-580x189.bmp 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2016\/03\/RTC-Clock-Sources.bmp 597w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><br \/>\n<\/a><\/p>\n<ul>\n<li>Two separate reset types:\n<ul>\n<li>The APB1 interface is reset by system reset.<\/li>\n<li>The RTC core is reset only by a Backup domain reset.<\/li>\n<\/ul>\n<\/li>\n<li>Three dedicated maskable interrupt lines:\n<ul>\n<li>Alarm interrupt, for generating a software programmable alarm interrupt.<\/li>\n<li>Seconds interrupt, for generating a periodic interrupt signal with a programmable period length (up to 1 second).<\/li>\n<li>Overflow interrupt, to detect when the internal programmable counter rolls over to zero.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h4>Functional Description<\/h4>\n<p style=\"text-align: justify\">Shown below is the block diagram of the embedded RTC for a typical STM32F10x microcontroller.<\/p>\n<p style=\"text-align: justify\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2016\/03\/Block_Diagram.bmp\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-11196 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2016\/03\/Block_Diagram.bmp\" alt=\"Block_Diagram\" width=\"515\" height=\"431\" \/><\/a><\/p>\n<p style=\"text-align: justify\">The RTC comprises of two major components. The first is the APB1 bus interface. The APB1 bus interface consists of clock dividers and is used to connect with APB1 bus. This interface also consists of a set of 16-bit registers that can be read\/written by APB1 bus operations.<\/p>\n<p style=\"text-align: justify\">The other component is the RTC core. It consists of a group of programmable counters divided into two modules. The first module is the RTC prescaler module. This module generates a programmable time base of one second (<strong><em>TR_CLK<\/em><\/strong>) by using a 20-bit programmable divider. The other module is a 32-bit wide programmable counter that is used to keep counts of seconds. Since it is 32-bit wide, with a <strong><em>TR_CLK<\/em><\/strong> period of one second, it can record up to 4,294,967,296 seconds or roughly a century \u2013 a pretty big time for any machine or a human lifetime.<\/p>\n<p style=\"text-align: justify\">There are registers for alarms which work in a similar manner as compare match interrupt in a timer. Whatever stored in the alarm registers is compared with the values in the counter registers. An alarm event occurs when both register sets have the same value.<\/p>\n<p style=\"text-align: justify\">The RTC core is totally independent of the RTC APB1 interface just like the Independent Watchdog Timer (IWDG). RTC registers, counters, alarms and flags are accessible via APB1 interface but the counter registers are updated by a separate RTC clock. As illustrated in the block diagram, the RTC core keeps functioning even if the APB1 bus is unpowered. This is only possible with power supply backup using a battery or a supercapacitor.<\/p>\n<h4>RTC Registers<\/h4>\n<p style=\"text-align: justify\">The good part of RTC registers is the fact that most of them are 16-bit wide while the rest are even less than a byte wide. There are two RTC control registers which set RTC properties. The rest of the stuffs are counters and clock dividers. Check the RTC register map below:<\/p>\n<p style=\"text-align: justify\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2016\/03\/RTC-Registers.bmp\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-11204 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2016\/03\/RTC-Registers.bmp\" alt=\"RTC Registers\" width=\"542\" height=\"526\" \/><\/a><\/p>\n<p style=\"text-align: justify\">The <strong><em>RTC_CRH<\/em><\/strong> register is the first control register which is responsible for setting up interrupts related to the RTC module. There are three types of interrupts and these are alarm, overflow and second interrupt.<\/p>\n<p style=\"text-align: justify\">The other control register is the <strong><em>RTC_CRL<\/em><\/strong>. This register consists of several flags that trigger on events like counter overflow, alarm, RTC status, etc.<\/p>\n<p style=\"text-align: justify\">Then we see the RTC prescaler load registers as <strong><em>RTC_PRLL<\/em><\/strong> and <strong><em>RTC_PRLH<\/em><\/strong>. Together they are 20-bit wide. These two registers are used to divide the RTC clock source frequency. These registers are write protected and special steps are needed to disable this protection. In my example I used an external 32.768 kHz crystal oscillator and so I loaded 32,767 in these registers to get one second. Thus the formula for getting TR clock (<strong><em>TR_CLK<\/em><\/strong>) frequency can be realized as:<\/p>\n<p style=\"text-align: justify\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2016\/03\/Formula.bmp\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-11206 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2016\/03\/Formula.bmp\" alt=\"Formula\" width=\"183\" height=\"78\" \/><\/a>Next are the RTC divider registers \u2013 <strong><em>RTC_DIVL<\/em><\/strong> and <strong><em>RTC_DIVH<\/em><\/strong>. The purpose of these registers is to obtain a higher resolution clock than the second count, e.g. 100ms. These are not usually used.<\/p>\n<p>The RTC counter registers \u2013 <strong><em>RTC_CNTL <\/em><\/strong>and<strong><em> RTC_CNTH<\/em><\/strong> are the most important registers as they keep the count of the seconds or in other words time. These registers are each 16-bit wide. Once set these registers return current time. Writing these registers is only possible by entering configuration mode.<\/p>\n<p>Finally there are two 16-bit registers dedicated for alarm. <strong><em>RTC_ALRL<\/em><\/strong> and <strong><em>RTC_ALRH<\/em><\/strong> hold alarm time data. This set of registers is just like a typical data registers or RAM location. When an alarm is set the alarm register values are compared with RTC counter register values. An alarm is triggered when the values in these registers match. Again modification to these registers is only possible in configuration mode.<br \/>\nApart from the registers within the RTC block, we also need to deal with the registers of the backup block. The backup domain of a STM32 MCU is somewhat like an EEPROM memory but it is not essentially a true EEPROM memory as it needs battery backup on <strong><em>VBAT<\/em><\/strong> pin to hold data. The backup domain consists a total of 42 data registers, each 16-bit wide. These are usually used to retain user data when a STM32 micro\u2019s main core is powered down or in standby mode. Thus backup data registers can be realized as battery-backed RAM storages.<\/p>\n<p><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2016\/03\/Hardware-Setup.bmp\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-11198 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2016\/03\/Hardware-Setup-580x482.bmp\" alt=\"Hardware Setup\" width=\"580\" height=\"482\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2016\/03\/Hardware-Setup-580x482.bmp 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2016\/03\/Hardware-Setup.bmp 617w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><br \/>\n<\/a><\/p>\n<p style=\"text-align: justify\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2016\/03\/Backup-Registers.bmp\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-11195 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2016\/03\/Backup-Registers-580x204.bmp\" alt=\"Backup Registers\" width=\"580\" height=\"204\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2016\/03\/Backup-Registers-580x204.bmp 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2016\/03\/Backup-Registers.bmp 667w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p style=\"text-align: justify\">Apart from these backup domain registers we will be needing some other registers for additional functionalities of the backup and the RTC block. Those registers won\u2019t be needing for now and won\u2019t be discussed here. We\u2019ll be needing the <strong><em>Power Control (PWR) <\/em><\/strong>registers for disabling backup domain write protect scheme. Power control registers will be dealt separately in details in another post.<\/p>\n<p style=\"text-align: justify\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2016\/03\/Power-Control-Registers.bmp\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-11200 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2016\/03\/Power-Control-Registers-580x209.bmp\" alt=\"Power Control Registers\" width=\"580\" height=\"209\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2016\/03\/Power-Control-Registers-580x209.bmp 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2016\/03\/Power-Control-Registers.bmp 720w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p style=\"text-align: justify\">Just as we configure the main HSE\/HSI\/ PLL clock, we will be configuring the LSE\/LSI clock. We will be needing to configure some registers of the <strong><em>Reset and Clock Control (RCC)<\/em><\/strong> block for this purpose. <strong><em>RCC_BDCR<\/em><\/strong> and <strong><em>RCC_CSR<\/em><\/strong> registers will be needed to select RTC clock source and enable low speed (LSI and LSE) clock sources.<\/p>\n<p style=\"text-align: justify\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2016\/03\/RCC-Registers.bmp\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-11201 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2016\/03\/RCC-Registers-580x156.bmp\" alt=\"RCC Registers\" width=\"580\" height=\"156\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2016\/03\/RCC-Registers-580x156.bmp 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2016\/03\/RCC-Registers.bmp 721w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p>In my version of SPL, I took care of all of these stuffs. We just have to apply them.<\/p>\n<h4>Procedure to Configure the RTC Block<\/h4>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li style=\"text-align: justify\">Firstly power up the STM32 micro and initialize other required hardware like LCD, keypad and other stuffs.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li style=\"text-align: justify\">We already know that right after reset or power on, the backup domain and the RTC are both disabled. Furthermore the backup registers are kept in a write protected state to avoid any parasitic write. Thus we need to enable power and backup interfaces by setting <strong><em>PWREN<\/em><\/strong> and <strong><em>BKPEN<\/em><\/strong> bits in the reset and clock control APB1 interface enable register (<strong><em>RCC_APB1ENR<\/em><\/strong>).<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li style=\"text-align: justify\">Next we need to disable the backup register write protection using the <strong><em>DBP<\/em><\/strong> bit of <strong><em>PWR_CR<\/em><\/strong> When we configure the RTC for the first time, we must reset backup registers and also important RTC registers like the RTC counter register to avoid any unwanted parasitic values<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li style=\"text-align: justify\">The next thing we need to do is to select the clock source that will be responsible for keeping time. We will enable it and we should give it some time to stabilize. Of the three possible clock sources I preferred the external 32.768 kHz crystal oscillator clock (LSE) because it is the usual procedure. Using LSE clock requires that we use a high quality crystal for accurate timing.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li style=\"text-align: justify\">After every major write operation on RTC registers we must poll if the last write operation is completed or terminated. This is done by polling <strong><em>RTOFF<\/em><\/strong> bit in <strong><em>RTC_CRL<\/em><\/strong> This is very important.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li style=\"text-align: justify\">Before configuring the RTC, we need to enter configuration mode by setting <strong><em>CNF<\/em><\/strong> flag in <strong><em>RTC_CRL <\/em><\/strong> After configuration we need to clear this flag to avoid further changes.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li style=\"text-align: justify\">One major configuration is setting the values of <strong><em>RTC_PRL<\/em><\/strong> registers because on their values it depends how fast or slow the RTC clock runs. Since I used the 32.768 kHz LSE clock PRL registers are loaded with 32767 to get one second interval interrupt. Why it is this value has already been explained. We may further calibrate this clock but usually it is not required. If it is required we can further use the RTC divider registers to acquire a clock of more resolution.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li style=\"text-align: justify\">I have always preferred interrupt methods over polling methods for several reasons and advantages, and so here to get RTC clock ticks, I used RTC second interrupt. The RTC interrupt for STM32F10x micros has one interrupt vector address. After an interrupt event we will just check the interrupt flags and find out which event invoked the interrupt and then clear it.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<ul>\n<li style=\"text-align: justify\">To make sure that the RTC is configured only once during the first initialization and not repeatedly reconfigured after every reset or power down event, we will be storing an arbitrary value of our choice in a backup data register. I used 0x9999. We will put this value once the RTC has been completely configured and apply write protection. Since backup data registers mimic are battery-backed data storages, unless the backup battery is removed the RTC initialization and working are retained. With this condition, if a reset or power down event occurs the program restarts from the very beginning and check the backup register value. If the value is not what has been set after initialization, the RTC is reinitialized or otherwise the RTC initialization is skipped and only its interrupts are enabled.<\/li>\n<\/ul>\n<h4>Hardware setup<\/h4>\n<p style=\"text-align: justify\">The hardware setup for this example is very simple. For this demo I used a STM32F103C8T6 micro, a 2&#215;16 alphanumerical LCD connected to GPIOB port pins and four push buttons connected to GPIOA port pins. The buttons are used for setting time. Since I used LSE clock, a 32.768 kHz clock crystal is connected to PC14 and PC15 pins. I also used an 8MHz external crystal for RCC. Using PLL, the clock speed is multiplied to generate 72 MHz system clock. A 3.6V, 250mAH backup lithium ion battery is connected to the VBAT pin. This keeps the backup domain and the RTC core powered.<\/p>\n<p style=\"text-align: justify\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2016\/03\/Hardware-Setup.bmp\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-11198 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2016\/03\/Hardware-Setup-580x482.bmp\" alt=\"Hardware Setup\" width=\"580\" height=\"482\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2016\/03\/Hardware-Setup-580x482.bmp 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2016\/03\/Hardware-Setup.bmp 617w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p style=\"text-align: justify\">The RCC\u2019s internal setup is as follows:<\/p>\n<p style=\"text-align: justify\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2016\/03\/RCC-Setup.bmp\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-11202 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2016\/03\/RCC-Setup-580x273.bmp\" alt=\"RCC Setup\" width=\"580\" height=\"273\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2016\/03\/RCC-Setup-580x273.bmp 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2016\/03\/RCC-Setup-1024x482.bmp 1024w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2016\/03\/RCC-Setup.bmp 1115w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p style=\"text-align: justify\">Except the RTC clock source selection, the rest of the RCC settings are done with MikroC compiler\u2019s clock configuration tool. One caution before coding is that the RTC clock should be at least 4 times slower than PCLK1.<\/p>\n<p style=\"text-align: justify\">After going through the basics till now, we can understand the necessity for a power supply backup. This backup can be achieved in various ways. Two common backup sources are:<\/p>\n<ul style=\"text-align: justify\">\n<li>Battery \u2013 small NiMH, NiCd, Li ion or Lipo cells.<\/li>\n<li>Supercapacitor \u2013 0.22F to 1F.<\/li>\n<\/ul>\n<p style=\"text-align: justify\">I used the former method. The latter method is suitable for short power interruption. I tested this form of backup for an hour and it worked perfectly. The former works even better. Since the RTC and the backup module consumes very low power, the backup power source slowly discharges. Supercaps will discharge much faster with rapid fall of voltage level than batteries and so they are not intended as long-time backup. However supercaps have long life and need lesser replacements than batteries.<\/p>\n<p style=\"text-align: justify\">ST recommends that <strong><em>VBAT<\/em><\/strong> pin should either be tied to a backup source or to VDD. <strong><em>VBAT<\/em><\/strong> pin however doesn\u2019t charge the backup power source. Thus we need a mechanism to charge the source when VDD is available. Here are two techniques:<\/p>\n<p style=\"text-align: justify\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2016\/03\/Backup-Schemes.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-11205 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2016\/03\/Backup-Schemes.png\" alt=\"Backup Schemes\" width=\"562\" height=\"416\" \/><br \/>\n<\/a><\/p>\n<p style=\"text-align: justify\">In both methods, diode D1 is a low-drop diode, preferable a switching diode like the 1N5819 Schottky diode. This diode charges the backup source with VDD source as well as power the VBAT pin with VDD when available. The allowed VBAT voltage range is 1.8V \u2013 3.6V. With this diode in place, the voltage on VBAT pin never exceeds the maximum allowed value. VBAT will typically see about 3Vs. Capacitor C1 stabilizes the backup source and reduces tiny voltage ripples if any.<\/p>\n<p style=\"text-align: justify\">When we use supercaps instead of batteries, we need to be careful because a fully discharged supercap behaves like a temporary short circuit. When connected to a power source, it will draw high currents to rapidly charge itself, creating a temporary power surge as well as voltage dip. If unchecked this power surge may kill the onboard regulator that powers the MCU. Thus to prevent this from happening resistor R1 is used. This resistor slowly charges the supercap. With this arrangement it takes about a minute to charge the supercap. Any power interruption within this time will cause loss of back register data as well as affect functioning of the RTC.<\/p>\n<h4>Coding the RTC<\/h4>\n<p>Coding the STM32 embedded RTC is not very easy. A variety of methods can be applied. The code I wrote is for a 24-hour clock with a calendar starting from epoch to the end of the year 2099. My code for the RTC can be realized as three major portions:<\/p>\n<h6>Configuration<\/h6>\n<p>The RTC is configured as per procedure stated in the last section. The <strong><em>RTC_init<\/em><\/strong> function does the RTC configuration part. If the configuration is successful 0 returned otherwise 1 is returned to indicate that the LSE is not working properly. If LSE clock fails to stabilize within 250ms, it is considered that the LSE clock is having some problem and further coding is skipped. The RTC counter is not loaded during the initial configuration session but after that with <strong><em>set_RTC<\/em><\/strong> function.<\/p>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>unsigned char RTC_init()<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>{<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 unsigned char timeout = 0;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 if(BKP_DR1 != rtc_access_code)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 enable_power_control_module(true);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 enable_backup_module(true);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 disable_backup_domain_write_protection(true);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 set_backup_domain_software_reset(true);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 set_backup_domain_software_reset(false);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0bypass_LSE_with_external_clock(false);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 enable_LSE(true);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while((LSE_ready() == false) &amp;&amp; (timeout &lt; 250))<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 timeout++;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_ms(10);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 };<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(timeout &gt; 250)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return 1;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 select_RTC_clock_source(LSE_clock);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 enable_RTC_clock(true);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while(get_RTC_operation_state() == false);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while(get_RTC_register_sync_state() == false);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 enable_RTC_second_interrupt(true);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while(get_RTC_operation_state() == false);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 set_RTC_configuration_flag(true);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 set_RTC_prescalar(32767);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 set_RTC_configuration_flag(false);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while(get_RTC_operation_state() == false);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BKP_DR1 = rtc_access_code;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0disable_backup_domain_write_protection(false);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 set_RTC(cal_year, cal_month, cal_date, cal_hour, cal_minute, cal_second);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 else<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while(get_RTC_register_sync_state() == false);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 enable_RTC_second_interrupt(true);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while(get_RTC_operation_state() == false);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 NVIC_IntEnable(IVT_INT_RTC);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 return 0;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>}\n\n\n<\/em><\/span><\/pre>\n<h6>Setting\/Writing the Time Parameters<\/h6>\n<p>After initialization or at any instance we may need to set current time and this is done by using the <strong><em>set_RTC<\/em><\/strong> function. This function has 6 arguments for 6 date-time parameters \u2013 year, month, date, hour, minute and second. In my RTC coding, the calendar time starts from epoch. As per MikroC\u2019s help documentation:<\/p>\n<p><em>\u201cOriginally it was defined as the beginning of 1970 GMT. (January 1, 1970 Julian day) GMT, Greenwich Mean Time, is a traditional term for the time zone in England.\u201d<\/em><\/p>\n<p>The calendar becomes invalid after the year 2099 \u2013 roughly about a century from time of writing this article. Since the RTC counts seconds and not actual date-time parameters individually, every time parameter is calculated as second equivalents. For instance 3,600 seconds equal one hour and 86,400 seconds is equal to a complete 24-hour day. During calculations we need to take leap years into account or otherwise the time calculations will be imperfect after some years.<\/p>\n<p>After having found the present second count, the count value is loaded in the RTC counter registers. We need to enter in configuration mode for setting this count value and we need to exit this mode at the end of setting it. From this time forth, the RTC starts counting time. Whatever it then returns is the current time.<\/p>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>void set_RTC(unsigned int year, unsigned char month, unsigned char date, unsigned char hour, unsigned char minute, unsigned char second)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>{<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 unsigned int i = 0;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 unsigned long counts = 0;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 if(year &gt; 2099)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 year = 2099;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 if(year &lt; 1970)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 year = 1970;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 for(i = 1970; i &lt; year; i++)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(check_for_leap_year(i) == 1)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 counts += 31622400;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 counts += 31536000;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 month -= 1;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 for(i = 0; i &lt; month; i++)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 counts += (((unsigned long)month_table[i]) * 86400);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 if(check_for_leap_year(cal_year) == 1)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 counts += 86400;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 counts += ((unsigned long)(date - 1) * 86400);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 counts += ((unsigned long)hour * 3600);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 counts += ((unsigned long)minute * 60);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 counts += second;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 enable_power_control_module(true);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 enable_backup_module(true);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 disable_backup_domain_write_protection(true);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 set_RTC_configuration_flag(true);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 set_RTC_counter(counts);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 set_RTC_configuration_flag(false);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 while(get_RTC_operation_state() == false);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 disable_backup_domain_write_protection(false);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>} \n\n\n<\/em><\/span><\/pre>\n<h6>Reading the Time Parameters<\/h6>\n<p>Reading time is just the opposite of setting it. The RTC counter registers are read and the current count is stored in a variable. From this variable, the code first find the number of days that has passed since epoch. Based on this info, the code findd current year and then current month, taking leap years into account in both steps. Finally we get date and time parameters. Reading time doesn\u2019t need any special privilege as like in writing time parameters.<\/p>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>void get_RTC()<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>{<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 unsigned int temp1 = 0;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 static unsigned int day_count;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 unsigned long temp = 0;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 unsigned long counts = 0;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 counts = RTC_CNTH;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 counts &lt;&lt;= 16;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 counts += RTC_CNTL;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 temp = (counts \/ 86400);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 if(day_count != temp)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 day_count = temp;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 temp1 = 1970;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while(temp &gt;= 365)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(check_for_leap_year(temp1) == 1)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(temp &gt;= 366)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 temp -= 366;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0}<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 temp -= 365;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 temp1++;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 };<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 cal_year = temp1;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 temp1 = 0;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while(temp &gt;= 28)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if((temp1 == 1) &amp;&amp; (check_for_leap_year(cal_year) == 1))<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(temp &gt;= 29)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0temp -= 29;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(temp &gt;= month_table[temp1])<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 temp -= ((unsigned long)month_table[temp1]);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 temp1++;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 };<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 cal_month = (temp1 + 1);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 cal_date = (temp + 1);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 temp = (counts % 86400);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 cal_hour = (temp \/ 3600);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 cal_minute = ((temp % 3600) \/ 60);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 cal_second = ((temp % 3600) % 60);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>} \u00a0\n\n\n\n<\/em><\/span><\/pre>\n<p>Lastly an interrupt is used to update time parameters as well as clear interrupt flags.<\/p>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>void RTC_ISR() <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>iv IVT_INT_RTC<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>ics ICS_AUTO <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>{<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 if(get_RTC_second_flag_state() == true)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 update_time = 1;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 clear_RTC_second_flag();<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 clear_RTC_overflow_flag();<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 while(get_RTC_operation_state() == false);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>}\n\n<\/em><\/span>\n<\/em><\/span><\/pre>\n<p style=\"text-align: justify\">In complete code, there are functions for displaying time parameters in the LCD easily and efficiently. The four buttons connected to the GPIOA port pins are for entering settings mode, increasing a parameter, decreasing a parameter and finally to accept the new value of the parameter that has been selected for alternation.\u00a0 Here\u2019s the complete code:<\/p>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>#include \"RTC.h\"<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>#include \"GPIO.h\"<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>#include \"BACKUP.h\"<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>#define rtc_access_code\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x9999<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>#define set_button_pin\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>#define inc_button_pin\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>#define dec_button_pin\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 2<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>#define esc_button_pin\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 3<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>sbit LCD_RS at GPIOB_ODR.B10;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>sbit LCD_EN at GPIOB_ODR.B11;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>sbit LCD_D4 at GPIOB_ODR.B12;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>sbit LCD_D5 at GPIOB_ODR.B13;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>sbit LCD_D6 at GPIOB_ODR.B14;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>sbit LCD_D7 at GPIOB_ODR.B15;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>const unsigned char month_table[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>unsigned char cal_hour = 0;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>unsigned char cal_date = 1;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>unsigned char cal_month = 1;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>unsigned char cal_minute = 0;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>unsigned char cal_second = 0;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>unsigned int cal_year = 1970;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>bit update_time;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>void setup_mcu();<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>void setup_GPIOs();<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>unsigned char RTC_init();<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>void get_RTC();<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>void set_RTC(unsigned int year, unsigned char month, unsigned char date, unsigned char hour, unsigned char minute, unsigned char second);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>unsigned char check_for_leap_year(unsigned int year);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>void show_value(unsigned char x_pos, unsigned char y_pos, unsigned char value);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>void show_year(unsigned char x_pos, unsigned char y_pos, unsigned int value);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>unsigned int change_value(unsigned char x_pos, unsigned char y_pos, signed int value, signed int value_min, signed int value_max, unsigned char value_type);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>void settings();<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>void RTC_ISR() <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>iv IVT_INT_RTC<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>ics ICS_AUTO <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>{<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 if(get_RTC_second_flag_state() == true)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 update_time = 1;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 clear_RTC_second_flag();<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 clear_RTC_overflow_flag();<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 while(get_RTC_operation_state() == false);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>}<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>void main()<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>{<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 setup_mcu();<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 lcd_out(1, 7, \":\u00a0 :\");<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 lcd_out(2, 6, \"\/\u00a0 \/\");<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 while(1)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 settings();<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(update_time)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 get_RTC();<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 show_value(5, 1, cal_hour);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0show_value(8, 1, cal_minute);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 show_value(11, 1, cal_second);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 show_value(4, 2, cal_date);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 show_value(7, 2, cal_month);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 show_year(10, 2, cal_year);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 update_time = 0;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 };<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>}<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>void setup_mcu()<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>{<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 unsigned char i = 0;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 setup_GPIOs();<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 Lcd_Init();<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 Lcd_Cmd(_LCD_CLEAR);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 Lcd_Cmd(_LCD_CURSOR_OFF);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 Lcd_Out(1, 4, \"STM32 RTC.\");<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 i = RTC_init();<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 switch(i)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 case 1:<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 lcd_out(2, 1, \"RTC init. failed\");<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while(1);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 default:<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 lcd_out(2, 1, \"RTC init success\");<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_ms(2000);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 Lcd_Cmd(_LCD_CLEAR);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>}<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>void setup_GPIOs()<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>{<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 enable_GPIOA(true);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 setup_GPIOA(set_button_pin, digital_input);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 enable_pull_up_GPIOA(set_button_pin);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 setup_GPIOA(inc_button_pin, digital_input);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 enable_pull_up_GPIOA(inc_button_pin);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 setup_GPIOA(dec_button_pin, digital_input);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 enable_pull_up_GPIOA(dec_button_pin);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 setup_GPIOA(esc_button_pin, digital_input);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 enable_pull_up_GPIOA(esc_button_pin);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 enable_GPIOB(true);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 setup_GPIOB(10, (GPIO_PP_output | output_mode_medium_speed));<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 setup_GPIOB(11, (GPIO_PP_output | output_mode_medium_speed));<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 setup_GPIOB(12, (GPIO_PP_output | output_mode_medium_speed));<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 setup_GPIOB(13, (GPIO_PP_output | output_mode_medium_speed));<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 setup_GPIOB(14, (GPIO_PP_output | output_mode_medium_speed));<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 setup_GPIOB(15, (GPIO_PP_output | output_mode_medium_speed));<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>}<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>unsigned char RTC_init()<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>{<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 unsigned char timeout = 0;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 if(BKP_DR1 != rtc_access_code)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 enable_power_control_module(true);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 enable_backup_module(true);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 disable_backup_domain_write_protection(true);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 set_backup_domain_software_reset(true);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 set_backup_domain_software_reset(false);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 bypass_LSE_with_external_clock(false);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 enable_LSE(true);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while((LSE_ready() == false) &amp;&amp; (timeout &lt; 250))<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 timeout++;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_ms(10);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 };<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(timeout &gt; 250)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0{<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return 1;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 select_RTC_clock_source(LSE_clock);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 enable_RTC_clock(true);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while(get_RTC_operation_state() == false);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while(get_RTC_register_sync_state() == false);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 enable_RTC_second_interrupt(true);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while(get_RTC_operation_state() == false);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 set_RTC_configuration_flag(true);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 set_RTC_prescalar(32767);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 set_RTC_configuration_flag(false);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while(get_RTC_operation_state() == false);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BKP_DR1 = rtc_access_code;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 disable_backup_domain_write_protection(false);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 set_RTC(cal_year, cal_month, cal_date, cal_hour, cal_minute, cal_second);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 else<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while(get_RTC_register_sync_state() == false);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 enable_RTC_second_interrupt(true);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while(get_RTC_operation_state() == false);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 NVIC_IntEnable(IVT_INT_RTC);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 return 0;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>}<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>void get_RTC()<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>{<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 unsigned int temp1 = 0;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 static unsigned int day_count;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 unsigned long temp = 0;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 unsigned long counts = 0;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 counts = RTC_CNTH;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 counts &lt;&lt;= 16;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 counts += RTC_CNTL;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 temp = (counts \/ 86400);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 if(day_count != temp)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 day_count = temp;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 temp1 = 1970;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while(temp &gt;= 365)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(check_for_leap_year(temp1) == 1)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(temp &gt;= 366)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 temp -= 366;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 temp -= 365;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 temp1++;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 };<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 cal_year = temp1;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0temp1 = 0;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while(temp &gt;= 28)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if((temp1 == 1) &amp;&amp; (check_for_leap_year(cal_year) == 1))<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(temp &gt;= 29)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 temp -= 29;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(temp &gt;= month_table[temp1])<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 temp -= ((unsigned long)month_table[temp1]);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 temp1++;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 };<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 cal_month = (temp1 + 1);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 cal_date = (temp + 1);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 temp = (counts % 86400);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 cal_hour = (temp \/ 3600);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 cal_minute = ((temp % 3600) \/ 60);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 cal_second = ((temp % 3600) % 60);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>}<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>void set_RTC(unsigned int year, unsigned char month, unsigned char date, unsigned char hour, unsigned char minute, unsigned char second)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>{<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 unsigned int i = 0;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 unsigned long counts = 0;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 if(year &gt; 2099)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 year = 2099;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 if(year &lt; 1970)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0year = 1970;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 for(i = 1970; i &lt; year; i++)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(check_for_leap_year(i) == 1)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 counts += 31622400;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 counts += 31536000;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 month -= 1;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 for(i = 0; i &lt; month; i++)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 counts += (((unsigned long)month_table[i]) * 86400);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 if(check_for_leap_year(cal_year) == 1)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 counts += 86400;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 counts += ((unsigned long)(date - 1) * 86400);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 counts += ((unsigned long)hour * 3600);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 counts += ((unsigned long)minute * 60);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 counts += second;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 enable_power_control_module(true);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 enable_backup_module(true);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 disable_backup_domain_write_protection(true);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 set_RTC_configuration_flag(true);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 set_RTC_counter(counts);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 set_RTC_configuration_flag(false);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 while(get_RTC_operation_state() == false);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 disable_backup_domain_write_protection(false);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>}<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>unsigned char check_for_leap_year(unsigned int year)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>{<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 if(year % 4 == 0)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(year % 100 == 0)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(year % 400 == 0)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return 1;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return 0;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return 1;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 else <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return 0;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>}<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>void show_value(unsigned char x_pos, unsigned char y_pos, unsigned char value)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>{<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 unsigned char ch = 0;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 ch = (value \/ 10);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 lcd_chr(y_pos, x_pos, (ch + 0x30));<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 ch = (value % 10);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 lcd_chr(y_pos, (x_pos + 1), (ch + 0x30));<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>}<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>void show_year(unsigned char x_pos, unsigned char y_pos, unsigned int value)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>{<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 unsigned char temp = 0;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0 \u00a0\u00a0\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 temp = (value \/ 100);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 show_value(x_pos, y_pos, temp);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 temp = (value % 100);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0 show_value((x_pos + 2), y_pos, temp);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>}<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>unsigned int change_value(unsigned char x_pos, unsigned char y_pos, signed int value, signed int value_min, signed int value_max, unsigned char value_type)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>{<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 while(1)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 switch(value_type)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 case 1:<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 lcd_out(y_pos, x_pos, \"\u00a0\u00a0\u00a0 \");<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 default:<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 lcd_out(y_pos, x_pos, \"\u00a0 \");<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_ms(60);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(get_GPIOA_pin_state(inc_button_pin) == low)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 value++;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(value &gt; value_max)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 value = value_min;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(get_GPIOA_pin_state(dec_button_pin) == low)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 value--;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(value &lt; value_min)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 value = value_max;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 switch(value_type)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 case 1:<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 show_year(x_pos, y_pos, ((unsigned int)value));<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 default:<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 show_value(x_pos, y_pos, ((unsigned char)value));<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_ms(90);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(get_GPIOA_pin_state(esc_button_pin) == low)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while(get_GPIOA_pin_state(esc_button_pin) == low);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_ms(200);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return value;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 };<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>}<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>void settings()<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>{<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 if(get_GPIOA_pin_state(set_button_pin) == low)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while(get_GPIOA_pin_state(set_button_pin) == low);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 NVIC_IntDisable(IVT_INT_RTC);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 update_time = 0;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 cal_hour = change_value(5, 1, cal_hour, 0, 23, 0);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 cal_minute = change_value(8, 1, cal_minute, 0, 59, 0);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 cal_second = change_value(11, 1, cal_second, 0, 59, 0);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 cal_date = change_value(4, 2, cal_date, 1, 31, 0);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 cal_month = change_value(7, 2, cal_month, 1, 12, 0);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 cal_year = change_value(10, 2, cal_year, 1970, 2099, 1);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 set_RTC(cal_year, cal_month, cal_date, cal_hour, cal_minute, cal_second);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 NVIC_IntEnable(IVT_INT_RTC);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><em>}<\/em><\/span><\/pre>\n<p>Checkout the photos and videos of the embedded RTC. The firsts are with battery backup and the latter are with supercap backup.<\/p>\n<p><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2016\/03\/IMG20160318122042.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-11209 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2016\/03\/IMG20160318122042-580x435.jpg\" alt=\"IMG20160318122042\" width=\"580\" height=\"435\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2016\/03\/IMG20160318122042-580x435.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2016\/03\/IMG20160318122042.jpg 590w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a> <a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2016\/03\/IMG20160318123819.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-11210 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2016\/03\/IMG20160318123819-580x401.jpg\" alt=\"IMG20160318123819\" width=\"580\" height=\"401\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2016\/03\/IMG20160318123819-580x401.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2016\/03\/IMG20160318123819.jpg 590w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p>Project video link: <a href=\"https:\/\/www.youtube.com\/watch?v=b4cop0915j8\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/www.youtube.com\/watch?v=b4cop0915j8<\/a>.<\/p>\n<p><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2016\/03\/image2.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-11208 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2016\/03\/image2.jpg\" alt=\"image2\" width=\"458\" height=\"307\" \/><\/a> <a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2016\/03\/image1.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-11207 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2016\/03\/image1.jpg\" alt=\"image1\" width=\"456\" height=\"447\" \/><\/a><\/p>\n<p>Video link: <a href=\"https:\/\/www.youtube.com\/watch?v=sdjNY3q1khw\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/www.youtube.com\/watch?v=sdjNY3q1khw<\/a>.<\/p>\n<h4>Epilogue<\/h4>\n<p>I am very impressed with accuracy of the embedded RTC. I kept it running for several days during which deliberate power interruptions were carried out several times. Despite these abuses, the RTC kept functioning as it should. I found it as dependable as other good RTC chips. The good part is the fact that I won\u2019t be needing any addition RTC chips any more for those projects that need time keeping.<\/p>\n<p><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2016\/03\/Hexiwear.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-11199 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2016\/03\/Hexiwear.png\" alt=\"Hexiwear\" width=\"500\" height=\"550\" \/><\/a><\/p>\n<p style=\"text-align: justify\">At the time of writing this article MikroElektronika launched a new product called Hexiwear. It is a hexagonally-shaped wearable IOT-based smart watch with lot of options for measurements, connectivity and expandability. It is based on an ARM chip from NXP. Because it is based on ARM, it opened a lot of possibilities for developers. If you checkout the dedicated page for Hexiwear &#8211; <a href=\"http:\/\/www.hexiwear.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">http:\/\/www.hexiwear.com\/<\/a>, you will notice that the stuffs onboard this device are mentioned \u00a0on its specs but no RTC chip is mentioned and that\u2019s because the NXP MCU just like the STM32 in this post has an embedded real-time clock unit. This product is enough to show the advantage of having an embedded RTC. In my professional career I have seen other ARM based products especially from STMicroelectronics that did not use any RTC chip rather than the embedded RTC.<\/p>\n<p style=\"text-align: justify\"><strong>References:<\/strong><\/p>\n<ul>\n<li>STM32F10x Reference Manual<br \/>\n<a href=\"http:\/\/www.st.com\/web\/en\/resource\/technical\/document\/reference_manual\/CD00171190.pdf\" target=\"_blank\" rel=\"noopener noreferrer\">http:\/\/www.st.com\/web\/en\/resource\/technical\/document\/reference_manual\/CD00171190.pdf<\/a><\/li>\n<li>Clock or calendar implementation on the STM32F10xxx microcontroller RTC<br \/>\n<a href=\"http:\/\/www.st.com\/web\/en\/resource\/technical\/document\/application_note\/CD00207941.pdf\" target=\"_blank\" rel=\"noopener noreferrer\">http:\/\/www.st.com\/web\/en\/resource\/technical\/document\/application_note\/CD00207941.pdf<\/a><\/li>\n<li>Hexiwear Page<br \/>\n<a href=\"http:\/\/www.hexiwear.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">http:\/\/www.hexiwear.com\/<\/a><\/li>\n<\/ul>\n<p>Happy coding.<\/p>\n<p>Repository: <a href=\"https:\/\/github.com\/sshahryiar\/STM32-Tutorials\">https:\/\/github.com\/sshahryiar\/STM32-Tutorials<\/a><\/p>\n<p><i>Author: Shawon M. Shahryiar<br \/>\n<\/i><\/p>\n<p><a href=\"https:\/\/www.youtube.com\/c\/sshahryiar\">https:\/\/www.youtube.com\/c\/sshahryiar<\/a><\/p>\n<p><a href=\"https:\/\/github.com\/sshahryiar\">https:\/\/github.com\/sshahryiar<\/a><\/p>\n<p><a href=\"mailto:sshahryiar@gmail.com\"><i>sshahryiar@gmail.com<\/i><\/a><i><\/i><i>\u00a0 \u00a0 \u00a0 \u00a0 <\/i><\/p>\n<p><em>18.03.2016<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>A Real Time Clock (RTC) is a timing element dedicated for keeping time. In many applications, especially where precise timed-operations are needed to be performed, a RTC is a very useful tool. Examples of such applications apart from clocks and watches include washing machines, medicine dispensers, data loggers, etc. Basically a RTC is a timer-counter but unlike other timers of a MCU it is much more accurate. Previous to this post, we explored STM32 timers but those were useful for applications like PWM generation, time-bases and other waveform-related tasks. Those were not suitable for precise time-keeping. In most 8-bit MCUs<\/p>\n","protected":false},"author":5,"featured_media":11194,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[733,1474,1466],"tags":[1391,108,1390,1051,27,1319,1392,1126,1125,850],"class_list":["post-11193","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-stm32","category-stm32-tutorials","category-tutorials","tag-calendar","tag-digital-clock","tag-mikroc-for-arm","tag-real-time-clock","tag-rtc","tag-stm32","tag-stm32s-internal-rtc","tag-stm32f103c8t6","tag-stm32f10x-series","tag-stmicroelectronics"],"_links":{"self":[{"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/posts\/11193","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/comments?post=11193"}],"version-history":[{"count":11,"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/posts\/11193\/revisions"}],"predecessor-version":[{"id":15168,"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/posts\/11193\/revisions\/15168"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/media\/11194"}],"wp:attachment":[{"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/media?parent=11193"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/categories?post=11193"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/tags?post=11193"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}