FRDM-K64 USB air mouse demo
Dependencies: FXOS8700Q USBDevice mbed
Fork of FRDM-K64_USB by
USB air mouse demo modified USB Analog Joystick with Low Power Mode Demo
main.cpp@2:cb6377d909e0, 2015-06-23 (annotated)
- Committer:
- julioefajardo
- Date:
- Tue Jun 23 02:53:31 2015 +0000
- Revision:
- 2:cb6377d909e0
- Parent:
- 1:b9ea91c4c533
Joystick USB with Low Power Mode
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
APanecatl | 0:d50fb46005fd | 1 | #include "mbed.h" |
APanecatl | 0:d50fb46005fd | 2 | #include "USBMouse.h" |
julioefajardo | 2:cb6377d909e0 | 3 | #include "FXOS8700Q.h" |
APanecatl | 0:d50fb46005fd | 4 | |
julioefajardo | 1:b9ea91c4c533 | 5 | DigitalIn RightClick(PTC6); |
julioefajardo | 1:b9ea91c4c533 | 6 | DigitalIn LeftClick(PTA4); |
julioefajardo | 2:cb6377d909e0 | 7 | DigitalIn Click(PTC11); |
julioefajardo | 1:b9ea91c4c533 | 8 | DigitalOut BlueLed(LED3); |
julioefajardo | 2:cb6377d909e0 | 9 | DigitalOut GreenLed(LED2); |
julioefajardo | 2:cb6377d909e0 | 10 | Ticker flipper; |
APanecatl | 0:d50fb46005fd | 11 | USBMouse mouse; |
julioefajardo | 1:b9ea91c4c533 | 12 | |
julioefajardo | 1:b9ea91c4c533 | 13 | AnalogIn AnIn0(A0); |
julioefajardo | 1:b9ea91c4c533 | 14 | AnalogIn AnIn1(A1); |
julioefajardo | 1:b9ea91c4c533 | 15 | |
julioefajardo | 2:cb6377d909e0 | 16 | FXOS8700Q_acc acc( PTE25, PTE24, FXOS8700CQ_SLAVE_ADDR1); // Proper Ports and I2C Address for K64F Freedom board |
julioefajardo | 2:cb6377d909e0 | 17 | |
julioefajardo | 2:cb6377d909e0 | 18 | Serial pc(USBTX, USBRX); |
julioefajardo | 2:cb6377d909e0 | 19 | |
julioefajardo | 2:cb6377d909e0 | 20 | void flip() { |
julioefajardo | 2:cb6377d909e0 | 21 | GreenLed = !GreenLed; |
julioefajardo | 2:cb6377d909e0 | 22 | } |
julioefajardo | 2:cb6377d909e0 | 23 | |
julioefajardo | 2:cb6377d909e0 | 24 | void LLW_IRQHandler(void){ |
julioefajardo | 2:cb6377d909e0 | 25 | if (LLWU_F2 & LLWU_F2_WUF11_MASK) { |
julioefajardo | 2:cb6377d909e0 | 26 | LLWU_F2 |= LLWU_F2_WUF11_MASK; // write one to clear the flag |
julioefajardo | 2:cb6377d909e0 | 27 | } |
julioefajardo | 2:cb6377d909e0 | 28 | } |
julioefajardo | 2:cb6377d909e0 | 29 | |
julioefajardo | 2:cb6377d909e0 | 30 | void LLW_Init(void){ |
julioefajardo | 2:cb6377d909e0 | 31 | LLWU_F2 |= LLWU_F2_WUF11_MASK; |
julioefajardo | 2:cb6377d909e0 | 32 | LLWU_PE3 = 0x80; |
julioefajardo | 2:cb6377d909e0 | 33 | LLWU_ME = 0x01; |
julioefajardo | 2:cb6377d909e0 | 34 | LLWU_RST = 0x01; |
julioefajardo | 2:cb6377d909e0 | 35 | } |
julioefajardo | 2:cb6377d909e0 | 36 | |
julioefajardo | 2:cb6377d909e0 | 37 | void Enter_VLLS0(void){ |
julioefajardo | 2:cb6377d909e0 | 38 | volatile unsigned int dummyread; |
julioefajardo | 2:cb6377d909e0 | 39 | int i; |
julioefajardo | 2:cb6377d909e0 | 40 | SMC_PMPROT = SMC_PMPROT_AVLLS_MASK; |
julioefajardo | 2:cb6377d909e0 | 41 | if ((SMC_PMSTAT & SMC_PMSTAT_PMSTAT_MASK)== 4){ |
julioefajardo | 2:cb6377d909e0 | 42 | SMC_PMCTRL &= ~SMC_PMCTRL_RUNM_MASK; // go back to RUN mode temporarily |
julioefajardo | 2:cb6377d909e0 | 43 | for (i=0;i<0xff;i++) |
julioefajardo | 2:cb6377d909e0 | 44 | { |
julioefajardo | 2:cb6377d909e0 | 45 | if ((SMC_PMSTAT & SMC_PMSTAT_PMSTAT_MASK)== 1) |
julioefajardo | 2:cb6377d909e0 | 46 | break; |
julioefajardo | 2:cb6377d909e0 | 47 | } |
julioefajardo | 2:cb6377d909e0 | 48 | } |
julioefajardo | 2:cb6377d909e0 | 49 | /* Set the STOPM field to 0b100 for VLLS0 mode */ |
julioefajardo | 2:cb6377d909e0 | 50 | SMC_PMCTRL &= ~SMC_PMCTRL_STOPM_MASK; |
julioefajardo | 2:cb6377d909e0 | 51 | SMC_PMCTRL |= SMC_PMCTRL_STOPM(0x4); |
julioefajardo | 2:cb6377d909e0 | 52 | /* set VLLSM = 00 * and PORPO = 1 */ |
julioefajardo | 2:cb6377d909e0 | 53 | SMC_VLLSCTRL &= ~SMC_VLLSCTRL_VLLSM_MASK; |
julioefajardo | 2:cb6377d909e0 | 54 | SMC_VLLSCTRL = SMC_VLLSCTRL_VLLSM(0) | SMC_VLLSCTRL_PORPO_MASK; |
julioefajardo | 2:cb6377d909e0 | 55 | /*wait for write to complete to SMC before stopping core */ |
julioefajardo | 2:cb6377d909e0 | 56 | dummyread = SMC_VLLSCTRL; |
julioefajardo | 2:cb6377d909e0 | 57 | dummyread++; |
julioefajardo | 2:cb6377d909e0 | 58 | /* Now execute the stop instruction to go into VLLS0 */ |
julioefajardo | 2:cb6377d909e0 | 59 | /* Set the SLEEPDEEP bit to enable deep sleep mode (STOP) */ |
julioefajardo | 2:cb6377d909e0 | 60 | //SCB->SCR |= SCB_SCR_SLEEPDEEP_MASK; |
julioefajardo | 2:cb6377d909e0 | 61 | SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; |
julioefajardo | 2:cb6377d909e0 | 62 | __wfi(); |
julioefajardo | 2:cb6377d909e0 | 63 | } |
julioefajardo | 2:cb6377d909e0 | 64 | |
APanecatl | 0:d50fb46005fd | 65 | int main() |
APanecatl | 0:d50fb46005fd | 66 | { |
julioefajardo | 2:cb6377d909e0 | 67 | float faX, faY, faZ; |
julioefajardo | 1:b9ea91c4c533 | 68 | float posx, posy; |
julioefajardo | 2:cb6377d909e0 | 69 | float pastx, pasty; |
APanecatl | 0:d50fb46005fd | 70 | int16_t x = 0; |
APanecatl | 0:d50fb46005fd | 71 | int16_t y = 0; |
julioefajardo | 2:cb6377d909e0 | 72 | //Initializations |
julioefajardo | 2:cb6377d909e0 | 73 | acc.enable(); |
julioefajardo | 2:cb6377d909e0 | 74 | LLW_Init(); |
julioefajardo | 2:cb6377d909e0 | 75 | //Interrupts |
julioefajardo | 2:cb6377d909e0 | 76 | flipper.attach(&flip, 0.1); |
julioefajardo | 2:cb6377d909e0 | 77 | NVIC_EnableIRQ(LLW_IRQn); |
APanecatl | 0:d50fb46005fd | 78 | |
APanecatl | 0:d50fb46005fd | 79 | while (1) |
APanecatl | 0:d50fb46005fd | 80 | { |
julioefajardo | 1:b9ea91c4c533 | 81 | if(LeftClick) mouse.release(MOUSE_LEFT); |
julioefajardo | 1:b9ea91c4c533 | 82 | else mouse.press(MOUSE_LEFT); |
julioefajardo | 1:b9ea91c4c533 | 83 | |
julioefajardo | 1:b9ea91c4c533 | 84 | if(RightClick) mouse.release(MOUSE_RIGHT); |
julioefajardo | 1:b9ea91c4c533 | 85 | else mouse.press(MOUSE_RIGHT); |
julioefajardo | 1:b9ea91c4c533 | 86 | |
julioefajardo | 1:b9ea91c4c533 | 87 | BlueLed = Click; |
APanecatl | 0:d50fb46005fd | 88 | |
julioefajardo | 2:cb6377d909e0 | 89 | acc.getX(&faX); |
julioefajardo | 2:cb6377d909e0 | 90 | if(faX>0.5f) Enter_VLLS0(); |
julioefajardo | 2:cb6377d909e0 | 91 | //pc.printf("X=%1.4f \r",faX); |
julioefajardo | 2:cb6377d909e0 | 92 | |
julioefajardo | 1:b9ea91c4c533 | 93 | posx=AnIn0.read(); |
julioefajardo | 1:b9ea91c4c533 | 94 | posy=AnIn1.read(); |
julioefajardo | 2:cb6377d909e0 | 95 | x = -800*(posx-pastx); |
julioefajardo | 2:cb6377d909e0 | 96 | y = 800*(posy-pasty); |
julioefajardo | 1:b9ea91c4c533 | 97 | |
APanecatl | 0:d50fb46005fd | 98 | mouse.move(x, y); |
julioefajardo | 1:b9ea91c4c533 | 99 | |
julioefajardo | 2:cb6377d909e0 | 100 | pastx = posx; |
julioefajardo | 2:cb6377d909e0 | 101 | pasty = posy; |
julioefajardo | 1:b9ea91c4c533 | 102 | |
julioefajardo | 1:b9ea91c4c533 | 103 | wait(0.01); |
APanecatl | 0:d50fb46005fd | 104 | } |
APanecatl | 0:d50fb46005fd | 105 | } |