Fx2lib
0.2
|
The firmware framework allows for easily beginning a new firware project.
#include <fx2macros.h> #include <fx2ints.h> #include <autovector.h> #include <delay.h> #include <setupdat.h> #ifdef DEBUG_FIRMWARE #include <serial.h> #include <stdio.h> #else #define printf(...) #endif #define SUSPEND_ENABLED volatile __bit dosud=FALSE; volatile __bit dosuspend=FALSE; // custom functions extern void main_loop(); extern void main_init(); void main() { #ifdef DEBUG_FIRMWARE SETCPUFREQ(CLK_48M); // required for sio0_init // main_init can still set this to whatever you want. sio0_init(57600); // needed for printf if debug defined #endif main_init(); // set up interrupts. USE_USB_INTS(); ENABLE_SUDAV(); ENABLE_USBRESET(); ENABLE_HISPEED(); ENABLE_SUSPEND(); ENABLE_RESUME(); EA=1; // iic files (c2 load) don't need to renumerate/delay // trm 3.6 #ifndef NORENUM RENUMERATE(); #else USBCS &= ~bmDISCON; #endif while(TRUE) { main_loop(); if (dosud) { dosud=FALSE; handle_setupdata(); } #ifdef SUSPEND_ENABLED if (dosuspend) { dosuspend=FALSE; do { printf ( "I'm going to Suspend.\n" ); WAKEUPCS |= bmWU|bmWU2; // make sure ext wakeups are cleared SUSPEND=1; PCON |= 1; __asm nop nop nop nop nop nop nop __endasm; } while ( !remote_wakeup_allowed && REMOTE_WAKEUP()); printf ( "I'm going to wake up.\n"); // resume // trm 6.4 if ( REMOTE_WAKEUP() ) { delay(5); USBCS |= bmSIGRESUME; delay(15); USBCS &= ~bmSIGRESUME; } } #endif } // end while } // end main void resume_isr() __interrupt RESUME_ISR { CLEAR_RESUME(); } void sudav_isr() __interrupt SUDAV_ISR { dosud=TRUE; CLEAR_SUDAV(); } void usbreset_isr() __interrupt USBRESET_ISR { handle_hispeed(FALSE); CLEAR_USBRESET(); } void hispeed_isr() __interrupt HISPEED_ISR { handle_hispeed(TRUE); CLEAR_HISPEED(); } void suspend_isr() __interrupt SUSPEND_ISR { dosuspend=TRUE; CLEAR_SUSPEND(); }