void Init() { // Set up the USART pins for SPI mode // The pins are already set up for SPI in the pins table ConfigurePin(GetPinDescription(DotStarMosiPin)); ConfigurePin(GetPinDescription(DotStarSclkPin)); // Enable the clock to the USART pmc_enable_periph_clk(DotStarUsartId); // Set the USART in SPI mode, with the clock high when inactive, data changing on the falling edge of the clock DotStarUsart->US_IDR = ~0u; DotStarUsart->US_CR = US_CR_RSTRX | US_CR_RSTTX | US_CR_RXDIS | US_CR_TXDIS; DotStarUsart->US_MR = US_MR_USART_MODE_SPI_MASTER | US_MR_USCLKS_MCK | US_MR_CHRL_8_BIT | US_MR_CHMODE_NORMAL | US_MR_CPOL | US_MR_CLKO; DotStarUsart->US_BRGR = VARIANT_MCK/DotStarSpiClockFrequency; // set SPI clock frequency DotStarUsart->US_CR = US_CR_RSTRX | US_CR_RSTTX | US_CR_RXDIS | US_CR_TXDIS | US_CR_RSTSTA; // Initialise variables numRemaining = totalSent = 0; needStartFrame = true; busy = false; }
extern "C" void init( void ) { SystemInit(); // Set Systick to 1ms interval, common to all SAM3 variants if (SysTick_Config(SystemCoreClock / 1000)) { // Capture error while (true); } UrgentInit(); // initialise anything in the main application that can't wait // Initialize C library __libc_init_array(); // Initialize Serial port U(S)ART pins ConfigurePin(g_APinDescription[APINS_USART0]); setPullup(APIN_USART0_RXD, true); // Enable pullup for RXD // Initialize USB pins ConfigurePin(g_APinDescription[APINS_USB]); // Initialize Analog Controller AnalogInInit(); // Initialize analogOutput module AnalogOutInit(); // Initialize TRNG pmc_enable_periph_clk(ID_TRNG); TRNG->TRNG_IDR = TRNG_IDR_DATRDY; // Disable all interrupts TRNG->TRNG_CR = TRNG_CR_KEY(0x524e47) | TRNG_CR_ENABLE; // Enable TRNG with security key (required) }
static void Wire1_Init(void) { pmc_enable_periph_clk(WIRE1_INTERFACE_ID); ConfigurePin(g_APinDescription[APIN_WIRE1_SDA]); ConfigurePin(g_APinDescription[APIN_WIRE1_SCL]); NVIC_DisableIRQ(TWI0_IRQn); NVIC_ClearPendingIRQ(TWI0_IRQn); NVIC_EnableIRQ(TWI0_IRQn); }
extern "C" void init( void ) { SystemInit(); // Set Systick to 1ms interval, common to all SAM3 variants if (SysTick_Config(SystemCoreClock / 1000)) { // Capture error while (true); } UrgentInit(); // initialise anything in the main application that can't wait // Initialize C library (I think this calls C++ constructors for static data too) __libc_init_array(); // We no longer disable pullups on all pins here, better to leave them enabled until the port is initialised // Initialize Serial port U(S)ART pins ConfigurePin(g_APinDescription[APINS_UART0]); setPullup(APIN_UART0_RXD, true); // Enable pullup for RX0 ConfigurePin(g_APinDescription[APINS_UART1]); setPullup(APIN_UART1_RXD, true); // Enable pullup for RX1 // No need to initialize the USB pins on the SAM4E because they are USB by default // Initialize Analog Controller AnalogInInit(); // Initialize analogOutput module AnalogOutInit(); // Initialize HSMCI pins ConfigurePin(g_APinDescription[APIN_HSMCI_CLOCK]); ConfigurePin(g_APinDescription[APINS_HSMCI_DATA]); // Start the USB udc_start(); }
extern "C" void init( void ) { SystemInit(); // Set Systick to 1ms interval, common to all SAM3 variants if (SysTick_Config(SystemCoreClock / 1000)) { // Capture error while (true); } // Initialize C library __libc_init_array(); // Disable pull-up on every pin for (size_t i = 0; i <= MaxPinNumber; i++) { setPullup(i, false); } // Enable parallel access on PIO output data registers // PIOA->PIO_OWER = 0xFFFFFFFF; // PIOB->PIO_OWER = 0xFFFFFFFF; // PIOC->PIO_OWER = 0xFFFFFFFF; // PIOD->PIO_OWER = 0xFFFFFFFF; // Initialize Serial port U(S)ART pins ConfigurePin(g_APinDescription[APINS_UART]); setPullup(APIN_UART_RXD, true); // Enable pullup for RX0 ConfigurePin(g_APinDescription[APINS_USART0]); // Initialize USB pins ConfigurePin(g_APinDescription[APINS_USB]); // Initialize Analog Controller AnalogInInit(); // Initialize analogOutput module AnalogOutInit(); // Initialize HSMCI pins ConfigurePin(g_APinDescription[APIN_HSMCI_CLOCK]); ConfigurePin(g_APinDescription[APINS_HSMCI_DATA]); // Initialize Ethernet pins ConfigurePin(g_APinDescription[APINS_EMAC]); // Initialize TRNG pmc_enable_periph_clk(ID_TRNG); TRNG->TRNG_IDR = TRNG_IDR_DATRDY; // Disable all interrupts TRNG->TRNG_CR = TRNG_CR_KEY(0x524e47) | TRNG_CR_ENABLE; // Enable TRNG with security key (required) // Start the USB udc_start(); }
extern "C" void pinModeDuet(Pin pin, enum PinMode ulMode, uint32_t debounceCutoff) { if (pin > MaxPinNumber) { return; } const PinDescription& pinDesc = g_APinDescription[pin]; if (pinDesc.ulPinType == PIO_NOT_A_PIN) { return; } switch (ulMode) { case INPUT: /* Enable peripheral for clocking input */ pmc_enable_periph_clk(pinDesc.ulPeripheralId); pio_pull_up(pinDesc.pPort, pinDesc.ulPin, 0); // turn off pullup #if SAM4E pio_pull_down(pinDesc.pPort, pinDesc.ulPin, 0); // turn off pulldown #endif pio_configure( pinDesc.pPort, PIO_INPUT, pinDesc.ulPin, (debounceCutoff == 0) ? 0 : PIO_DEBOUNCE); if (debounceCutoff != 0) { pio_set_debounce_filter(pinDesc.pPort, pinDesc.ulPin, debounceCutoff); // enable debounce filer with specified cutoff frequency } break; case INPUT_PULLUP: /* Enable peripheral for clocking input */ pmc_enable_periph_clk(pinDesc.ulPeripheralId); #if SAM4E pio_pull_down(pinDesc.pPort, pinDesc.ulPin, 0); // turn off pulldown #endif pio_configure( pinDesc.pPort, PIO_INPUT, pinDesc.ulPin, (debounceCutoff == 0) ? PIO_PULLUP : PIO_PULLUP | PIO_DEBOUNCE); if (debounceCutoff != 0) { pio_set_debounce_filter(pinDesc.pPort, pinDesc.ulPin, debounceCutoff); // enable debounce filer with specified cutoff frequency } break; #if SAM4E case INPUT_PULLDOWN: /* Enable peripheral for clocking input */ pmc_enable_periph_clk(pinDesc.ulPeripheralId); pio_pull_up(pinDesc.pPort, pinDesc.ulPin, 0); pio_pull_down(pinDesc.pPort, pinDesc.ulPin, 1); pio_configure( pinDesc.pPort, PIO_INPUT, pinDesc.ulPin, (debounceCutoff == 0) ? 0 : PIO_DEBOUNCE); if (debounceCutoff != 0) { pio_set_debounce_filter(pinDesc.pPort, pinDesc.ulPin, debounceCutoff); // enable debounce filer with specified cutoff frequency } break; #endif case OUTPUT_LOW: pio_configure( pinDesc.pPort, PIO_OUTPUT_0, pinDesc.ulPin, pinDesc.ulPinConfiguration); /* if all pins are output, disable PIO Controller clocking, reduce power consumption */ if (pinDesc.pPort->PIO_OSR == 0xffffffff) { pmc_disable_periph_clk(pinDesc.ulPeripheralId); } break; case OUTPUT_HIGH: pio_configure( pinDesc.pPort, PIO_OUTPUT_1, pinDesc.ulPin, pinDesc.ulPinConfiguration); /* if all pins are output, disable PIO Controller clocking, reduce power consumption */ if (pinDesc.pPort->PIO_OSR == 0xffffffff) { pmc_disable_periph_clk(pinDesc.ulPeripheralId); } break; case OUTPUT_PWM_LOW: if ((pinDesc.ulPinAttribute & (PIN_ATTR_PWM | PIN_ATTR_TIMER)) != 0) { AnalogOut(pin, 0.0, 0); // set it to zero frequency to force re-initialisation on next AnalogOut call } break; case OUTPUT_PWM_HIGH: if ((pinDesc.ulPinAttribute & (PIN_ATTR_PWM | PIN_ATTR_TIMER)) != 0) { AnalogOut(pin, 1.0, 0); // set it to zero frequency to force re-initialisation on next AnalogOut call } break; case AIN: pio_pull_up(pinDesc.pPort, pinDesc.ulPin, 0); // turn off pullup #if SAM4E pio_pull_down(pinDesc.pPort, pinDesc.ulPin, 0); // turn off pulldown #endif // Ideally we should record which pins are being used as analog inputs, then we can disable the clock // on any PIO that is being used solely for outputs and ADC inputs. But for now we don't do that. break; case SPECIAL: ConfigurePin(pinDesc); break; default: break; } }