Marco Mayer / Mbed OS Queue
Committer:
demayer
Date:
Sat Mar 28 15:28:19 2020 +0000
Revision:
0:6bf0743ece18
IMU Thread with an event-queue running parallel to handle tasks like a 5 times blinking LED. Button with interrupt detected.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
demayer 0:6bf0743ece18 1 #include "mbed.h"
demayer 0:6bf0743ece18 2
demayer 0:6bf0743ece18 3 DigitalOut status_led(LED_BLUE);
demayer 0:6bf0743ece18 4 DigitalOut error_led(LED_RED);
demayer 0:6bf0743ece18 5
demayer 0:6bf0743ece18 6 extern "C" void RTC_IRQHandler(void) {
demayer 0:6bf0743ece18 7 error_led = 0;
demayer 0:6bf0743ece18 8 }
demayer 0:6bf0743ece18 9
demayer 0:6bf0743ece18 10 extern "C" void RTC_Seconds_IRQHandler(void) {
demayer 0:6bf0743ece18 11 error_led = 0;
demayer 0:6bf0743ece18 12 }
demayer 0:6bf0743ece18 13
demayer 0:6bf0743ece18 14 extern "C" void HardFault_Handler(void) {
demayer 0:6bf0743ece18 15 error_led = 0;
demayer 0:6bf0743ece18 16 }
demayer 0:6bf0743ece18 17
demayer 0:6bf0743ece18 18 extern "C" void NMI_Handler_Handler(void) {
demayer 0:6bf0743ece18 19 error_led = 0;
demayer 0:6bf0743ece18 20 }
demayer 0:6bf0743ece18 21
demayer 0:6bf0743ece18 22 void rtc_init(void) {
demayer 0:6bf0743ece18 23 // enable the clock to SRTC module register space
demayer 0:6bf0743ece18 24 SIM->SCGC6 |= SIM_SCGC6_RTC_MASK;
demayer 0:6bf0743ece18 25 SIM->SOPT1 = (SIM->SOPT1 & ~SIM_SOPT1_OSC32KSEL_MASK) | SIM_SOPT1_OSC32KSEL(0);
demayer 0:6bf0743ece18 26
demayer 0:6bf0743ece18 27 // disable interrupts
demayer 0:6bf0743ece18 28 NVIC_DisableIRQ(RTC_Seconds_IRQn);
demayer 0:6bf0743ece18 29 NVIC_DisableIRQ(RTC_IRQn);
demayer 0:6bf0743ece18 30
demayer 0:6bf0743ece18 31 // Reset
demayer 0:6bf0743ece18 32 RTC->CR = RTC_CR_SWR_MASK;
demayer 0:6bf0743ece18 33 RTC->CR &= ~RTC_CR_SWR_MASK;
demayer 0:6bf0743ece18 34
demayer 0:6bf0743ece18 35 // Allow write
demayer 0:6bf0743ece18 36 RTC->CR = RTC_CR_UM_MASK | RTC_CR_SUP_MASK;
demayer 0:6bf0743ece18 37
demayer 0:6bf0743ece18 38 NVIC_EnableIRQ(RTC_Seconds_IRQn);
demayer 0:6bf0743ece18 39 NVIC_EnableIRQ(RTC_Seconds_IRQn);
demayer 0:6bf0743ece18 40
demayer 0:6bf0743ece18 41 printf("LR: 0x%x\n", RTC->LR);
demayer 0:6bf0743ece18 42 printf("CR: 0x%x\n", RTC->CR);
demayer 0:6bf0743ece18 43 wait(1);
demayer 0:6bf0743ece18 44 if (RTC->SR & RTC_SR_TIF_MASK){
demayer 0:6bf0743ece18 45 RTC->TSR = 0;
demayer 0:6bf0743ece18 46 }
demayer 0:6bf0743ece18 47 RTC->TCR = 0;
demayer 0:6bf0743ece18 48
demayer 0:6bf0743ece18 49 // After setting this bit, wait the oscillator startup time before enabling
demayer 0:6bf0743ece18 50 // the time counter to allow the clock time to stabilize
demayer 0:6bf0743ece18 51 RTC->CR |= RTC_CR_OSCE_MASK;
demayer 0:6bf0743ece18 52 for (volatile int i=0; i<0x600000; i++);
demayer 0:6bf0743ece18 53
demayer 0:6bf0743ece18 54 //enable seconds interrupts
demayer 0:6bf0743ece18 55 RTC->IER |= RTC_IER_TSIE_MASK;
demayer 0:6bf0743ece18 56
demayer 0:6bf0743ece18 57 // enable time counter
demayer 0:6bf0743ece18 58 RTC->SR |= RTC_SR_TCE_MASK;
demayer 0:6bf0743ece18 59
demayer 0:6bf0743ece18 60
demayer 0:6bf0743ece18 61 }
demayer 0:6bf0743ece18 62
demayer 0:6bf0743ece18 63 int main() {
demayer 0:6bf0743ece18 64 error_led = 1;
demayer 0:6bf0743ece18 65 rtc_init();
demayer 0:6bf0743ece18 66
demayer 0:6bf0743ece18 67 while (true) {
demayer 0:6bf0743ece18 68 wait(1);
demayer 0:6bf0743ece18 69 status_led = !status_led;
demayer 0:6bf0743ece18 70 printf("%u\n", RTC->TSR);
demayer 0:6bf0743ece18 71 }
demayer 0:6bf0743ece18 72 }