/* * Board-specific initialization code. */ void boardInit(void) { /* * LED pins setup. */ palClearPad(IOPORT1, PIOA_LED1); palSetPadMode(IOPORT1, PIOA_LED1, PAL_MODE_OUTPUT_PUSHPULL); palClearPad(IOPORT1, PIOA_LED2); palSetPadMode(IOPORT1, PIOA_LED2, PAL_MODE_OUTPUT_PUSHPULL); /* * buttons setup. */ palSetGroupMode(IOPORT1, PIOA_B1_MASK | PIOA_B2_MASK, 0, PAL_MODE_INPUT); /* * MMC/SD slot setup. */ palSetGroupMode(IOPORT1, PIOA_MMC_WP_MASK | PIOA_MMC_CP_MASK, 0, PAL_MODE_INPUT); /* * PIT Initialization. */ AIC_ConfigureIT(AT91C_ID_SYS, AT91C_AIC_SRCTYPE_HIGH_LEVEL | (AT91C_AIC_PRIOR_HIGHEST - 1), SYSIrqHandler); AIC_EnableIT(AT91C_ID_SYS); AT91C_BASE_PITC->PITC_PIMR = (MCK / 16 / CH_FREQUENCY) - 1; AT91C_BASE_PITC->PITC_PIMR |= AT91C_PITC_PITEN | AT91C_PITC_PITIEN; }
/** * @brief Programs a bus with the specified mode. * @note The operation is not guaranteed to be atomic on all the * architectures, for atomicity and/or portability reasons you may * need to enclose port I/O operations between @p chSysLock() and * @p chSysUnlock(). * @note The default implementation is non atomic and not necessarily * optimal. Low level drivers may optimize the function by using * specific hardware or coding. * * @param[in] bus the I/O bus, pointer to a @p IOBus structure * @param[in] mode the mode * * @api */ void palSetBusMode(IOBus *bus, iomode_t mode) { chDbgCheck((bus != NULL) && (bus->offset < PAL_IOPORTS_WIDTH), "palSetBusMode"); palSetGroupMode(bus->portid, bus->mask, bus->offset, mode); }
void convStart( void ) { /* pwmStart( &PWMD2, &pwmCfg ); palSetPadMode( GPIOA, 0, PAL_MODE_STM32_ALTERNATE_PUSHPULL ); palSetPadMode( GPIOA, 1, PAL_MODE_STM32_ALTERNATE_PUSHPULL ); //palSetPadMode( GPIOA, 2, PAL_MODE_STM32_ALTERNATE_PUSHPULL ); pwmEnableChannel(&PWMD2, 0, PWM_PERCENTAGE_TO_WIDTH( &PWMD2, 9500 ) ); pwmEnableChannel(&PWMD2, 1, PWM_PERCENTAGE_TO_WIDTH( &PWMD2, 3030 ) ); //pwmEnableChannel(&PWMD2, 2, PWM_PERCENTAGE_TO_WIDTH( &PWMD2, 3030 ) ); */ // Start PWM peripherial. pwmStart( &CONV_PWM, &pwmCfg ); // Init PWM pins. palSetPadMode( CONV_PORT, CONV_BUCK_PIN, PAL_MODE_STM32_ALTERNATE_PUSHPULL ); palSetPadMode( CONV_PORT, CONV_BOOST_PIN, PAL_MODE_STM32_ALTERNATE_PUSHPULL ); // Set zero active period. pwmEnableChannel(&CONV_PWM, PWM_BOOST_CHAN, PWM_PERCENTAGE_TO_WIDTH( &CONV_PWM, 0000 ) ); pwmEnableChannel(&CONV_PWM, PWM_BUCK_CHAN, PWM_PERCENTAGE_TO_WIDTH( &CONV_PWM, 0000 ) ); // Init ADC. palSetGroupMode(CONV_ADC_PORT, PAL_PORT_BIT( CONV_BUCK_FB_PIN ) | PAL_PORT_BIT( CONV_BOOST_FB_PIN ) | PAL_PORT_BIT( CONV_INPUT_FB_PIN ), 0, PAL_MODE_INPUT_ANALOG); adcStart( &ADCD1, NULL ); adcStartConversion( &ADCD1, &adcGroup, adcSamples, ADC_BUF_DEPTH ); }
/** * @brief Programs a bus with the specified mode. * @note The operation is not guaranteed to be atomic on all the * architectures, for atomicity and/or portability reasons you may * need to enclose port I/O operations between @p chSysLock() and * @p chSysUnlock(). * @note The default implementation is non atomic and not necessarily * optimal. Low level drivers may optimize the function by using * specific hardware or coding. * * @param[in] bus the I/O bus, pointer to a @p IOBus structure * @param[in] mode the mode * * @api */ void palSetBusMode(IOBus *bus, uint_fast8_t mode) { chDbgCheck((bus != NULL) && (bus->bus_offset < PAL_IOPORTS_WIDTH), "palSetBusMode"); palSetGroupMode(bus->bus_portid, bus->bus_mask, mode); }
/* This function will start the PWM generator. */ extern void bldcInit(void) { bldc.scheme = &pwmScheme; bldc.state = 0; //Default to first state bldc.nextState = 0; bldc.directionFwd = TRUE; bldc.stateChangeInterval = MS2RTT(20); bldc.prevStateChange = halGetCounterValue(); bldc.nextStateChange = bldc.prevStateChange + bldc.stateChangeInterval; bldc.pwmOutT0 = 0; bldc.pwmOutT1 = 0; bldc.stateCount = sizeof(pwmScheme)/3; bldc.dutyCycle = 1800; palWriteGroup (PWM_OUT_PORT, PWM_OUT_PORT_MASK, PWM_OUT_OFFSET, PWM_OFF); palSetGroupMode (PWM_OUT_PORT, PWM_OUT_PORT_MASK, PWM_OUT_OFFSET, PAL_MODE_OUTPUT_PUSHPULL); palSetPadMode (GPIOA, GPIOA_PIN1, PAL_MODE_INPUT_ANALOG); pwmStart(&PWMD1, &pwmcfg); // ADC trigger channel. This will trigger the ADC read at 95% of the cycle, // when all the PWM outputs are set to 0 pwmEnableChannel (&PWMD1, PWM_ADCTRIG_CH, PWM_PERCENTAGE_TO_WIDTH(&PWMD1, PWM_MAX_DUTY_CYCLE)); // Start the ADC adcStart(&ADCD1, NULL); }
/* * Board-specific initialization code. */ void boardInit(void) { /* * LCD pins setup. */ palClearPad(IOPORT2, PIOB_LCD_BL); palSetPadMode(IOPORT2, PIOB_LCD_BL, PAL_MODE_OUTPUT_PUSHPULL); palSetPad(IOPORT1, PIOA_LCD_RESET); palSetPadMode(IOPORT1, PIOA_LCD_RESET, PAL_MODE_OUTPUT_PUSHPULL); /* * Joystick and buttons setup. */ palSetGroupMode(IOPORT1, PIOA_B1_MASK | PIOA_B2_MASK | PIOA_B3_MASK | PIOA_B4_MASK | PIOA_B5_MASK, 0, PAL_MODE_INPUT); palSetGroupMode(IOPORT2, PIOB_SW1_MASK | PIOB_SW2_MASK, 0, PAL_MODE_INPUT); /* * MMC/SD slot setup. */ palSetGroupMode(IOPORT2, PIOB_MMC_WP_MASK | PIOB_MMC_CP_MASK, 0, PAL_MODE_INPUT); /* * PIT Initialization. */ AIC_ConfigureIT(AT91C_ID_SYS, AT91C_AIC_SRCTYPE_HIGH_LEVEL | (AT91C_AIC_PRIOR_HIGHEST - 1), SYSIrqHandler); AIC_EnableIT(AT91C_ID_SYS); AT91C_BASE_PITC->PITC_PIMR = (MCK / 16 / CH_FREQUENCY) - 1; AT91C_BASE_PITC->PITC_PIMR |= AT91C_PITC_PITEN | AT91C_PITC_PITIEN; /* * RTS/CTS pins enabled for USART0 only. */ AT91C_BASE_PIOA->PIO_PDR = AT91C_PA3_RTS0 | AT91C_PA4_CTS0; AT91C_BASE_PIOA->PIO_ASR = AT91C_PIO_PA3 | AT91C_PIO_PA4; AT91C_BASE_PIOA->PIO_PPUDR = AT91C_PIO_PA3 | AT91C_PIO_PA4; }
void analog_init(void) { /* * Initializes the ADC driver 1. */ adcStart(&ADCD1, NULL); palSetGroupMode(GPIOA, PAL_PORT_BIT(0), 0, PAL_MODE_INPUT_ANALOG); }
/* * Application entry point. */ int main(void) { /* * System initializations. * - HAL initialization, this also initializes the configured device drivers * and performs the board-specific initializations. * - Kernel initialization, the main() function becomes a thread and the * RTOS is active. */ halInit(); chSysInit(); /* * Activates the serial driver 1 using the driver default configuration. */ palSetPadMode(IOPORT2, 0, PAL_MODE_OUTPUT_PUSHPULL); sdStart(&SD1, NULL); #define ADC_GRP1_NUM_CHANNELS 3 #define ADC_GRP1_BUF_DEPTH 10 DDRD |= _BV(DDD5); static adcsample_t samples[ADC_GRP1_NUM_CHANNELS * ADC_GRP1_BUF_DEPTH]; static const ADCConversionGroup adcgrpcfg = { FALSE, ADC_GRP1_NUM_CHANNELS, NULL, 0b00000111 /* enabled channels */ }; ADCConfig adccfg = { ANALOG_REFERENCE_AVCC /* use the AVCC pin as the ADC reference voltage */ }; adcStart(&ADCD1, &adccfg); palSetGroupMode(IOPORTADC, 0b00000111, 0, PAL_MODE_INPUT_PULLUP); while(TRUE) { int i; adcConvert(&ADCD1, &adcgrpcfg, samples, ADC_GRP1_BUF_DEPTH); chprintf((BaseSequentialStream *) &SD1,"Result:\r\n"); for(i=0; i < (ADC_GRP1_BUF_DEPTH * ADC_GRP1_NUM_CHANNELS); i++) { if((i % ADC_GRP1_NUM_CHANNELS) == 0) chprintf((BaseSequentialStream *) &SD1,"\r\n"); chprintf((BaseSequentialStream *) &SD1," %d", samples[i]); } chprintf((BaseSequentialStream *) &SD1,"\r\n"); chThdSleepMilliseconds(500); palTogglePad(IOPORT2, PORTB_LED1); } }
void i2c_init(void) { palSetGroupMode(GPIOB, GPIOB_PIN6 | GPIOB_PIN7, 0, PAL_MODE_INPUT); // Try releasing special pins for a short time chThdSleepMilliseconds(10); palSetPadMode(GPIOB, 6, PAL_MODE_ALTERNATE(4) | PAL_STM32_OTYPE_OPENDRAIN | PAL_STM32_PUPDR_PULLUP); palSetPadMode(GPIOB, 7, PAL_MODE_ALTERNATE(4) | PAL_STM32_OTYPE_OPENDRAIN | PAL_STM32_PUPDR_PULLUP); //i2cInit(); //This is invoked by halInit() so no need to redo it. }
/* * Application entry point. */ int main(void) { /* * System initializations. * - HAL initialization, this also initializes the configured device drivers * and performs the board-specific initializations. * - Kernel initialization, the main() function becomes a thread and the * RTOS is active. */ halInit(); chSysInit(); /* * Setting up analog inputs used by the demo. */ palSetGroupMode(GPIOC, PAL_PORT_BIT(1) | PAL_PORT_BIT(2), 0, PAL_MODE_INPUT_ANALOG); /* * Creates the blinker thread. */ chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); /* * Activates the ADC1 driver and the temperature sensor. */ adcStart(&ADCD1, NULL); adcSTM32EnableTS(&ADCD1); adcSTM32EnableVBAT(&ADCD1); /* * Linear conversion. */ adcConvert(&ADCD1, &adcgrpcfg1, samples1, ADC_GRP1_BUF_DEPTH); chThdSleepMilliseconds(1000); /* * Starts an ADC continuous conversion. */ adcStartConversion(&ADCD1, &adcgrpcfg2, samples2, ADC_GRP2_BUF_DEPTH); /* * Normal main() thread activity, in this demo it does nothing. */ while (true) { if (palReadPad(GPIOA, GPIOA_BUTTON)) { adcStopConversion(&ADCD1); } chThdSleepMilliseconds(500); } }
/* * Board-specific initialization code. */ void boardInit (void) { /* * LED pins setup. */ palSetPad(IOPORT2, PIOB_LED2); palSetPadMode(IOPORT2, PIOB_LED2, PAL_MODE_OUTPUT_PUSHPULL); palSetPad(IOPORT2, PIOB_LED3); palSetPadMode(IOPORT2, PIOB_LED3, PAL_MODE_OUTPUT_PUSHPULL); palClearPad(IOPORT2, PIOB_LED4); palSetPadMode(IOPORT2, PIOB_LED4, PAL_MODE_OUTPUT_PUSHPULL); /* * Buttons setup. */ palSetGroupMode(IOPORT1, PIOA_SW1_MASK | PIOA_SW2_MASK, PAL_MODE_INPUT_PULLUP); }
void BoardDriverStart(void) { spiStart(&SPID1, &SPI1cfg); MFRC522Start(&RFID1, &RFID1_cfg); ws2811Start(&ws2811, &ws2811_cfg); palSetGroupMode(GPIOA, 0b00000010, 0, PAL_MODE_OUTPUT_PUSHPULL|PAL_STM32_OSPEED_HIGHEST|PAL_STM32_PUDR_FLOATING); /* * Initializes a serial-over-USB CDC driver. */ sduStart(&SDU1, &serusbcfg); /* * Activates the USB driver and then the USB bus pull-up on D+. * Note, a delay is inserted in order to not have to disconnect the cable * after a reset. */ usbDisconnectBus(serusbcfg.usbp); chThdSleepMilliseconds(1000); usbStart(serusbcfg.usbp, &usbcfg); usbConnectBus(serusbcfg.usbp); }
inline static void dataOut(void) { palSetPad(GPIOA, GPIOA_LCD_RD); palClearPad(GPIOA, GPIOA_LCD_WR); palSetGroupMode(GPIOB, 0xFFFF, 0, PAL_MODE_OUTPUT_PUSHPULL); }
inline static void dataIn(void) { palSetPad(GPIOA, GPIOA_LCD_WR); palClearPad(GPIOA, GPIOA_LCD_RD); palSetGroupMode(GPIOB, 0xFFFF, 0, PAL_MODE_INPUT_PULLUP); }
/** * @brief Initialise the port. * * @param[in] ptc A pointer to one of the entries in GInputToggleConfigTable * * @notapi */ void ginput_lld_toggle_init(const GToggleConfig *ptc) { palSetGroupMode(((IOBus *)ptc->id)->portid, ptc->mask, 0, ptc->mode); }
/* * Application entry point. */ int main(void) { /* * System initializations. * - HAL initialization, this also initializes the configured device drivers * and performs the board-specific initializations. * - Kernel initialization, the main() function becomes a thread and the * RTOS is active. */ halInit(); chSysInit(); /* * Activates the serial driver 1 using the driver default configuration. */ sdStart(&SD1, NULL); /* * If the user button is pressed after the reset then the test suite is * executed immediately before activating the various device drivers in * order to not alter the benchmark scores. */ if (palReadPad(GPIOA, GPIOA_BUTTON)) TestThread(&SD1); /* * Initializes the SPI driver 1. */ spiStart(&SPID1, &spicfg); /* * Initializes the ADC driver 1. * The pin PC0 on the port GPIOC is programmed as analog input. */ adcStart(&ADCD1, NULL); palSetGroupMode(GPIOC, PAL_PORT_BIT(0), 0, PAL_MODE_INPUT_ANALOG); /* * Initializes the PWM driver 3, re-routes the TIM3 outputs, programs the * pins as alternate functions. * Note, the AFIO access routes the TIM3 output pins on the PC6...PC9 * where the LEDs are connected. */ pwmStart(&PWMD3, &pwmcfg); AFIO->MAPR |= AFIO_MAPR_TIM3_REMAP_0 | AFIO_MAPR_TIM3_REMAP_1; palSetGroupMode(GPIOC, PAL_PORT_BIT(GPIOC_LED3) | PAL_PORT_BIT(GPIOC_LED4), 0, PAL_MODE_STM32_ALTERNATE_PUSHPULL); /* * Creates the example thread. */ chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); /* * Normal main() thread activity, in this demo it does nothing except * sleeping in a loop and check the button state, when the button is * pressed the test procedure is launched with output on the serial * driver 1. */ while (TRUE) { if (palReadPad(GPIOA, GPIOA_BUTTON)) TestThread(&SD1); chThdSleepMilliseconds(500); } }
/** * @brief low level spi initialization * @param none * @return none */ void low_level_init(void) { palSetGroupMode(GPIOA,0b11111 , 8,PAL_MODE_OUTPUT_PUSHPULL); }
void myADCinit(void){ palSetGroupMode(GPIOC, PAL_PORT_BIT(1), 0, PAL_MODE_INPUT_ANALOG); adcStart(&ADCD1, NULL); //enable temperature sensor and Vref adcSTM32EnableTSVREFE(); }