//========================================================= // src/InitDevice.c: generated by Hardware Configurator // // This file will be regenerated when saving a document. // leave the sections inside the "$[...]" comment tags alone // or they will be overwritten! //========================================================= // USER INCLUDES #include #include "InitDevice.h" // USER PROTOTYPES // USER FUNCTIONS // $[Library Includes] #include "efm8_usb.h" #include "descriptors.h" #include "usb_0.h" // [Library Includes]$ //============================================================================== // enter_DefaultMode_from_RESET //============================================================================== extern void enter_DefaultMode_from_RESET(void) { // $[Config Calls] // Save the SFRPAGE uint8_t SFRPAGE_save = SFRPAGE; WDT_0_enter_DefaultMode_from_RESET(); PORTS_0_enter_DefaultMode_from_RESET(); PORTS_1_enter_DefaultMode_from_RESET(); PBCFG_0_enter_DefaultMode_from_RESET(); LFOSC_0_enter_DefaultMode_from_RESET(); CIP51_0_enter_DefaultMode_from_RESET(); CLOCK_0_enter_DefaultMode_from_RESET(); TIMER01_0_enter_DefaultMode_from_RESET(); TIMER16_2_enter_DefaultMode_from_RESET(); TIMER16_3_enter_DefaultMode_from_RESET(); TIMER_SETUP_0_enter_DefaultMode_from_RESET(); SPI_0_enter_DefaultMode_from_RESET(); UART_0_enter_DefaultMode_from_RESET(); INTERRUPT_0_enter_DefaultMode_from_RESET(); USBLIB_0_enter_DefaultMode_from_RESET(); // Restore the SFRPAGE SFRPAGE = SFRPAGE_save; // [Config Calls]$ } extern void INTERRUPT_0_enter_DefaultMode_from_RESET(void) { // $[EIE1 - Extended Interrupt Enable 1] // [EIE1 - Extended Interrupt Enable 1]$ // $[EIE2 - Extended Interrupt Enable 2] // [EIE2 - Extended Interrupt Enable 2]$ // $[EIP1H - Extended Interrupt Priority 1 High] // [EIP1H - Extended Interrupt Priority 1 High]$ // $[EIP1 - Extended Interrupt Priority 1 Low] // [EIP1 - Extended Interrupt Priority 1 Low]$ // $[EIP2 - Extended Interrupt Priority 2] // [EIP2 - Extended Interrupt Priority 2]$ // $[EIP2H - Extended Interrupt Priority 2 High] // [EIP2H - Extended Interrupt Priority 2 High]$ // $[IE - Interrupt Enable] /*********************************************************************** - Enable each interrupt according to its individual mask setting - Disable external interrupt 0 - Disable external interrupt 1 - Disable all SPI0 interrupts - Disable all Timer 0 interrupt - Disable all Timer 1 interrupt - Disable Timer 2 interrupt - Disable UART0 interrupt ***********************************************************************/ IE = IE_EA__ENABLED | IE_EX0__DISABLED | IE_EX1__DISABLED | IE_ESPI0__DISABLED | IE_ET0__DISABLED | IE_ET1__DISABLED | IE_ET2__DISABLED | IE_ES0__DISABLED; // [IE - Interrupt Enable]$ // $[IP - Interrupt Priority] // [IP - Interrupt Priority]$ // $[IPH - Interrupt Priority High] // [IPH - Interrupt Priority High]$ } extern void USBLIB_0_enter_DefaultMode_from_RESET(void) { // $[USBD Init] USBD_Init (&initstruct); // [USBD Init]$ } extern void CLOCK_0_enter_DefaultMode_from_RESET(void) { // $[HFOSC1 Setup] // Ensure SYSCLK is > 24 MHz before switching to HFOSC1 SFRPAGE = 0x00; CLKSEL = CLKSEL_CLKSL__HFOSC0 | CLKSEL_CLKDIV__SYSCLK_DIV_1; while ((CLKSEL & CLKSEL_DIVRDY__BMASK) == CLKSEL_DIVRDY__NOT_READY) ; // [HFOSC1 Setup]$ // $[CLKSEL - Clock Select] /*********************************************************************** - Clock derived from the Internal High Frequency Oscillator 1 - SYSCLK is equal to selected clock source divided by 1 ***********************************************************************/ CLKSEL = CLKSEL_CLKSL__HFOSC1 | CLKSEL_CLKDIV__SYSCLK_DIV_1; while ((CLKSEL & CLKSEL_DIVRDY__BMASK) == CLKSEL_DIVRDY__NOT_READY) ; // [CLKSEL - Clock Select]$ } extern void WDT_0_enter_DefaultMode_from_RESET(void) { // $[WDTCN - Watchdog Timer Control] SFRPAGE = 0x00; //Disable Watchdog with key sequence WDTCN = 0xDE; //First key WDTCN = 0xAD; //Second key // [WDTCN - Watchdog Timer Control]$ } extern void CIP51_0_enter_DefaultMode_from_RESET(void) { // $[PFE0CN - Prefetch Engine Control] /*********************************************************************** - Enable the prefetch engine - SYSCLK < 50 MHz ***********************************************************************/ SFRPAGE = 0x10; PFE0CN = PFE0CN_PFEN__ENABLED | PFE0CN_FLRT__SYSCLK_BELOW_50_MHZ; // [PFE0CN - Prefetch Engine Control]$ } extern void PBCFG_0_enter_DefaultMode_from_RESET(void) { // $[XBR2 - Port I/O Crossbar 2] /*********************************************************************** - Weak Pullups enabled - Crossbar enabled - UART1 I/O unavailable at Port pin - UART1 RTS1 unavailable at Port pin - UART1 CTS1 unavailable at Port pin ***********************************************************************/ XBR2 = XBR2_WEAKPUD__PULL_UPS_ENABLED | XBR2_XBARE__ENABLED | XBR2_URT1E__DISABLED | XBR2_URT1RTSE__DISABLED | XBR2_URT1CTSE__DISABLED; // [XBR2 - Port I/O Crossbar 2]$ // $[PRTDRV - Port Drive Strength] // [PRTDRV - Port Drive Strength]$ // $[XBR0 - Port I/O Crossbar 0] /*********************************************************************** - UART0 TX0, RX0 routed to Port pins P0.4 and P0.5 - SPI I/O routed to Port pins - SMBus 0 I/O unavailable at Port pins - CP0 unavailable at Port pin - Asynchronous CP0 unavailable at Port pin - CP1 unavailable at Port pin - Asynchronous CP1 unavailable at Port pin - SYSCLK unavailable at Port pin ***********************************************************************/ XBR0 = XBR0_URT0E__ENABLED | XBR0_SPI0E__ENABLED | XBR0_SMB0E__DISABLED | XBR0_CP0E__DISABLED | XBR0_CP0AE__DISABLED | XBR0_CP1E__DISABLED | XBR0_CP1AE__DISABLED | XBR0_SYSCKE__DISABLED; // [XBR0 - Port I/O Crossbar 0]$ // $[XBR1 - Port I/O Crossbar 1] // [XBR1 - Port I/O Crossbar 1]$ } extern void TIMER_SETUP_0_enter_DefaultMode_from_RESET(void) { // $[CKCON0 - Clock Control 0] /*********************************************************************** - System clock divided by 4 - Counter/Timer 0 uses the clock defined by the prescale field, SCA - Timer 2 high byte uses the clock defined by T2XCLK in TMR2CN0 - Timer 2 low byte uses the clock defined by T2XCLK in TMR2CN0 - Timer 3 high byte uses the clock defined by T3XCLK in TMR3CN0 - Timer 3 low byte uses the clock defined by T3XCLK in TMR3CN0 - Timer 1 uses the system clock ***********************************************************************/ CKCON0 = CKCON0_SCA__SYSCLK_DIV_4 | CKCON0_T0M__PRESCALE | CKCON0_T2MH__EXTERNAL_CLOCK | CKCON0_T2ML__EXTERNAL_CLOCK | CKCON0_T3MH__EXTERNAL_CLOCK | CKCON0_T3ML__EXTERNAL_CLOCK | CKCON0_T1M__SYSCLK; // [CKCON0 - Clock Control 0]$ // $[CKCON1 - Clock Control 1] // [CKCON1 - Clock Control 1]$ // $[TMOD - Timer 0/1 Mode] /*********************************************************************** - Mode 0, 13-bit Counter/Timer - Mode 2, 8-bit Counter/Timer with Auto-Reload - Timer Mode - Timer 0 enabled when TR0 = 1 irrespective of INT0 logic level - Timer Mode - Timer 1 enabled when TR1 = 1 irrespective of INT1 logic level ***********************************************************************/ TMOD = TMOD_T0M__MODE0 | TMOD_T1M__MODE2 | TMOD_CT0__TIMER | TMOD_GATE0__DISABLED | TMOD_CT1__TIMER | TMOD_GATE1__DISABLED; // [TMOD - Timer 0/1 Mode]$ // $[TCON - Timer 0/1 Control] /*********************************************************************** - Start Timer 1 running ***********************************************************************/ TCON |= TCON_TR1__RUN; // [TCON - Timer 0/1 Control]$ } extern void UARTE_1_enter_DefaultMode_from_RESET(void) { // $[SBCON1 - UART1 Baud Rate Generator Control] /*********************************************************************** - Enable the baud rate generator - Prescaler = 8 ***********************************************************************/ SFRPAGE = 0x20; SBCON1 = SBCON1_BREN__ENABLED | SBCON1_BPS__DIV_BY_8; // [SBCON1 - UART1 Baud Rate Generator Control]$ // $[SMOD1 - UART1 Mode] // [SMOD1 - UART1 Mode]$ // $[UART1FCN0 - UART1 FIFO Control 0] // [UART1FCN0 - UART1 FIFO Control 0]$ // $[SBRLH1 - UART1 Baud Rate Generator High Byte] /*********************************************************************** - UART1 Baud Rate Reload High = 0xFF ***********************************************************************/ SBRLH1 = (0xFF << SBRLH1_BRH__SHIFT); // [SBRLH1 - UART1 Baud Rate Generator High Byte]$ // $[SBRLL1 - UART1 Baud Rate Generator Low Byte] /*********************************************************************** - UART1 Baud Rate Reload Low = 0xE6 ***********************************************************************/ SBRLL1 = (0xE6 << SBRLL1_BRL__SHIFT); // [SBRLL1 - UART1 Baud Rate Generator Low Byte]$ // $[UART1LIN - UART1 LIN Configuration] // [UART1LIN - UART1 LIN Configuration]$ // $[SCON1 - UART1 Serial Port Control] /*********************************************************************** - UART1 reception enabled ***********************************************************************/ SCON1 |= SCON1_REN__RECEIVE_ENABLED; // [SCON1 - UART1 Serial Port Control]$ // $[UART1FCN1 - UART1 FIFO Control 1] // [UART1FCN1 - UART1 FIFO Control 1]$ } extern void TIMER16_2_enter_DefaultMode_from_RESET(void) { // $[Timer Initialization] // Save Timer Configuration uint8_t TMR2CN0_TR2_save; TMR2CN0_TR2_save = TMR2CN0 & TMR2CN0_TR2__BMASK; // Stop Timer TMR2CN0 &= ~(TMR2CN0_TR2__BMASK); // [Timer Initialization]$ // $[TMR2CN1 - Timer 2 Control 1] // [TMR2CN1 - Timer 2 Control 1]$ // $[TMR2CN0 - Timer 2 Control] // [TMR2CN0 - Timer 2 Control]$ // $[TMR2H - Timer 2 High Byte] // [TMR2H - Timer 2 High Byte]$ // $[TMR2L - Timer 2 Low Byte] // [TMR2L - Timer 2 Low Byte]$ // $[TMR2RLH - Timer 2 Reload High Byte] /*********************************************************************** - Timer 2 Reload High Byte = 0x63 ***********************************************************************/ TMR2RLH = (0x63 << TMR2RLH_TMR2RLH__SHIFT); // [TMR2RLH - Timer 2 Reload High Byte]$ // $[TMR2RLL - Timer 2 Reload Low Byte] /*********************************************************************** - Timer 2 Reload Low Byte = 0xC0 ***********************************************************************/ TMR2RLL = (0xC0 << TMR2RLL_TMR2RLL__SHIFT); // [TMR2RLL - Timer 2 Reload Low Byte]$ // $[TMR2CN0] // [TMR2CN0]$ // $[Timer Restoration] // Restore Timer Configuration TMR2CN0 |= TMR2CN0_TR2_save; // [Timer Restoration]$ } extern void TIMER16_3_enter_DefaultMode_from_RESET(void) { // $[Timer Initialization] // Save Timer Configuration uint8_t TMR3CN0_TR3_save; TMR3CN0_TR3_save = TMR3CN0 & TMR3CN0_TR3__BMASK; // Stop Timer TMR3CN0 &= ~(TMR3CN0_TR3__BMASK); // [Timer Initialization]$ // $[TMR3CN1 - Timer 3 Control 1] // [TMR3CN1 - Timer 3 Control 1]$ // $[TMR3CN0 - Timer 3 Control] /*********************************************************************** - Timer 3 clock is the low-frequency oscillator divided by 8 ***********************************************************************/ TMR3CN0 |= TMR3CN0_T3XCLK__LFOSC_DIV_8; // [TMR3CN0 - Timer 3 Control]$ // $[TMR3H - Timer 3 High Byte] // [TMR3H - Timer 3 High Byte]$ // $[TMR3L - Timer 3 Low Byte] // [TMR3L - Timer 3 Low Byte]$ // $[TMR3RLH - Timer 3 Reload High Byte] // [TMR3RLH - Timer 3 Reload High Byte]$ // $[TMR3RLL - Timer 3 Reload Low Byte] // [TMR3RLL - Timer 3 Reload Low Byte]$ // $[TMR3CN0] /*********************************************************************** - Start Timer 3 running ***********************************************************************/ TMR3CN0 |= TMR3CN0_TR3__RUN; // [TMR3CN0]$ // $[Timer Restoration] // Restore Timer Configuration TMR3CN0 |= TMR3CN0_TR3_save; // [Timer Restoration]$ } extern void PORTS_0_enter_DefaultMode_from_RESET(void) { // $[P0 - Port 0 Pin Latch] // [P0 - Port 0 Pin Latch]$ // $[P0MDOUT - Port 0 Output Mode] /*********************************************************************** - P0.0 output is open-drain - P0.1 output is open-drain - P0.2 output is open-drain - P0.3 output is open-drain - P0.4 output is push-pull - P0.5 output is open-drain - P0.6 output is open-drain - P0.7 output is push-pull ***********************************************************************/ P0MDOUT = P0MDOUT_B0__OPEN_DRAIN | P0MDOUT_B1__OPEN_DRAIN | P0MDOUT_B2__OPEN_DRAIN | P0MDOUT_B3__OPEN_DRAIN | P0MDOUT_B4__PUSH_PULL | P0MDOUT_B5__OPEN_DRAIN | P0MDOUT_B6__OPEN_DRAIN | P0MDOUT_B7__PUSH_PULL; // [P0MDOUT - Port 0 Output Mode]$ // $[P0MDIN - Port 0 Input Mode] // [P0MDIN - Port 0 Input Mode]$ // $[P0SKIP - Port 0 Skip] /*********************************************************************** - P0.0 pin is skipped by the crossbar - P0.1 pin is skipped by the crossbar - P0.2 pin is skipped by the crossbar - P0.3 pin is skipped by the crossbar - P0.4 pin is not skipped by the crossbar - P0.5 pin is not skipped by the crossbar - P0.6 pin is not skipped by the crossbar - P0.7 pin is not skipped by the crossbar ***********************************************************************/ P0SKIP = P0SKIP_B0__SKIPPED | P0SKIP_B1__SKIPPED | P0SKIP_B2__SKIPPED | P0SKIP_B3__SKIPPED | P0SKIP_B4__NOT_SKIPPED | P0SKIP_B5__NOT_SKIPPED | P0SKIP_B6__NOT_SKIPPED | P0SKIP_B7__NOT_SKIPPED; // [P0SKIP - Port 0 Skip]$ // $[P0MASK - Port 0 Mask] // [P0MASK - Port 0 Mask]$ // $[P0MAT - Port 0 Match] // [P0MAT - Port 0 Match]$ } extern void PORTS_1_enter_DefaultMode_from_RESET(void) { // $[P1 - Port 1 Pin Latch] /*********************************************************************** - P1.0 is high. Set P1.0 to drive or float high - P1.1 is high. Set P1.1 to drive or float high - P1.2 is low. Set P1.2 to drive low - P1.3 is high. Set P1.3 to drive or float high - P1.4 is high. Set P1.4 to drive or float high - P1.5 is high. Set P1.5 to drive or float high - P1.6 is high. Set P1.6 to drive or float high - P1.7 is high. Set P1.7 to drive or float high ***********************************************************************/ P1 = P1_B0__HIGH | P1_B1__HIGH | P1_B2__LOW | P1_B3__HIGH | P1_B4__HIGH | P1_B5__HIGH | P1_B6__HIGH | P1_B7__HIGH; // [P1 - Port 1 Pin Latch]$ // $[P1MDOUT - Port 1 Output Mode] /*********************************************************************** - P1.0 output is open-drain - P1.1 output is push-pull - P1.2 output is open-drain - P1.3 output is open-drain - P1.4 output is push-pull - P1.5 output is push-pull - P1.6 output is push-pull - P1.7 output is open-drain ***********************************************************************/ P1MDOUT = P1MDOUT_B0__OPEN_DRAIN | P1MDOUT_B1__PUSH_PULL | P1MDOUT_B2__OPEN_DRAIN | P1MDOUT_B3__OPEN_DRAIN | P1MDOUT_B4__PUSH_PULL | P1MDOUT_B5__PUSH_PULL | P1MDOUT_B6__PUSH_PULL | P1MDOUT_B7__OPEN_DRAIN; // [P1MDOUT - Port 1 Output Mode]$ // $[P1MDIN - Port 1 Input Mode] // [P1MDIN - Port 1 Input Mode]$ // $[P1SKIP - Port 1 Skip] // [P1SKIP - Port 1 Skip]$ // $[P1MASK - Port 1 Mask] // [P1MASK - Port 1 Mask]$ // $[P1MAT - Port 1 Match] // [P1MAT - Port 1 Match]$ } extern void PORTS_2_enter_DefaultMode_from_RESET(void) { // $[P2 - Port 2 Pin Latch] /*********************************************************************** - P2.0 is low. Set P2.0 to drive low - P2.1 is high. Set P2.1 to drive or float high - P2.2 is high. Set P2.2 to drive or float high - P2.3 is high. Set P2.3 to drive or float high ***********************************************************************/ P2 = P2_B0__LOW | P2_B1__HIGH | P2_B2__HIGH | P2_B3__HIGH; // [P2 - Port 2 Pin Latch]$ // $[P2MDOUT - Port 2 Output Mode] /*********************************************************************** - P2.0 output is push-pull - P2.1 output is open-drain - P2.2 output is open-drain - P2.3 output is open-drain ***********************************************************************/ P2MDOUT = P2MDOUT_B0__PUSH_PULL | P2MDOUT_B1__OPEN_DRAIN | P2MDOUT_B2__OPEN_DRAIN | P2MDOUT_B3__OPEN_DRAIN; // [P2MDOUT - Port 2 Output Mode]$ // $[P2MDIN - Port 2 Input Mode] // [P2MDIN - Port 2 Input Mode]$ // $[P2SKIP - Port 2 Skip] // [P2SKIP - Port 2 Skip]$ // $[P2MASK - Port 2 Mask] // [P2MASK - Port 2 Mask]$ // $[P2MAT - Port 2 Match] // [P2MAT - Port 2 Match]$ } extern void TIMER01_0_enter_DefaultMode_from_RESET(void) { // $[Timer Initialization] //Save Timer Configuration uint8_t TCON_save; TCON_save = TCON; //Stop Timers TCON &= ~TCON_TR0__BMASK & ~TCON_TR1__BMASK; // [Timer Initialization]$ // $[TH0 - Timer 0 High Byte] // [TH0 - Timer 0 High Byte]$ // $[TL0 - Timer 0 Low Byte] // [TL0 - Timer 0 Low Byte]$ // $[TH1 - Timer 1 High Byte] /*********************************************************************** - Timer 1 High Byte = 0x30 ***********************************************************************/ TH1 = (0x30 << TH1_TH1__SHIFT); // [TH1 - Timer 1 High Byte]$ // $[TL1 - Timer 1 Low Byte] // [TL1 - Timer 1 Low Byte]$ // $[Timer Restoration] //Restore Timer Configuration TCON |= (TCON_save & TCON_TR0__BMASK) | (TCON_save & TCON_TR1__BMASK); // [Timer Restoration]$ } extern void UART_0_enter_DefaultMode_from_RESET(void) { // $[SCON0 - UART0 Serial Port Control] /*********************************************************************** - UART0 reception enabled ***********************************************************************/ SCON0 |= SCON0_REN__RECEIVE_ENABLED; // [SCON0 - UART0 Serial Port Control]$ } extern void SPI_0_enter_DefaultMode_from_RESET(void) { // $[SPI0CKR - SPI0 Clock Rate] /*********************************************************************** - SPI0 Clock Rate = 0x0B ***********************************************************************/ SPI0CKR = (0x0B << SPI0CKR_SPI0CKR__SHIFT); // [SPI0CKR - SPI0 Clock Rate]$ // $[SPI0FCN0 - SPI0 FIFO Control 0] // [SPI0FCN0 - SPI0 FIFO Control 0]$ // $[SPI0FCN1 - SPI0 FIFO Control 1] // [SPI0FCN1 - SPI0 FIFO Control 1]$ // $[SPI0CFG - SPI0 Configuration] // [SPI0CFG - SPI0 Configuration]$ // $[SPI0CN0 - SPI0 Control] /*********************************************************************** - Enable the SPI module - 3-Wire Slave or 3-Wire Master Mode ***********************************************************************/ SPI0CN0 &= ~SPI0CN0_NSSMD__FMASK; SPI0CN0 |= SPI0CN0_SPIEN__ENABLED; // [SPI0CN0 - SPI0 Control]$ } extern void LFOSC_0_enter_DefaultMode_from_RESET(void) { // $[LFO0CN - Low Frequency Oscillator Control] /*********************************************************************** - Internal L-F Oscillator Enabled - Divide by 8 selected ***********************************************************************/ LFO0CN &= ~LFO0CN_OSCLD__FMASK; LFO0CN |= LFO0CN_OSCLEN__ENABLED; // [LFO0CN - Low Frequency Oscillator Control]$ // $[Wait for LFOSC Ready] while ((LFO0CN & LFO0CN_OSCLRDY__BMASK) != LFO0CN_OSCLRDY__SET) ; // [Wait for LFOSC Ready]$ }