This is the code used on my video series "Hybrid Supercapacitor Car Battery" for my own hardware monitoring system. THe videos can be found on madelectronengineering.com
Dependencies: BurstSPI Fonts INA219 mbed LPC1114_WakeInterruptIn
Fork of SharpMemoryLCD by
Device/WakeUp_LPC812.cpp@2:0c49a8f32f6e, 2017-12-26 (annotated)
- Committer:
- madelectroneng
- Date:
- Tue Dec 26 21:30:09 2017 +0000
- Revision:
- 2:0c49a8f32f6e
Inital setup
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
madelectroneng | 2:0c49a8f32f6e | 1 | #ifdef TARGET_LPC812 |
madelectroneng | 2:0c49a8f32f6e | 2 | |
madelectroneng | 2:0c49a8f32f6e | 3 | #include "WakeUp.h" |
madelectroneng | 2:0c49a8f32f6e | 4 | |
madelectroneng | 2:0c49a8f32f6e | 5 | Callback<void()> WakeUp::callback; |
madelectroneng | 2:0c49a8f32f6e | 6 | float WakeUp::cycles_per_ms = 10.0; |
madelectroneng | 2:0c49a8f32f6e | 7 | |
madelectroneng | 2:0c49a8f32f6e | 8 | void WakeUp::set_ms(uint32_t ms) |
madelectroneng | 2:0c49a8f32f6e | 9 | { |
madelectroneng | 2:0c49a8f32f6e | 10 | //Enable clock to register interface: |
madelectroneng | 2:0c49a8f32f6e | 11 | LPC_SYSCON->SYSAHBCLKCTRL |= 1<<9; |
madelectroneng | 2:0c49a8f32f6e | 12 | |
madelectroneng | 2:0c49a8f32f6e | 13 | //Clear the counter: |
madelectroneng | 2:0c49a8f32f6e | 14 | LPC_WKT->CTRL |= 1<<2; |
madelectroneng | 2:0c49a8f32f6e | 15 | if (ms != 0) { |
madelectroneng | 2:0c49a8f32f6e | 16 | //Enable clock to register interface: |
madelectroneng | 2:0c49a8f32f6e | 17 | LPC_SYSCON->SYSAHBCLKCTRL |= 1<<9; |
madelectroneng | 2:0c49a8f32f6e | 18 | |
madelectroneng | 2:0c49a8f32f6e | 19 | //Set 10kHz timer as source, and just to be sure clear status bit |
madelectroneng | 2:0c49a8f32f6e | 20 | LPC_WKT->CTRL = 3; |
madelectroneng | 2:0c49a8f32f6e | 21 | |
madelectroneng | 2:0c49a8f32f6e | 22 | //Enable the 10kHz timer |
madelectroneng | 2:0c49a8f32f6e | 23 | LPC_PMU->DPDCTRL |= (1<<2) | (1<<3); |
madelectroneng | 2:0c49a8f32f6e | 24 | |
madelectroneng | 2:0c49a8f32f6e | 25 | //Set interrupts |
madelectroneng | 2:0c49a8f32f6e | 26 | NVIC_SetVector(WKT_IRQn, (uint32_t)WakeUp::irq_handler); |
madelectroneng | 2:0c49a8f32f6e | 27 | NVIC_EnableIRQ(WKT_IRQn); |
madelectroneng | 2:0c49a8f32f6e | 28 | |
madelectroneng | 2:0c49a8f32f6e | 29 | //Load the timer |
madelectroneng | 2:0c49a8f32f6e | 30 | LPC_WKT->COUNT = (uint32_t)((float)ms * cycles_per_ms); |
madelectroneng | 2:0c49a8f32f6e | 31 | |
madelectroneng | 2:0c49a8f32f6e | 32 | } else { |
madelectroneng | 2:0c49a8f32f6e | 33 | //Disable clock to register interface: |
madelectroneng | 2:0c49a8f32f6e | 34 | LPC_SYSCON->SYSAHBCLKCTRL &= ~(1<<9); |
madelectroneng | 2:0c49a8f32f6e | 35 | |
madelectroneng | 2:0c49a8f32f6e | 36 | //Disable the 10kHz timer |
madelectroneng | 2:0c49a8f32f6e | 37 | LPC_PMU->DPDCTRL &= ~((1<<2) | (1<<3)); |
madelectroneng | 2:0c49a8f32f6e | 38 | } |
madelectroneng | 2:0c49a8f32f6e | 39 | } |
madelectroneng | 2:0c49a8f32f6e | 40 | |
madelectroneng | 2:0c49a8f32f6e | 41 | void WakeUp::irq_handler(void) |
madelectroneng | 2:0c49a8f32f6e | 42 | { |
madelectroneng | 2:0c49a8f32f6e | 43 | //Clear status |
madelectroneng | 2:0c49a8f32f6e | 44 | LPC_WKT->CTRL |= 2; |
madelectroneng | 2:0c49a8f32f6e | 45 | |
madelectroneng | 2:0c49a8f32f6e | 46 | //Disable clock to register interface: |
madelectroneng | 2:0c49a8f32f6e | 47 | LPC_SYSCON->SYSAHBCLKCTRL &= ~(1<<9); |
madelectroneng | 2:0c49a8f32f6e | 48 | |
madelectroneng | 2:0c49a8f32f6e | 49 | //Disable the 10kHz timer |
madelectroneng | 2:0c49a8f32f6e | 50 | LPC_PMU->DPDCTRL &= ~((1<<2) | (1<<3)); |
madelectroneng | 2:0c49a8f32f6e | 51 | |
madelectroneng | 2:0c49a8f32f6e | 52 | callback.call(); |
madelectroneng | 2:0c49a8f32f6e | 53 | } |
madelectroneng | 2:0c49a8f32f6e | 54 | |
madelectroneng | 2:0c49a8f32f6e | 55 | void WakeUp::calibrate(void) |
madelectroneng | 2:0c49a8f32f6e | 56 | { |
madelectroneng | 2:0c49a8f32f6e | 57 | cycles_per_ms = 10.0; |
madelectroneng | 2:0c49a8f32f6e | 58 | set_ms(1100); |
madelectroneng | 2:0c49a8f32f6e | 59 | wait_ms(100); |
madelectroneng | 2:0c49a8f32f6e | 60 | |
madelectroneng | 2:0c49a8f32f6e | 61 | uint32_t prevread = LPC_WKT->COUNT; |
madelectroneng | 2:0c49a8f32f6e | 62 | uint32_t read = LPC_WKT->COUNT; |
madelectroneng | 2:0c49a8f32f6e | 63 | while( read != prevread) { |
madelectroneng | 2:0c49a8f32f6e | 64 | prevread = read; |
madelectroneng | 2:0c49a8f32f6e | 65 | read = LPC_WKT->COUNT; |
madelectroneng | 2:0c49a8f32f6e | 66 | } |
madelectroneng | 2:0c49a8f32f6e | 67 | |
madelectroneng | 2:0c49a8f32f6e | 68 | uint32_t ticks = 11000 - read; |
madelectroneng | 2:0c49a8f32f6e | 69 | |
madelectroneng | 2:0c49a8f32f6e | 70 | cycles_per_ms = ticks / 100.0; |
madelectroneng | 2:0c49a8f32f6e | 71 | set_ms(0); |
madelectroneng | 2:0c49a8f32f6e | 72 | } |
madelectroneng | 2:0c49a8f32f6e | 73 | |
madelectroneng | 2:0c49a8f32f6e | 74 | #endif |