void buttonInit(void) { TRISBbits.TRISB2 = 1; TRISBbits.TRISB0 = 1; TRISBbits.TRISB3 = 1; TRISBbits.TRISB4 = 1; TRISBbits.TRISB5 = 1; AD1PCFG = BIT_0 | BIT_2 | BIT_3 | BIT_4 | BIT_5; //AD1PCFG = 0xFF; mCNOpen(CONFIG, PINS, PULLUPS); ConfigCNPullups(CN2_PULLUP_ENABLE); ConfigCNPullups(CN3_PULLUP_ENABLE); ConfigCNPullups(CN5_PULLUP_ENABLE); ConfigCNPullups(CN6_PULLUP_ENABLE); ConfigCNPullups(CN7_PULLUP_ENABLE); }
/*-----------------------------------------------------------*/ static void prvSetupHardware(void) { /* Setup the CPU clocks, and configure the interrupt controller. */ SYSTEMConfigPerformance(configCPU_CLOCK_HZ); mOSCSetPBDIV(OSC_PB_DIV_2); INTEnableSystemMultiVectoredInt(); /* LEDs off. */ mPORTDClearBits(BIT_0 | BIT_1 | BIT_2); /* LEDs are outputs. */ mPORTDSetPinsDigitalOut(BIT_0 | BIT_1 | BIT_2); ConfigCNPullups(CN15_PULLUP_ENABLE | CN16_PULLUP_ENABLE | CN19_PULLUP_ENABLE); }
static void PB_IntInit (void) { CPU_INT32U dummy_read; CPU_INT16U config; config = CHANGE_INT_ON | CHANGE_INT_PRI_3; CNCON = 0x8000; /* Enable the change notice module */ EnableCN19(); /* Enable change notice pin 19, tied to our push button */ ConfigCNPullups(CN19_PULLUP_ENABLE); /* Enable a weak pull-up corresponding to the CN pin */ dummy_read = PORTD; /* Perform a dummy read to clear any mismatch conditions */ mCNClearIntFlag(); /* Clear the int flag just in case it was triggered */ ConfigIntCN(config); /* Enable CN interrupts at priority level 3 */ }
/**************************************************************************** Function: static void InitializeBoard(void) Description: This routine initializes the hardware. It is a generic initialization routine for many of the Microchip development boards, using definitions in HardwareProfile.h to determine specific initialization. Precondition: None Parameters: None - None Returns: None Remarks: None ***************************************************************************/ static void InitializeBoard(void) { // WiFi Module hardware Initialization handled by Library // Enable multi-vectored interrupts INTEnableSystemMultiVectoredInt(); // Enable optimal performance SYSTEMConfigPerformance(GetSystemClock()); mOSCSetPBDIV(OSC_PB_DIV_1); // Use 1:1 CPU Core:Peripheral clocks // Disable JTAG port so we get our I/O pins back, but first // wait 50ms so if you want to reprogram the part with // JTAG, you'll still have a tiny window before JTAG goes away. // The PIC32 Starter Kit debuggers use JTAG and therefore must not // disable JTAG. DelayMs(50); DDPCONbits.JTAGEN = 0; // LEDs LEDS_OFF(); mPORTESetPinsDigitalOut(BIT_5 | BIT_6 | BIT_7); // Switches mPORTDSetPinsDigitalIn(BIT_4 | BIT_5 | BIT_6); ConfigCNPullups(CN13_PULLUP_ENABLE | CN14_PULLUP_ENABLE | CN15_PULLUP_ENABLE); // LCD mPORTESetPinsDigitalOut(BIT_0 | BIT_1 | BIT_2 | BIT_3); //Configure LCD SPI pins mPORTFSetPinsDigitalOut(BIT_8); mPORTDSetPinsDigitalOut(BIT_15); //SPI Flash mPORTDSetPinsDigitalOut(BIT_14); //UART mPORTFSetPinsDigitalOut(BIT_5); mPORTFSetPinsDigitalIn(BIT_4); //MiWi #if defined(MRF24J40) || defined(MRF49XA) PHY_CS = 1; mPORTDSetPinsDigitalOut(BIT_9); PHY_RESETn = 1; mPORTDSetPinsDigitalOut(BIT_11); #endif #if defined(MRF49XA) nFSEL_TRIS = 0; FINT_TRIS = 1; nFSEL = 1; #elif defined(MRF24J40) PHY_WAKE = 1; mPORTBSetPinsDigitalOut(BIT_9); #else Data_nCS_TRIS = 0; Config_nCS_TRIS = 0; Data_nCS = 1; Config_nCS = 1; IRQ1_INT_TRIS = 1; IRQ0_INT_TRIS = 1; #endif /* Set the Port Directions of SDO, SDI, Clock & Slave Select Signal */ /* Set SCK port pin to output */ mPORTDSetPinsDigitalOut(BIT_10); /* Set SDO port pin to output */ mPORTDSetPinsDigitalOut(BIT_0); /* Set SDI port pin to input */ mPORTCSetPinsDigitalIn(BIT_4); /* Set INT1, INT2 port pins to input */ mPORTESetPinsDigitalIn(BIT_8 | BIT_9); /* Clear SPI1CON register */ SPI1CONCLR = 0xFFFFFFFF; #ifdef HARDWARE_SPI unsigned int pbFreq; /* Enable SPI1, Set to Master Mode & Set CKE bit : Serial output data changes on transition from active clock state to Idle clock state */ SPI1CON = 0x00008120; /* Peripheral Bus Frequency = System Clock / PB Divider */ pbFreq = (DWORD) CLOCK_FREQ / (1 << mOSCGetPBDIV()); /* PB Frequency can be maximum 40 MHz */ if (pbFreq > (2 * MAX_SPI_CLK_FREQ_FOR_P2P)) { { unsigned int SPI_Clk_Freq; unsigned char SPI_Brg1 = 1; //For the SPI1 /* Continue the loop till you find SPI Baud Rate Register Value */ while (1) { /* SPI Clock Calculation as per PIC32 Manual */ SPI_Clk_Freq = pbFreq / (2 * (SPI_Brg1 + 1)); if (SPI_Clk_Freq <= MAX_SPI_CLK_FREQ_FOR_P2P) { break; } SPI_Brg1++; } mSpiChnSetBrg(1, SPI_Brg1); } } else { /* Set SPI1 Baud Rate */ mSpiChnSetBrg(1, 0); } #endif /* Set the Interrupt Priority */ mINT2SetIntPriority(4); #if defined(MRF89XA) mINT1SetIntPriority(4); #endif /* Set Interrupt Subpriority Bits for INT2 */ mINT2SetIntSubPriority(2); #if defined(MRF89XA) mINT2SetIntSubPriority(1); #endif /* Set INT2 to falling edge */ mINT2SetEdgeMode(0); #if defined(MRF89XA) mINT1SetEdgeMode(1); mINT2SetEdgeMode(1); #endif /* Enable INT2 */ mINT2IntEnable(1); #if defined(MRF89XA) mINT2IntEnable(1); #endif /* Enable Multi Vectored Interrupts */ // INTEnableSystemMultiVectoredInt(); #if defined(MRF89XA) PHY_IRQ1 = 0; PHY_IRQ0 = 0; PHY_RESETn_TRIS = 1; #else RFIF = 0; if (RF_INT_PIN == 0) { RFIF = 1; } #endif // Initialize the EEPROM XEEInit(); // UART Initialization #if defined(STACK_USE_UART) UARTTX_TRIS = 0; UARTRX_TRIS = 1; UMODE = 0x8000; // Set UARTEN. Note: this must be done before setting UTXEN USTA = 0x00001400; // RXEN set, TXEN set #define CLOSEST_UBRG_VALUE ((GetPeripheralClock()+8ul*BAUD_RATE)/16/BAUD_RATE-1) #define BAUD_ACTUAL (GetPeripheralClock()/16/(CLOSEST_UBRG_VALUE+1)) #define BAUD_ERROR ((BAUD_ACTUAL > BAUD_RATE) ? BAUD_ACTUAL-BAUD_RATE : BAUD_RATE-BAUD_ACTUAL) #define BAUD_ERROR_PRECENT ((BAUD_ERROR*100+BAUD_RATE/2)/BAUD_RATE) #if (BAUD_ERROR_PRECENT > 3) #warning UART frequency error is worse than 3% #elif (BAUD_ERROR_PRECENT > 2) #warning UART frequency error is worse than 2% #endif UBRG = CLOSEST_UBRG_VALUE; #endif }
//******************************** //******************************** //********** INITIALISE ********** //******************************** //******************************** void initialise (void) { BYTE data; //##### GENERAL NOTE ABOUT PIC32'S ##### //Try and use the peripheral libraries instead of special function registers for everything (literally everything!) to avoid //bugs that can be caused by the pipeline and interrupts. //--------------------------------- //----- CONFIGURE PERFORMANCE ----- //--------------------------------- //----- SETUP EVERYTHING FOR OPTIMUM PERFORMANCE ----- SYSTEMConfigPerformance(80000000ul); //Note this sets peripheral bus to '1' max speed (regardless of configuration bit setting) //Use PBCLK divider of 1:1 to calculate UART baud, timer tick etc //----- SET PERIPHERAL BUS DIVISOR ----- //To minimize dynamic power the PB divisor should be chosen to run the peripherals at the lowest frequency that provides acceptable system performance mOSCSetPBDIV(OSC_PB_DIV_2); //OSC_PB_DIV_1, OSC_PB_DIV_2, OSC_PB_DIV_4, OSC_PB_DIV_8, //----- SETUP INTERRUPTS ----- INTEnableSystemMultiVectoredInt(); //------------------------- //----- SETUP IO PINS ----- //------------------------- //(Device will powerup with all IO pins as inputs) //----- TURN OFF THE JTAG PORT ----- //(JTAG is on by default) //mJTAGPortEnable(0); //Must be on for Microchip Multimedia Development board #define PORTA_IO 0xc2ff //Setup the IO pin type (0 = output, 1 = input) mPORTAWrite(0xc033); //Set initial ouput pin states mPORTASetPinsDigitalIn(PORTA_IO); //(Sets high bits as input) mPORTASetPinsDigitalOut(~PORTA_IO); //(Sets high bits as output) #define PORTB_IO 0xfbff //Setup the IO pin type (0 = output, 1 = input) mPORTBWrite(0x6d13); //Set initial ouput pin states mPORTBSetPinsDigitalIn(PORTB_IO); //(Sets high bits as input) mPORTBSetPinsDigitalOut(~PORTB_IO); //(Sets high bits as output) mPORTBSetPinsDigitalIn(BIT_0 | BIT_1 | BIT_3 | BIT_4 | BIT_15); //Joystick inputs #define PORTC_IO 0xf01e //Setup the IO pin type (0 = output, 1 = input) mPORTCWrite(0x3018); //Set initial ouput pin states mPORTCSetPinsDigitalIn(PORTC_IO); //(Sets high bits as input) mPORTCSetPinsDigitalOut(~PORTC_IO); //(Sets high bits as output) #define PORTD_IO 0x7bfe //Setup the IO pin type (0 = output, 1 = input) mPORTDWrite(0xbdaf); //Set initial ouput pin states mPORTDSetPinsDigitalIn(PORTD_IO); //(Sets high bits as input) mPORTDSetPinsDigitalOut(~PORTD_IO); //(Sets high bits as output) mPORTDSetPinsDigitalOut(BIT_2 | BIT_1); //LED's 2 and 3 mPORTDSetPinsDigitalIn(BIT_9); #define PORTE_IO 0x03ff //Setup the IO pin type (0 = output, 1 = input) mPORTEWrite(0x02a2); //Set initial ouput pin states mPORTESetPinsDigitalIn(PORTE_IO); //(Sets high bits as input) mPORTESetPinsDigitalOut(~PORTE_IO); //(Sets high bits as output) #define PORTF_IO 0x111f //Setup the IO pin type (0 = output, 1 = input) mPORTFWrite(0x0039); //Set initial ouput pin states mPORTFSetPinsDigitalIn(PORTF_IO); //(Sets high bits as input) mPORTFSetPinsDigitalOut(~PORTF_IO); //(Sets high bits as output) #define PORTG_IO 0xd3cf //Setup the IO pin type (0 = output, 1 = input) mPORTGWrite(0xf203); //Set initial ouput pin states mPORTGSetPinsDigitalIn(PORTG_IO); //(Sets high bits as input) mPORTGSetPinsDigitalOut(~PORTG_IO); //(Sets high bits as output) //Read pins using: // mPORTAReadBits(BIT_0); //Write pins using: // mPORTAClearBits(BIT_0); // mPORTASetBits(BIT_0); // mPORTAToggleBits(BIT_0); //----- INPUT CHANGE NOTIFICATION CONFIGURATION ----- //EnableCN0(); ConfigCNPullups(CN2_PULLUP_ENABLE | CN3_PULLUP_ENABLE | CN5_PULLUP_ENABLE | CN6_PULLUP_ENABLE | CN12_PULLUP_ENABLE); //Joystick pins //----- SETUP THE A TO D PINS ----- ENABLE_ALL_DIG; //--------------------- //----- SETUP USB ----- //--------------------- //The USB specifications require that USB peripheral devices must never source current onto the Vbus pin. Additionally, USB peripherals should not source //current on D+ or D- when the host/hub is not actively powering the Vbus line. When designing a self powered (as opposed to bus powered) USB peripheral //device, the firmware should make sure not to turn on the USB module and D+ or D- pull up resistor unless Vbus is actively powered. Therefore, the //firmware needs some means to detect when Vbus is being powered by the host. A 5V tolerant I/O pin can be connected to Vbus (through a resistor), and //can be used to detect when Vbus is high (host actively powering), or low (host is shut down or otherwise not supplying power). The USB firmware //can then periodically poll this I/O pin to know when it is okay to turn on the USB module/D+/D- pull up resistor. When designing a purely bus powered //peripheral device, it is not possible to source current on D+ or D- when the host is not actively providing power on Vbus. Therefore, implementing this //bus sense feature is optional. This firmware can be made to use this bus sense feature by making sure "USE_USB_BUS_SENSE_IO" has been defined in the //HardwareProfile.h file. // #if defined(USE_USB_BUS_SENSE_IO) // tris_usb_bus_sense = INPUT_PIN; // See HardwareProfile.h // #endif //If the host PC sends a GetStatus (device) request, the firmware must respond and let the host know if the USB peripheral device is currently bus powered //or self powered. See chapter 9 in the official USB specifications for details regarding this request. If the peripheral device is capable of being both //self and bus powered, it should not return a hard coded value for this request. Instead, firmware should check if it is currently self or bus powered, and //respond accordingly. If the hardware has been configured like demonstrated on the PICDEM FS USB Demo Board, an I/O pin can be polled to determine the //currently selected power source. On the PICDEM FS USB Demo Board, "RA2" is used for this purpose. If using this feature, make sure "USE_SELF_POWER_SENSE_IO" //has been defined in HardwareProfile.h, and that an appropriate I/O pin has been mapped to it in HardwareProfile.h. // #if defined(USE_SELF_POWER_SENSE_IO) // tris_self_power = INPUT_PIN; // See HardwareProfile.h // #endif //Enable the USB port now - we will check to see if Vbus is powered at the end of init and disable it if not. //USBDeviceInit(); //usb_device.c. Initializes USB module SFRs and firmware variables to known states. //------------------------ //----- SETUP TIMERS ----- //------------------------ //(INCLUDE THE USAGE OF ALL TIMERS HERE EVEN IF NOT SETUP HERE SO THIS IS THE ONE POINT OF //REFERENCE TO KNOW WHICH TIMERS ARE IN USE AND FOR WHAT). //----- SETUP TIMER 1 ----- //Used for: Available //OpenTimer1((T1_ON | T1_IDLE_CON | T1_GATE_OFF | T1_PS_1_4 | T1_SOURCE_INT), 20000); //----- SETUP TIMER 2 ----- //Used for: //OpenTimer2((T2_ON | T2_IDLE_CON | T2_GATE_OFF | T2_PS_1_1 | T2_SOURCE_INT), 0xffff); //0xffff = 305Hz //----- SETUP TIMER 3 ----- //Used for: //OpenTimer3((T3_ON | T3_IDLE_CON | T3_GATE_OFF | T3_PS_1_1 | T3_SOURCE_INT), PIEZO_TIMER_PERIOD); //----- SETUP TIMER 4 ----- //Used for: //OpenTimer4((T4_ON | T4_IDLE_CON | T4_GATE_OFF | T4_PS_1_1 | T4_SOURCE_INT), 20000); //----- SETUP TIMER 5 ----- //Used for: Heartbeat OpenTimer5((T5_ON | T5_IDLE_CON | T5_GATE_OFF | T5_PS_1_1 | T5_SOURCE_INT), 40000); //1mS with 80MHz osc and PB_DIV_2 ConfigIntTimer5(T5_INT_ON | T5_INT_PRIOR_7); //1=lowest priority to 7=highest priority. ISR function must specify same value //--------------------------------- //----- SETUP EVAL BOARD CPLD ----- //--------------------------------- //Graphics bus width = 16 mPORTGSetPinsDigitalOut(BIT_14); mPORTGSetBits(BIT_14); //SPI source select = SPI3 (not used) mPORTGSetPinsDigitalOut(BIT_12); mPORTGClearBits(BIT_12); //SPI peripheral destination select = Expansion Slot (not used) mPORTASetPinsDigitalOut(BIT_7 | BIT_6); mPORTASetBits(BIT_7); mPORTAClearBits(BIT_6); //-------------------------------------- //----- PARALLEL MASTER PORT SETUP ----- //-------------------------------------- PMMODE = 0; PMAEN = 0; PMCON = 0; PMMODE = 0x0610; PMCONbits.PTRDEN = 1; //Enable RD line PMCONbits.PTWREN = 1; //Enable WR line PMCONbits.PMPEN = 1; //Enable PMP //------------------------------ //----- INITIALISE DISPLAY ----- //------------------------------ display_initialise(); display_test(); //LOAD OUR GLOBAL HTML STYLES FILE READY FOR DISPLAY HTML PAGES BYTE dummy_styles_count; DWORD file_size; if (display_html_setup_read_file(global_css, 0, &file_size)) { dummy_styles_count = 0; display_html_read_styles(&file_size, &dummy_styles_count, 1); //1 = this is global styles file } }