diff --git a/demos/WB32/RT-WB32FQ95-GENERIC/main.c b/demos/WB32/RT-WB32FQ95-GENERIC/main.c index 2cfad0c9..9b9129a3 100644 --- a/demos/WB32/RT-WB32FQ95-GENERIC/main.c +++ b/demos/WB32/RT-WB32FQ95-GENERIC/main.c @@ -1,5 +1,5 @@ /* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio + Copyright (C) 2022 Westberry Technology (ChangZhou) Corp., Ltd Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -16,100 +16,71 @@ #include "ch.h" #include "hal.h" +#include "board.h" -#define ADC_GRP1_NUM_CHANNELS 1 -#define ADC_GRP1_BUF_DEPTH 8 +/*===========================================================================*/ +/* Private variables. */ +/*===========================================================================*/ +/*===========================================================================*/ +/* Generic code. */ +/*===========================================================================*/ -#define GPIOA_BUTTON 0 -#define GPIOC_LED 12 +#define PORTAB_LINE_LED1 PAL_LINE(GPIOB, 14U) +#define PORTAB_LINE_LED2 PAL_LINE(GPIOB, 13U) +#define PORTAB_LED_OFF PAL_HIGH +#define PORTAB_LED_ON AL_LOW -#define ADC_GRP2_NUM_CHANNELS 8 -#define ADC_GRP2_BUF_DEPTH 16 - -static adcsample_t samples1[ADC_GRP1_NUM_CHANNELS * ADC_GRP1_BUF_DEPTH]; -static adcsample_t samples2[ADC_GRP2_NUM_CHANNELS * ADC_GRP2_BUF_DEPTH]; +#define PORTAB_LINE_BUTTON PAL_LINE(GPIOA, 0U) +#define PORTAB_BUTTON_PRESSED PAL_LOW +#if defined(PORTAB_LINE_LED2) /* - * ADC streaming callback. - */ -size_t nx = 0, ny = 0; -static void adccallback(ADCDriver *adcp) { - - if (adcIsBufferComplete(adcp)) { - nx += 1; - } - else { - ny += 1; - } -} - -static void adcerrorcallback(ADCDriver *adcp, adcerror_t err) { - - (void)adcp; - (void)err; -} - -/* - * ADC conversion group. - * Mode: Linear buffer, 8 samples of 1 channel, SW triggered. - * Channels: IN10. - */ -static const ADCConversionGroup adcgrpcfg1 = { - FALSE, - ADC_GRP1_NUM_CHANNELS, - NULL, - adcerrorcallback, - 0, 0, /* CR1, CR2 */ - ADC_SMPR1_SMP_AN10(ADC_SAMPLE_1P5), - 0, /* SMPR2 */ - ADC_SQR1_NUM_CH(ADC_GRP1_NUM_CHANNELS), - 0, /* SQR2 */ - ADC_SQR3_SQ1_N(ADC_CHANNEL_IN3) -}; - -/* - * ADC conversion group. - * Mode: Continuous, 16 samples of 8 channels, SW triggered. - * Channels: IN10, IN11, IN10, IN11, IN10, IN11, Sensor, VRef. - */ -static const ADCConversionGroup adcgrpcfg2 = { - TRUE, - ADC_GRP2_NUM_CHANNELS, - adccallback, - adcerrorcallback, - 0, ADC_CR2_TSVREFE, /* CR1, CR2 */ - ADC_SMPR1_SMP_AN11(ADC_SAMPLE_41P5) | ADC_SMPR1_SMP_AN10(ADC_SAMPLE_41P5) | - ADC_SMPR1_SMP_SENSOR(ADC_SAMPLE_239P5) | ADC_SMPR1_SMP_VREF(ADC_SAMPLE_239P5), - 0, /* SMPR2 */ - ADC_SQR1_NUM_CH(ADC_GRP2_NUM_CHANNELS), - ADC_SQR2_SQ8_N(ADC_CHANNEL_SENSOR) | ADC_SQR2_SQ7_N(ADC_CHANNEL_VREFINT), - ADC_SQR3_SQ6_N(ADC_CHANNEL_IN11) | ADC_SQR3_SQ5_N(ADC_CHANNEL_IN10) | - ADC_SQR3_SQ4_N(ADC_CHANNEL_IN11) | ADC_SQR3_SQ3_N(ADC_CHANNEL_IN10) | - ADC_SQR3_SQ2_N(ADC_CHANNEL_IN11) | ADC_SQR3_SQ1_N(ADC_CHANNEL_IN10) -}; - -/* - * Red LEDs blinker thread, times are in milliseconds. + * LED blinker thread, times are in milliseconds. */ static THD_WORKING_AREA(waThread1, 128); -static THD_FUNCTION(Thread1, arg) { - +static THD_FUNCTION(Thread1, arg) +{ (void)arg; - chRegSetThreadName("blinker"); - while (true) { - palClearPad(IOPORT3, GPIOC_LED); - chThdSleepMilliseconds(500); - palSetPad(IOPORT3, GPIOC_LED); - chThdSleepMilliseconds(500); + while (true) + { + systime_t time = palReadLine(PORTAB_LINE_BUTTON) == PORTAB_BUTTON_PRESSED ? 250 : 500; + palToggleLine(PORTAB_LINE_LED2); + chThdSleepMilliseconds(time); } } +#endif + +#if PAL_USE_WAIT || defined(__DOXYGEN__) + +/** + * @brief Configure PORTAB_LINE_BUTTON in interrupt mode + * @param None + * @return None + */ +void EXTI0_Config(void) +{ + /* + * Init button port and pad. + */ + palSetPadMode(PAL_PORT(PORTAB_LINE_BUTTON), PAL_PAD(PORTAB_LINE_BUTTON), PAL_WB32_MODE_INPUT | PAL_WB32_PUPDR_PULLDOWN); + + /* + * Enabling events on both edges of the button line. + */ + palEnableLineEvent(PORTAB_LINE_BUTTON, PAL_EVENT_MODE_RISING_EDGE); + + /* + * Configure the interrupt priority. + */ + nvicEnableVector(EXTI0_IRQn, WB32_IRQ_EXTI0_PRIORITY); +} /* * Application entry point. */ -int main(void) { - +int main(void) +{ /* * System initializations. * - HAL initialization, this also initializes the configured device drivers @@ -119,41 +90,35 @@ int main(void) { */ halInit(); chSysInit(); - - /* - * Setting up analog inputs used by the demo. + + /* + * Init LED port and pad. */ - palSetGroupMode(GPIOA, PAL_PORT_BIT(3) | PAL_PORT_BIT(1), - 0, PAL_MODE_INPUT_ANALOG); + palSetPadMode(PAL_PORT(PORTAB_LINE_LED1), PAL_PAD(PORTAB_LINE_LED1), PAL_WB32_MODE_OUTPUT | PAL_WB32_OTYPE_PUSHPULL); + palSetPadMode(PAL_PORT(PORTAB_LINE_LED2), PAL_PAD(PORTAB_LINE_LED2), PAL_WB32_MODE_OUTPUT | PAL_WB32_OTYPE_PUSHPULL); + + /* + * Configure PA0 in interrupt mode + */ + EXTI0_Config(); +#if defined(PORTAB_LINE_LED2) /* * Creates the blinker thread. */ chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); +#endif /* - * Activates the ADC1 driver and the temperature sensor. + * Normal main() thread activity. */ - adcStart(&ADCD1, NULL); - - /* - * 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); + while (true) + { + /* Waiting for an edge on the button.*/ + palWaitLineTimeout(PORTAB_LINE_BUTTON, TIME_INFINITE); + + palToggleLine(PORTAB_LINE_LED1); } - return 0; } + +#endif /* PAL_USE_WAIT */