1 /* (CC-BY-NC-SA) ROBIN KRENS - ROBIN @ ROBINKRENS.NL
4 * 2019/8/14 - ROBIN KRENS
8 * Real Time Clock configuration. A Real Time Clock is configured to use
9 * the more accurate external chrystal (LSE) and ticks at exactly
10 * one second. (Can be further calibrated using a tamper pin)
11 * Each clock tick triggers an interrupt and invokes the real time clock
14 * Note: this is not the Cortex M3/M4 SysTick!
22 #include <sys/robsys.h>
25 #include <lib/regfunc.h>
26 #include <lib/tinyprintf.h>
28 #include <drivers/led.h>
29 #include <drivers/tm1637.h>
32 /* This handler is invoked each clock tick. I've included two examples
33 * one is writing the clock count to a 4 grid led display. Another is a simple LED blink */
34 void * rtc_handler() {
36 // Real time clock output on a LED display
37 /* int cntvalue = *RTC_CNTL;
38 if (cntvalue < 9999) {
40 unsigned char dn[10] = {0xFC, 0x60, 0xDA, 0xF2, 0x66, 0xB6, 0xBE, 0xE0, 0xFE, 0xF6};
42 int grid0, grid1, grid2, grid3;
44 grid0 = cntvalue % 10;
45 grid1 = ((cntvalue % 100) - grid0) / 10;
46 grid2 = ((cntvalue % 1000) - grid0 - grid1) / 100;
47 grid3 = ((cntvalue % 10000) - grid0 - grid1 - grid2) / 1000;
49 //printf("%d, %d, %d, %d\n", grid0, grid1, grid2, grid3);
51 char current[4] = { dn[grid3], dn[grid2], dn[grid1], dn[grid0] };
53 for (int i = 0; i < 4; i++) {
54 set_grid(i, current[i], false);
61 uint32_t curr = *RTC_CNTL;
62 int even = *RTC_CNTL % 2;
63 (!even) ? led_off() : led_on();
65 rclrbit(RTC_CRL, 0); /* clear interrupt flag */
68 /* Enable a periodic interrupt. At each clock count a interrupt is triggered
69 * and consequently the handler is invoked. */
70 static void periodic_intr() {
72 while(!rchkbit(RTC_CRL, 5)); // Check last write is terminated
73 rsetbit(RTC_CRL, 4); // start configure
74 rsetbit(RTC_CRH, 0); // enable periodic (second) interrupt
76 while(!rchkbit(RTC_CRL, 5));
77 rwrite(RTC_PRLL, 0x7FFF); // 0x7FFF equals 1 second clock configuration
78 rclrbit(RTC_CRL, 4); // stop configure
79 while(!rchkbit(RTC_CRL, 5)); // Check last write is terminated
80 rsetbit(NVIC_ISER0, 3); // enable in register vector
83 /* Setup the Real time clock to work with the Low speed external
84 * chrystal (32.768 kHz) */
85 static void setup_rtc() {
87 /* Enable PWREN and BKPEN */
88 rsetbit(RCC_APB1ENR, 28);
89 rsetbit(RCC_APB1ENR, 27);
91 /* Enable access to backup registers and RTC */
94 rsetbit(RCC_BDCR, 0); /* LSE enable */
95 while(!rchkbit(RCC_BDCR, 1)); /* wait for LSE to come up */
97 rsetbitsfrom(RCC_BDCR, 8, 0x1); /* use LSE as RTC source */
98 rsetbit(RCC_BDCR, 15); /* enable RTC */
100 ivt_set_gate(19, rtc_handler, 0); /* setup interrupt handler */
102 //calibrate_rtc(); // uncomment if need, needs TAMPER PIN
104 periodic_intr();// setup periodic interrupt
108 /* Function to calibrate the RTC even more accurate.
109 * Output to a so-called tamper pin. Uncomment if needed */
110 static void calibrate_rtc() {
111 /* rsetbit(BKP_RTCCR, 7); // enable CC0,
112 while(!rchkbit(RTC_CRL, 5)); // Check last write is terminated
114 // Set up and check tamper pin
116 while(!rchkbit(RTC_CRL, 5)); // Check last write is terminated */