Serial Driver on USART2 TX not working

ChibiOS public support forum for topics related to the STMicroelectronics STM32 family of micro-controllers.

Moderator: RoccoMarco

Post Reply
jayalfredprufrock
Posts: 36
Joined: Tue Jan 13, 2015 6:33 am
Has thanked: 8 times

Serial Driver on USART2 TX not working

Post by jayalfredprufrock »

I recently rewrote a portion of code to use the Serial Driver (SD2) instead of the USART driver to avoid a DMA conflict. Using a logic analyzer I discovered that while RX works, the TX line is completely silent. I then tried SD6 instead, and both RX and TX work just fine. I know the pin configuration for USART2 is correct since I successfully used the USART driver on that port. I realize that USART6 and USART2 are clocked from different sources, so I made sure that both were running at the same speed. I've got all the debug options turned on but no errors are generated. Furthermore, I set up a thread to catch serial events while my main thread writes to SD2 and I successfully catch the CHN_OUTPUT_EMPTY followed by CHN_TRANSMISSION_END despite no data actually showing up on TX.

I'm using ChibiOS 3 pulled from master a few days ago, and my board is a STM32F411RE Nucleo. I'll post the relevant code below, but let me know if there is anything else I should provide.

main.c

Code: Select all

static THD_WORKING_AREA(bleSerialEventThreadWA, 256);
static msg_t bleSerialEventThread(void* arg);

int main(void) {

  halInit();
  chSysInit();

    chThdCreateStatic(bleSerialEventThreadWA, sizeof(bleSerialEventThreadWA), NORMALPRIO, bleSerialEventThread, NULL);

   //sdStart(&SD6, NULL);
   //palSetPadMode(GPIOA, 11, PAL_MODE_ALTERNATE(8));
   //palSetPadMode(GPIOA, 12, PAL_MODE_ALTERNATE(8));

   sdStart(&SD2,  NULL);
   palSetPadMode(GPIOA, 2 , PAL_MODE_ALTERNATE(7));
   palSetPadMode(GPIOA, 3 , PAL_MODE_ALTERNATE(7));

  while (TRUE)
  {
     chThdSleepMilliseconds(500);
     sdPut(&SD2, 'A');
         //sdPut(&SD6, 'A');
  }
}

static msg_t bleSerialEventThread(void* arg)
{
   (void)arg;

   event_listener_t listener;
   eventflags_t flags;

   chEvtRegisterMask((event_source_t *)chnGetEventSource(&SD2), &listener, EVENT_MASK(1));

   for (;;)
   {
       chEvtWaitOne(EVENT_MASK(1));

       chSysLock();
       flags = chEvtGetAndClearFlagsI(&listener);
       chSysUnlock();
   }

   return MSG_OK;
}


mcuconf.c

Code: Select all

/*
 * STM32F4xx drivers configuration.
 * The following settings override the default settings present in
 * the various device driver implementation headers.
 * Note that the settings for each driver only have effect if the whole
 * driver is enabled in halconf.h.
 *
 * IRQ priorities:
 * 15...0       Lowest...Highest.
 *
 * DMA priorities:
 * 0...3        Lowest...Highest.
 */


#define STM32F4xx_MCUCONF

/*
 * HAL driver system settings.
 */
#define STM32_NO_INIT                       FALSE
#define STM32_HSI_ENABLED                   TRUE
#define STM32_LSI_ENABLED                   TRUE
#define STM32_HSE_ENABLED                   FALSE
#define STM32_LSE_ENABLED                   FALSE
#define STM32_CLOCK48_REQUIRED              TRUE
#define STM32_SW                            STM32_SW_PLL
#define STM32_PLLSRC                        STM32_PLLSRC_HSI
#define STM32_PLLM_VALUE                    16
#define STM32_PLLN_VALUE                    384
#define STM32_PLLP_VALUE                    4
#define STM32_PLLQ_VALUE                    8
#define STM32_HPRE                          STM32_HPRE_DIV1
#define STM32_PPRE1                         STM32_PPRE1_DIV4
#define STM32_PPRE2                         STM32_PPRE2_DIV4
#define STM32_RTCSEL                        STM32_RTCSEL_LSI
#define STM32_RTCPRE_VALUE                  8
#define STM32_MCO1SEL                       STM32_MCO1SEL_HSI
#define STM32_MCO1PRE                       STM32_MCO1PRE_DIV1
#define STM32_MCO2SEL                       STM32_MCO2SEL_SYSCLK
#define STM32_MCO2PRE                       STM32_MCO2PRE_DIV5
#define STM32_I2SSRC                        STM32_I2SSRC_CKIN
#define STM32_PLLI2SN_VALUE                 192
#define STM32_PLLI2SR_VALUE                 5
#define STM32_PVD_ENABLE                    FALSE
#define STM32_PLS                           STM32_PLS_LEV0
#define STM32_BKPRAM_ENABLE                 FALSE

/*
 * ADC driver system settings.
 */
#define STM32_ADC_ADCPRE                    ADC_CCR_ADCPRE_DIV4   
#define STM32_ADC_USE_ADC1                  TRUE
#define STM32_ADC_ADC1_DMA_STREAM           STM32_DMA_STREAM_ID(2, 4)
#define STM32_ADC_ADC1_DMA_PRIORITY         2
#define STM32_ADC_IRQ_PRIORITY              6
#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY     6

/*
 * EXT driver system settings.
 */
#define STM32_EXT_EXTI0_IRQ_PRIORITY        6
#define STM32_EXT_EXTI1_IRQ_PRIORITY        6
#define STM32_EXT_EXTI2_IRQ_PRIORITY        6
#define STM32_EXT_EXTI3_IRQ_PRIORITY        6
#define STM32_EXT_EXTI4_IRQ_PRIORITY        6
#define STM32_EXT_EXTI5_9_IRQ_PRIORITY      6
#define STM32_EXT_EXTI10_15_IRQ_PRIORITY    6
#define STM32_EXT_EXTI16_IRQ_PRIORITY       6
#define STM32_EXT_EXTI17_IRQ_PRIORITY       15
#define STM32_EXT_EXTI18_IRQ_PRIORITY       6
#define STM32_EXT_EXTI19_IRQ_PRIORITY       6
#define STM32_EXT_EXTI22_IRQ_PRIORITY       15

/*
 * GPT driver system settings.
 */
#define STM32_GPT_USE_TIM1                  FALSE
#define STM32_GPT_USE_TIM2                  FALSE
#define STM32_GPT_USE_TIM3                  FALSE
#define STM32_GPT_USE_TIM4                  FALSE
#define STM32_GPT_USE_TIM5                  FALSE
#define STM32_GPT_USE_TIM9                  FALSE
#define STM32_GPT_USE_TIM11                 FALSE
#define STM32_GPT_TIM1_IRQ_PRIORITY         7
#define STM32_GPT_TIM2_IRQ_PRIORITY         7
#define STM32_GPT_TIM3_IRQ_PRIORITY         7
#define STM32_GPT_TIM4_IRQ_PRIORITY         7
#define STM32_GPT_TIM5_IRQ_PRIORITY         7
#define STM32_GPT_TIM9_IRQ_PRIORITY         7
#define STM32_GPT_TIM11_IRQ_PRIORITY        7

/*
 * I2C driver system settings.
 */
#define STM32_I2C_USE_I2C1                  FALSE
#define STM32_I2C_USE_I2C2                  TRUE
#define STM32_I2C_USE_I2C3                  TRUE
#define STM32_I2C_BUSY_TIMEOUT              50
#define STM32_I2C_I2C1_RX_DMA_STREAM        STM32_DMA_STREAM_ID(1, 0)
#define STM32_I2C_I2C1_TX_DMA_STREAM        STM32_DMA_STREAM_ID(1, 6)
#define STM32_I2C_I2C2_RX_DMA_STREAM        STM32_DMA_STREAM_ID(1, 3)
#define STM32_I2C_I2C2_TX_DMA_STREAM        STM32_DMA_STREAM_ID(1, 7)
#define STM32_I2C_I2C3_RX_DMA_STREAM        STM32_DMA_STREAM_ID(1, 2)
#define STM32_I2C_I2C3_TX_DMA_STREAM        STM32_DMA_STREAM_ID(1, 4)
#define STM32_I2C_I2C1_IRQ_PRIORITY         5
#define STM32_I2C_I2C2_IRQ_PRIORITY         5
#define STM32_I2C_I2C3_IRQ_PRIORITY         5
#define STM32_I2C_I2C1_DMA_PRIORITY         3
#define STM32_I2C_I2C2_DMA_PRIORITY         3
#define STM32_I2C_I2C3_DMA_PRIORITY         3
#define STM32_I2C_DMA_ERROR_HOOK(i2cp)      osalSysHalt("DMA failure")

/*
 * ICU driver system settings.
 */
#define STM32_ICU_USE_TIM1                  FALSE
#define STM32_ICU_USE_TIM2                  FALSE
#define STM32_ICU_USE_TIM3                  FALSE
#define STM32_ICU_USE_TIM4                  FALSE
#define STM32_ICU_USE_TIM5                  FALSE
#define STM32_ICU_USE_TIM9                  FALSE
#define STM32_ICU_TIM1_IRQ_PRIORITY         7
#define STM32_ICU_TIM2_IRQ_PRIORITY         7
#define STM32_ICU_TIM3_IRQ_PRIORITY         7
#define STM32_ICU_TIM4_IRQ_PRIORITY         7
#define STM32_ICU_TIM5_IRQ_PRIORITY         7
#define STM32_ICU_TIM9_IRQ_PRIORITY         7

/*
 * PWM driver system settings.
 */
#define STM32_PWM_USE_ADVANCED              FALSE
#define STM32_PWM_USE_TIM1                  FALSE
#define STM32_PWM_USE_TIM2                  FALSE
#define STM32_PWM_USE_TIM3                  TRUE
#define STM32_PWM_USE_TIM4                  FALSE
#define STM32_PWM_USE_TIM5                  FALSE
#define STM32_PWM_USE_TIM9                  FALSE
#define STM32_PWM_TIM1_IRQ_PRIORITY         7
#define STM32_PWM_TIM2_IRQ_PRIORITY         7
#define STM32_PWM_TIM3_IRQ_PRIORITY         7
#define STM32_PWM_TIM4_IRQ_PRIORITY         7
#define STM32_PWM_TIM5_IRQ_PRIORITY         7
#define STM32_PWM_TIM9_IRQ_PRIORITY         7

/*
 * SDC driver system settings.
 */
#define STM32_SDC_SDIO_DMA_PRIORITY         3
#define STM32_SDC_SDIO_IRQ_PRIORITY         9
#define STM32_SDC_WRITE_TIMEOUT_MS          250
#define STM32_SDC_READ_TIMEOUT_MS           25
#define STM32_SDC_CLOCK_ACTIVATION_DELAY    10
#define STM32_SDC_SDIO_UNALIGNED_SUPPORT    TRUE
#define STM32_SDC_SDIO_DMA_STREAM           STM32_DMA_STREAM_ID(2, 3)

/*
 * SERIAL driver system settings.
 */
#define STM32_SERIAL_USE_USART1             FALSE
#define STM32_SERIAL_USE_USART2             TRUE
#define STM32_SERIAL_USE_USART6             TRUE
#define STM32_SERIAL_USART1_PRIORITY        12
#define STM32_SERIAL_USART2_PRIORITY        12
#define STM32_SERIAL_USART6_PRIORITY        12

/*
 * SPI driver system settings.
 */
#define STM32_SPI_USE_SPI1                  FALSE
#define STM32_SPI_USE_SPI2                  FALSE
#define STM32_SPI_USE_SPI3                  FALSE
#define STM32_SPI_SPI1_RX_DMA_STREAM        STM32_DMA_STREAM_ID(2, 0)
#define STM32_SPI_SPI1_TX_DMA_STREAM        STM32_DMA_STREAM_ID(2, 3)
#define STM32_SPI_SPI2_RX_DMA_STREAM        STM32_DMA_STREAM_ID(1, 3)
#define STM32_SPI_SPI2_TX_DMA_STREAM        STM32_DMA_STREAM_ID(1, 4)
#define STM32_SPI_SPI3_RX_DMA_STREAM        STM32_DMA_STREAM_ID(1, 0)
#define STM32_SPI_SPI3_TX_DMA_STREAM        STM32_DMA_STREAM_ID(1, 7)
#define STM32_SPI_SPI1_DMA_PRIORITY         1
#define STM32_SPI_SPI2_DMA_PRIORITY         1
#define STM32_SPI_SPI3_DMA_PRIORITY         1
#define STM32_SPI_SPI1_IRQ_PRIORITY         10
#define STM32_SPI_SPI2_IRQ_PRIORITY         10
#define STM32_SPI_SPI3_IRQ_PRIORITY         10
#define STM32_SPI_DMA_ERROR_HOOK(spip)      osalSysHalt("DMA failure")

/*
 * ST driver system settings.
 */
#define STM32_ST_IRQ_PRIORITY               8
#define STM32_ST_USE_TIMER                  2

/*
 * UART driver system settings.
 */
#define STM32_UART_USE_USART1               TRUE
#define STM32_UART_USE_USART2               FALSE
#define STM32_UART_USE_USART6               FALSE
#define STM32_UART_USART1_RX_DMA_STREAM     STM32_DMA_STREAM_ID(2, 5)
#define STM32_UART_USART1_TX_DMA_STREAM     STM32_DMA_STREAM_ID(2, 7)
#define STM32_UART_USART2_RX_DMA_STREAM     STM32_DMA_STREAM_ID(1, 5)
#define STM32_UART_USART2_TX_DMA_STREAM     STM32_DMA_STREAM_ID(1, 6)
#define STM32_UART_USART6_RX_DMA_STREAM     STM32_DMA_STREAM_ID(2, 2)
#define STM32_UART_USART6_TX_DMA_STREAM     STM32_DMA_STREAM_ID(2, 6)
#define STM32_UART_USART1_IRQ_PRIORITY      12
#define STM32_UART_USART2_IRQ_PRIORITY      12
#define STM32_UART_USART6_IRQ_PRIORITY      12
#define STM32_UART_USART1_DMA_PRIORITY      0
#define STM32_UART_USART2_DMA_PRIORITY      0
#define STM32_UART_USART6_DMA_PRIORITY      0
#define STM32_UART_DMA_ERROR_HOOK(uartp)    osalSysHalt("DMA failure")

/*
 * USB driver system settings.
 */
#define STM32_USB_USE_OTG1                  TRUE
#define STM32_USB_OTG1_IRQ_PRIORITY         14
#define STM32_USB_OTG1_RX_FIFO_SIZE         512
#define STM32_USB_OTG_THREAD_PRIO           LOWPRIO
#define STM32_USB_OTG_THREAD_STACK_SIZE     128
#define STM32_USB_OTGFIFO_FILL_BASEPRI      0

User avatar
Giovanni
Site Admin
Posts: 14892
Joined: Wed May 27, 2009 8:48 am
Has thanked: 1202 times
Been thanked: 996 times

Re: Serial Driver on USART2 TX not working

Post by Giovanni »

SD2 is used in a lot of demos, check the I/O settings, make sure that the alternate mode is used on a single pin (a common error is to set it into the main() but it is also in board.h).

Giovanni
jayalfredprufrock
Posts: 36
Joined: Tue Jan 13, 2015 6:33 am
Has thanked: 8 times

Re: Serial Driver on USART2 TX not working

Post by jayalfredprufrock »

I'm pretty sure it's not pin settings, as I used the same board.h file with the USART2 driver with no issues. I use the board.h file to name all of my pins and specify input or output, but alternate functions and other pin settings I set in initialization functions in my code.

board.h (with ports E-I removed)

Code: Select all

/*
 * Board oscillators-related settings.
 */
#if !defined(STM32_LSECLK)
#define STM32_LSECLK                0
#endif

#if !defined(STM32_HSECLK)
#define STM32_HSECLK                0
#endif

/*
 * Board voltages.
 * Required for performance limits calculation.
 */
#define STM32_VDD                   330

/*
 * MCU type as defined in the ST header.
 */
#define STM32F411xE

/*
 * IO pins assignments.
 */
#define GPIOA_BLE_USART2_CTS        0
#define GPIOA_BLE_USART2_RTS        1
#define GPIOA_BLE_USART2_TX         2
#define GPIOA_BLE_USART2_RX         3
#define GPIOA_PIN4                  4
#define GPIOA_BS_CS_OUTPUT          5
#define GPIOA_PIN6                  6
#define GPIOA_PIN7                  7
#define GPIOA_LED_I2C3_SCL          8
#define GPIOA_USBG_VBUS             9
#define GPIOA_USBG_ID               10
#define GPIOA_USBG_DM               11
#define GPIOA_USBG_DP               12
#define GPIOA_DBG_SWDIO             13
#define GPIOA_DBG_SWCLK             14
#define GPIOA_PIN15                 15

#define GPIOB_BUZZ_TIMER3_CH3       0
#define GPIOB_MS_FS_OUTPUT          1
#define GPIOB_BOOT1                 2
#define GPIOB_DBG_SWO               3
#define GPIOB_PIN4                  4
#define GPIOB_PIN5                  5
#define GPIOB_BS_USART1_TX          6
#define GPIOB_BS_USART1_RX          7
#define GPIOB_LED_I2C3_SDA          8
#define GPIOB_MS_I2C2_SDA           9
#define GPIOB_MS_I2C2_SCL           10
#define GPIOB_PIN11                 11
#define GPIOB_PIN12                 12
#define GPIOB_BS_NRESET_OUTPUT      13
#define GPIOB_BATT_FULLCHARGE_INPUT 14
#define GPIOB_LED_ENABLE_OUTPUT     15

#define GPIOC_BLE_WAKEUP_OUTPUT     0
#define GPIOC_BOARD_POWER_OUTPUT    1
#define GPIOC_BLE_NRESET_OUTPUT     2
#define GPIOC_BS_POWER_OUTPUT       3
#define GPIOC_BLE_NPOWER_OUTPUT     4
#define GPIOC_MS_INT_INPUT          5
#define GPIOC_PIN6                  6
#define GPIOC_PIN7                  7
#define GPIOC_SDCARD_D0             8
#define GPIOC_SDCARD_D1             9
#define GPIOC_SDCARD_D2             10
#define GPIOC_SDCARD_D3             11
#define GPIOC_SDCARD_CLK            12
#define GPIOC_NBTN_INPUT            13
#define GPIOC_OSC32_IN              14
#define GPIOC_OSC32_OUT             15

#define GPIOD_PIN0                  0
#define GPIOD_PIN1                  1
#define GPIOD_SDCARD_CMD            2
#define GPIOD_PIN3                  3
#define GPIOD_PIN4                  4
#define GPIOD_PIN5                  5
#define GPIOD_PIN6                  6
#define GPIOD_PIN7                  7
#define GPIOD_PIN8                  8
#define GPIOD_PIN9                  9
#define GPIOD_PIN10                 10
#define GPIOD_PIN11                 11
#define GPIOD_PIN12                 12
#define GPIOD_PIN13                 13
#define GPIOD_PIN14                 14
#define GPIOD_PIN15                 15

/*
 * I/O ports initial setup, this configuration is established soon after reset
 * in the initialization code.
 * Please refer to the STM32 Reference Manual for details.
 */
#define PIN_MODE_INPUT(n)           (0U << ((n) * 2))
#define PIN_MODE_OUTPUT(n)          (1U << ((n) * 2))
#define PIN_MODE_ALTERNATE(n)       (2U << ((n) * 2))
#define PIN_MODE_ANALOG(n)          (3U << ((n) * 2))
#define PIN_ODR_LOW(n)              (0U << (n))
#define PIN_ODR_HIGH(n)             (1U << (n))
#define PIN_OTYPE_PUSHPULL(n)       (0U << (n))
#define PIN_OTYPE_OPENDRAIN(n)      (1U << (n))
#define PIN_OSPEED_2M(n)            (0U << ((n) * 2))
#define PIN_OSPEED_25M(n)           (1U << ((n) * 2))
#define PIN_OSPEED_50M(n)           (2U << ((n) * 2))
#define PIN_OSPEED_100M(n)          (3U << ((n) * 2))
#define PIN_PUPDR_FLOATING(n)       (0U << ((n) * 2))
#define PIN_PUPDR_PULLUP(n)         (1U << ((n) * 2))
#define PIN_PUPDR_PULLDOWN(n)       (2U << ((n) * 2))
#define PIN_AFIO_AF(n, v)           ((v##U) << ((n % 8) * 4))

/*
 * GPIOA setup:
 *
 * PA0  - BLE_USART2_CTS            (input pulldown).
 * PA1  - BLE_USART2_RTS            (input pulldown).
 * PA2  - BLE_USART2_TX             (input pulldown).
 * PA3  - BLE_USART2_RX             (input pulldown).
 * PA4  - PIN4                      (input pulldown).
 * PA5  - BS_CS_OUTPUT              (output pushpull high).
 * PA6  - PIN6                      (input pullup).
 * PA7  - PIN7                      (input pulldown).
 * PA8  - LED_I2C3_SCL              (input floating).
 * PA9  - USBG_VBUS                 (input pulldown).
 * PA10 - USBG_ID                   (input pulldown).
 * PA11 - USBG_DM                   (input pulldown).
 * PA12 - USBG_DP                   (input pulldown).
 * PA13 - DBG_SWDIO                 (alternate 0).
 * PA14 - DBG_SWCLK                 (alternate 0).
 * PA15 - PIN15                     (input pulldown).
 */
#define VAL_GPIOA_MODER             (PIN_MODE_INPUT(GPIOA_BLE_USART2_CTS) | \
                                     PIN_MODE_INPUT(GPIOA_BLE_USART2_RTS) | \
                                     PIN_MODE_INPUT(GPIOA_BLE_USART2_TX) |  \
                                     PIN_MODE_INPUT(GPIOA_BLE_USART2_RX) |  \
                                     PIN_MODE_INPUT(GPIOA_PIN4) |           \
                                     PIN_MODE_OUTPUT(GPIOA_BS_CS_OUTPUT) |  \
                                     PIN_MODE_INPUT(GPIOA_PIN6) |           \
                                     PIN_MODE_INPUT(GPIOA_PIN7) |           \
                                     PIN_MODE_INPUT(GPIOA_LED_I2C3_SCL) |   \
                                     PIN_MODE_INPUT(GPIOA_USBG_VBUS) |      \
                                     PIN_MODE_INPUT(GPIOA_USBG_ID) |        \
                                     PIN_MODE_INPUT(GPIOA_USBG_DM) |        \
                                     PIN_MODE_INPUT(GPIOA_USBG_DP) |        \
                                     PIN_MODE_ALTERNATE(GPIOA_DBG_SWDIO) |  \
                                     PIN_MODE_ALTERNATE(GPIOA_DBG_SWCLK) |  \
                                     PIN_MODE_INPUT(GPIOA_PIN15))
#define VAL_GPIOA_OTYPER            (PIN_OTYPE_PUSHPULL(GPIOA_BLE_USART2_CTS) |\
                                     PIN_OTYPE_PUSHPULL(GPIOA_BLE_USART2_RTS) |\
                                     PIN_OTYPE_PUSHPULL(GPIOA_BLE_USART2_TX) |\
                                     PIN_OTYPE_PUSHPULL(GPIOA_BLE_USART2_RX) |\
                                     PIN_OTYPE_PUSHPULL(GPIOA_PIN4) |       \
                                     PIN_OTYPE_PUSHPULL(GPIOA_BS_CS_OUTPUT) |\
                                     PIN_OTYPE_PUSHPULL(GPIOA_PIN6) |       \
                                     PIN_OTYPE_PUSHPULL(GPIOA_PIN7) |       \
                                     PIN_OTYPE_PUSHPULL(GPIOA_LED_I2C3_SCL) |\
                                     PIN_OTYPE_PUSHPULL(GPIOA_USBG_VBUS) |  \
                                     PIN_OTYPE_PUSHPULL(GPIOA_USBG_ID) |    \
                                     PIN_OTYPE_PUSHPULL(GPIOA_USBG_DM) |    \
                                     PIN_OTYPE_PUSHPULL(GPIOA_USBG_DP) |    \
                                     PIN_OTYPE_PUSHPULL(GPIOA_DBG_SWDIO) |  \
                                     PIN_OTYPE_PUSHPULL(GPIOA_DBG_SWCLK) |  \
                                     PIN_OTYPE_PUSHPULL(GPIOA_PIN15))
#define VAL_GPIOA_OSPEEDR           (PIN_OSPEED_100M(GPIOA_BLE_USART2_CTS) |\
                                     PIN_OSPEED_100M(GPIOA_BLE_USART2_RTS) |\
                                     PIN_OSPEED_100M(GPIOA_BLE_USART2_TX) | \
                                     PIN_OSPEED_100M(GPIOA_BLE_USART2_RX) | \
                                     PIN_OSPEED_100M(GPIOA_PIN4) |          \
                                     PIN_OSPEED_50M(GPIOA_BS_CS_OUTPUT) |   \
                                     PIN_OSPEED_100M(GPIOA_PIN6) |          \
                                     PIN_OSPEED_100M(GPIOA_PIN7) |          \
                                     PIN_OSPEED_100M(GPIOA_LED_I2C3_SCL) |  \
                                     PIN_OSPEED_100M(GPIOA_USBG_VBUS) |     \
                                     PIN_OSPEED_100M(GPIOA_USBG_ID) |       \
                                     PIN_OSPEED_100M(GPIOA_USBG_DM) |       \
                                     PIN_OSPEED_100M(GPIOA_USBG_DP) |       \
                                     PIN_OSPEED_100M(GPIOA_DBG_SWDIO) |     \
                                     PIN_OSPEED_100M(GPIOA_DBG_SWCLK) |     \
                                     PIN_OSPEED_100M(GPIOA_PIN15))
#define VAL_GPIOA_PUPDR             (PIN_PUPDR_PULLDOWN(GPIOA_BLE_USART2_CTS) |\
                                     PIN_PUPDR_PULLDOWN(GPIOA_BLE_USART2_RTS) |\
                                     PIN_PUPDR_PULLDOWN(GPIOA_BLE_USART2_TX) |\
                                     PIN_PUPDR_PULLDOWN(GPIOA_BLE_USART2_RX) |\
                                     PIN_PUPDR_PULLDOWN(GPIOA_PIN4) |       \
                                     PIN_PUPDR_FLOATING(GPIOA_BS_CS_OUTPUT) |\
                                     PIN_PUPDR_PULLUP(GPIOA_PIN6) |         \
                                     PIN_PUPDR_PULLDOWN(GPIOA_PIN7) |       \
                                     PIN_PUPDR_FLOATING(GPIOA_LED_I2C3_SCL) |\
                                     PIN_PUPDR_PULLDOWN(GPIOA_USBG_VBUS) |  \
                                     PIN_PUPDR_PULLDOWN(GPIOA_USBG_ID) |    \
                                     PIN_PUPDR_PULLDOWN(GPIOA_USBG_DM) |    \
                                     PIN_PUPDR_PULLDOWN(GPIOA_USBG_DP) |    \
                                     PIN_PUPDR_PULLUP(GPIOA_DBG_SWDIO) |    \
                                     PIN_PUPDR_PULLDOWN(GPIOA_DBG_SWCLK) |  \
                                     PIN_PUPDR_PULLDOWN(GPIOA_PIN15))
#define VAL_GPIOA_ODR               (PIN_ODR_HIGH(GPIOA_BLE_USART2_CTS) |   \
                                     PIN_ODR_HIGH(GPIOA_BLE_USART2_RTS) |   \
                                     PIN_ODR_HIGH(GPIOA_BLE_USART2_TX) |    \
                                     PIN_ODR_HIGH(GPIOA_BLE_USART2_RX) |    \
                                     PIN_ODR_HIGH(GPIOA_PIN4) |             \
                                     PIN_ODR_LOW(GPIOA_BS_CS_OUTPUT) |      \
                                     PIN_ODR_HIGH(GPIOA_PIN6) |             \
                                     PIN_ODR_HIGH(GPIOA_PIN7) |             \
                                     PIN_ODR_HIGH(GPIOA_LED_I2C3_SCL) |     \
                                     PIN_ODR_HIGH(GPIOA_USBG_VBUS) |        \
                                     PIN_ODR_HIGH(GPIOA_USBG_ID) |          \
                                     PIN_ODR_HIGH(GPIOA_USBG_DM) |          \
                                     PIN_ODR_HIGH(GPIOA_USBG_DP) |          \
                                     PIN_ODR_HIGH(GPIOA_DBG_SWDIO) |        \
                                     PIN_ODR_HIGH(GPIOA_DBG_SWCLK) |        \
                                     PIN_ODR_HIGH(GPIOA_PIN15))
#define VAL_GPIOA_AFRL              (PIN_AFIO_AF(GPIOA_BLE_USART2_CTS, 0) | \
                                     PIN_AFIO_AF(GPIOA_BLE_USART2_RTS, 0) | \
                                     PIN_AFIO_AF(GPIOA_BLE_USART2_TX, 0) |  \
                                     PIN_AFIO_AF(GPIOA_BLE_USART2_RX, 0) |  \
                                     PIN_AFIO_AF(GPIOA_PIN4, 0) |           \
                                     PIN_AFIO_AF(GPIOA_BS_CS_OUTPUT, 0) |   \
                                     PIN_AFIO_AF(GPIOA_PIN6, 0) |           \
                                     PIN_AFIO_AF(GPIOA_PIN7, 0))
#define VAL_GPIOA_AFRH              (PIN_AFIO_AF(GPIOA_LED_I2C3_SCL, 0) |   \
                                     PIN_AFIO_AF(GPIOA_USBG_VBUS, 0) |      \
                                     PIN_AFIO_AF(GPIOA_USBG_ID, 0) |        \
                                     PIN_AFIO_AF(GPIOA_USBG_DM, 0) |        \
                                     PIN_AFIO_AF(GPIOA_USBG_DP, 0) |        \
                                     PIN_AFIO_AF(GPIOA_DBG_SWDIO, 0) |      \
                                     PIN_AFIO_AF(GPIOA_DBG_SWCLK, 0) |      \
                                     PIN_AFIO_AF(GPIOA_PIN15, 0))

/*
 * GPIOB setup:
 *
 * PB0  - BUZZ_TIMER3_CH3           (output pushpull maximum).
 * PB1  - MS_FS_OUTPUT              (output pushpull maximum).
 * PB2  - BOOT1                     (input floating).
 * PB3  - DBG_SWO                   (alternate 0).
 * PB4  - PIN4                      (input pulldown).
 * PB5  - PIN5                      (input pulldown).
 * PB6  - BS_USART1_TX              (output pushpull maximum).
 * PB7  - BS_USART1_RX              (input pullup).
 * PB8  - LED_I2C3_SDA              (input floating).
 * PB9  - MS_I2C2_SDA               (input floating).
 * PB10 - MS_I2C2_SCL               (input floating).
 * PB11 - PIN11                     (input pulldown).
 * PB12 - PIN12                     (input pulldown).
 * PB13 - BS_NRESET_OUTPUT          (output pushpull maximum).
 * PB14 - BATT_FULLCHARGE_INPUT     (input floating).
 * PB15 - LED_ENABLE_OUTPUT         (output pushpull maximum).
 */
#define VAL_GPIOB_MODER             (PIN_MODE_OUTPUT(GPIOB_BUZZ_TIMER3_CH3) |\
                                     PIN_MODE_OUTPUT(GPIOB_MS_FS_OUTPUT) |  \
                                     PIN_MODE_INPUT(GPIOB_BOOT1) |          \
                                     PIN_MODE_ALTERNATE(GPIOB_DBG_SWO) |    \
                                     PIN_MODE_INPUT(GPIOB_PIN4) |           \
                                     PIN_MODE_INPUT(GPIOB_PIN5) |           \
                                     PIN_MODE_OUTPUT(GPIOB_BS_USART1_TX) |  \
                                     PIN_MODE_INPUT(GPIOB_BS_USART1_RX) |   \
                                     PIN_MODE_INPUT(GPIOB_LED_I2C3_SDA) |   \
                                     PIN_MODE_INPUT(GPIOB_MS_I2C2_SDA) |    \
                                     PIN_MODE_INPUT(GPIOB_MS_I2C2_SCL) |    \
                                     PIN_MODE_INPUT(GPIOB_PIN11) |          \
                                     PIN_MODE_INPUT(GPIOB_PIN12) |          \
                                     PIN_MODE_OUTPUT(GPIOB_BS_NRESET_OUTPUT) |\
                                     PIN_MODE_INPUT(GPIOB_BATT_FULLCHARGE_INPUT) |\
                                     PIN_MODE_OUTPUT(GPIOB_LED_ENABLE_OUTPUT))
#define VAL_GPIOB_OTYPER            (PIN_OTYPE_PUSHPULL(GPIOB_BUZZ_TIMER3_CH3) |\
                                     PIN_OTYPE_PUSHPULL(GPIOB_MS_FS_OUTPUT) |\
                                     PIN_OTYPE_PUSHPULL(GPIOB_BOOT1) |      \
                                     PIN_OTYPE_PUSHPULL(GPIOB_DBG_SWO) |    \
                                     PIN_OTYPE_PUSHPULL(GPIOB_PIN4) |       \
                                     PIN_OTYPE_PUSHPULL(GPIOB_PIN5) |       \
                                     PIN_OTYPE_PUSHPULL(GPIOB_BS_USART1_TX) |\
                                     PIN_OTYPE_PUSHPULL(GPIOB_BS_USART1_RX) |\
                                     PIN_OTYPE_PUSHPULL(GPIOB_LED_I2C3_SDA) |\
                                     PIN_OTYPE_PUSHPULL(GPIOB_MS_I2C2_SDA) |\
                                     PIN_OTYPE_PUSHPULL(GPIOB_MS_I2C2_SCL) |\
                                     PIN_OTYPE_PUSHPULL(GPIOB_PIN11) |      \
                                     PIN_OTYPE_PUSHPULL(GPIOB_PIN12) |      \
                                     PIN_OTYPE_PUSHPULL(GPIOB_BS_NRESET_OUTPUT) |\
                                     PIN_OTYPE_PUSHPULL(GPIOB_BATT_FULLCHARGE_INPUT) |\
                                     PIN_OTYPE_PUSHPULL(GPIOB_LED_ENABLE_OUTPUT))
#define VAL_GPIOB_OSPEEDR           (PIN_OSPEED_100M(GPIOB_BUZZ_TIMER3_CH3) |\
                                     PIN_OSPEED_100M(GPIOB_MS_FS_OUTPUT) |  \
                                     PIN_OSPEED_100M(GPIOB_BOOT1) |         \
                                     PIN_OSPEED_100M(GPIOB_DBG_SWO) |       \
                                     PIN_OSPEED_100M(GPIOB_PIN4) |          \
                                     PIN_OSPEED_100M(GPIOB_PIN5) |          \
                                     PIN_OSPEED_100M(GPIOB_BS_USART1_TX) |  \
                                     PIN_OSPEED_100M(GPIOB_BS_USART1_RX) |  \
                                     PIN_OSPEED_100M(GPIOB_LED_I2C3_SDA) |  \
                                     PIN_OSPEED_100M(GPIOB_MS_I2C2_SDA) |   \
                                     PIN_OSPEED_100M(GPIOB_MS_I2C2_SCL) |   \
                                     PIN_OSPEED_100M(GPIOB_PIN11) |         \
                                     PIN_OSPEED_100M(GPIOB_PIN12) |         \
                                     PIN_OSPEED_100M(GPIOB_BS_NRESET_OUTPUT) |\
                                     PIN_OSPEED_100M(GPIOB_BATT_FULLCHARGE_INPUT) |\
                                     PIN_OSPEED_100M(GPIOB_LED_ENABLE_OUTPUT))
#define VAL_GPIOB_PUPDR             (PIN_PUPDR_FLOATING(GPIOB_BUZZ_TIMER3_CH3) |\
                                     PIN_PUPDR_FLOATING(GPIOB_MS_FS_OUTPUT) |\
                                     PIN_PUPDR_FLOATING(GPIOB_BOOT1) |      \
                                     PIN_PUPDR_PULLUP(GPIOB_DBG_SWO) |      \
                                     PIN_PUPDR_PULLDOWN(GPIOB_PIN4) |       \
                                     PIN_PUPDR_PULLDOWN(GPIOB_PIN5) |       \
                                     PIN_PUPDR_FLOATING(GPIOB_BS_USART1_TX) |\
                                     PIN_PUPDR_PULLUP(GPIOB_BS_USART1_RX) | \
                                     PIN_PUPDR_FLOATING(GPIOB_LED_I2C3_SDA) |\
                                     PIN_PUPDR_FLOATING(GPIOB_MS_I2C2_SDA) |\
                                     PIN_PUPDR_FLOATING(GPIOB_MS_I2C2_SCL) |\
                                     PIN_PUPDR_PULLDOWN(GPIOB_PIN11) |      \
                                     PIN_PUPDR_PULLDOWN(GPIOB_PIN12) |      \
                                     PIN_PUPDR_FLOATING(GPIOB_BS_NRESET_OUTPUT) |\
                                     PIN_PUPDR_FLOATING(GPIOB_BATT_FULLCHARGE_INPUT) |\
                                     PIN_PUPDR_FLOATING(GPIOB_LED_ENABLE_OUTPUT))
#define VAL_GPIOB_ODR               (PIN_ODR_LOW(GPIOB_BUZZ_TIMER3_CH3) |   \
                                     PIN_ODR_LOW(GPIOB_MS_FS_OUTPUT) |      \
                                     PIN_ODR_HIGH(GPIOB_BOOT1) |            \
                                     PIN_ODR_HIGH(GPIOB_DBG_SWO) |          \
                                     PIN_ODR_HIGH(GPIOB_PIN4) |             \
                                     PIN_ODR_HIGH(GPIOB_PIN5) |             \
                                     PIN_ODR_HIGH(GPIOB_BS_USART1_TX) |     \
                                     PIN_ODR_HIGH(GPIOB_BS_USART1_RX) |     \
                                     PIN_ODR_HIGH(GPIOB_LED_I2C3_SDA) |     \
                                     PIN_ODR_HIGH(GPIOB_MS_I2C2_SDA) |      \
                                     PIN_ODR_HIGH(GPIOB_MS_I2C2_SCL) |      \
                                     PIN_ODR_HIGH(GPIOB_PIN11) |            \
                                     PIN_ODR_HIGH(GPIOB_PIN12) |            \
                                     PIN_ODR_HIGH(GPIOB_BS_NRESET_OUTPUT) | \
                                     PIN_ODR_HIGH(GPIOB_BATT_FULLCHARGE_INPUT) |\
                                     PIN_ODR_LOW(GPIOB_LED_ENABLE_OUTPUT))
#define VAL_GPIOB_AFRL              (PIN_AFIO_AF(GPIOB_BUZZ_TIMER3_CH3, 0) |\
                                     PIN_AFIO_AF(GPIOB_MS_FS_OUTPUT, 0) |   \
                                     PIN_AFIO_AF(GPIOB_BOOT1, 0) |          \
                                     PIN_AFIO_AF(GPIOB_DBG_SWO, 0) |        \
                                     PIN_AFIO_AF(GPIOB_PIN4, 0) |           \
                                     PIN_AFIO_AF(GPIOB_PIN5, 0) |           \
                                     PIN_AFIO_AF(GPIOB_BS_USART1_TX, 0) |   \
                                     PIN_AFIO_AF(GPIOB_BS_USART1_RX, 0))
#define VAL_GPIOB_AFRH              (PIN_AFIO_AF(GPIOB_LED_I2C3_SDA, 0) |   \
                                     PIN_AFIO_AF(GPIOB_MS_I2C2_SDA, 0) |    \
                                     PIN_AFIO_AF(GPIOB_MS_I2C2_SCL, 0) |    \
                                     PIN_AFIO_AF(GPIOB_PIN11, 0) |          \
                                     PIN_AFIO_AF(GPIOB_PIN12, 0) |          \
                                     PIN_AFIO_AF(GPIOB_BS_NRESET_OUTPUT, 0) |\
                                     PIN_AFIO_AF(GPIOB_BATT_FULLCHARGE_INPUT, 0) |\
                                     PIN_AFIO_AF(GPIOB_LED_ENABLE_OUTPUT, 0))

/*
 * GPIOC setup:
 *
 * PC0  - BLE_WAKEUP_OUTPUT         (output pushpull maximum).
 * PC1  - BOARD_POWER_OUTPUT        (output pushpull maximum).
 * PC2  - BLE_NRESET_OUTPUT         (output pushpull maximum).
 * PC3  - BS_POWER_OUTPUT           (output pushpull maximum).
 * PC4  - BLE_NPOWER_OUTPUT         (output pushpull maximum).
 * PC5  - MS_INT_INPUT              (input pulldown).
 * PC6  - PIN6                      (input pullup).
 * PC7  - PIN7                      (input pulldown).
 * PC8  - SDCARD_D0                 (input floating).
 * PC9  - SDCARD_D1                 (input floating).
 * PC10 - SDCARD_D2                 (input floating).
 * PC11 - SDCARD_D3                 (input floating).
 * PC12 - SDCARD_CLK                (input pulldown).
 * PC13 - NBTN_INPUT                (input floating).
 * PC14 - OSC32_IN                  (input pulldown).
 * PC15 - OSC32_OUT                 (input pulldown).
 */
#define VAL_GPIOC_MODER             (PIN_MODE_OUTPUT(GPIOC_BLE_WAKEUP_OUTPUT) |\
                                     PIN_MODE_OUTPUT(GPIOC_BOARD_POWER_OUTPUT) |\
                                     PIN_MODE_OUTPUT(GPIOC_BLE_NRESET_OUTPUT) |\
                                     PIN_MODE_OUTPUT(GPIOC_BS_POWER_OUTPUT) |\
                                     PIN_MODE_OUTPUT(GPIOC_BLE_NPOWER_OUTPUT) |\
                                     PIN_MODE_INPUT(GPIOC_MS_INT_INPUT) |   \
                                     PIN_MODE_INPUT(GPIOC_PIN6) |           \
                                     PIN_MODE_INPUT(GPIOC_PIN7) |           \
                                     PIN_MODE_INPUT(GPIOC_SDCARD_D0) |      \
                                     PIN_MODE_INPUT(GPIOC_SDCARD_D1) |      \
                                     PIN_MODE_INPUT(GPIOC_SDCARD_D2) |      \
                                     PIN_MODE_INPUT(GPIOC_SDCARD_D3) |      \
                                     PIN_MODE_INPUT(GPIOC_SDCARD_CLK) |     \
                                     PIN_MODE_INPUT(GPIOC_NBTN_INPUT) |     \
                                     PIN_MODE_INPUT(GPIOC_OSC32_IN) |       \
                                     PIN_MODE_INPUT(GPIOC_OSC32_OUT))
#define VAL_GPIOC_OTYPER            (PIN_OTYPE_PUSHPULL(GPIOC_BLE_WAKEUP_OUTPUT) |\
                                     PIN_OTYPE_PUSHPULL(GPIOC_BOARD_POWER_OUTPUT) |\
                                     PIN_OTYPE_PUSHPULL(GPIOC_BLE_NRESET_OUTPUT) |\
                                     PIN_OTYPE_PUSHPULL(GPIOC_BS_POWER_OUTPUT) |\
                                     PIN_OTYPE_PUSHPULL(GPIOC_BLE_NPOWER_OUTPUT) |\
                                     PIN_OTYPE_PUSHPULL(GPIOC_MS_INT_INPUT) |\
                                     PIN_OTYPE_PUSHPULL(GPIOC_PIN6) |       \
                                     PIN_OTYPE_PUSHPULL(GPIOC_PIN7) |       \
                                     PIN_OTYPE_PUSHPULL(GPIOC_SDCARD_D0) |  \
                                     PIN_OTYPE_PUSHPULL(GPIOC_SDCARD_D1) |  \
                                     PIN_OTYPE_PUSHPULL(GPIOC_SDCARD_D2) |  \
                                     PIN_OTYPE_PUSHPULL(GPIOC_SDCARD_D3) |  \
                                     PIN_OTYPE_PUSHPULL(GPIOC_SDCARD_CLK) | \
                                     PIN_OTYPE_PUSHPULL(GPIOC_NBTN_INPUT) | \
                                     PIN_OTYPE_PUSHPULL(GPIOC_OSC32_IN) |   \
                                     PIN_OTYPE_PUSHPULL(GPIOC_OSC32_OUT))
#define VAL_GPIOC_OSPEEDR           (PIN_OSPEED_100M(GPIOC_BLE_WAKEUP_OUTPUT) |\
                                     PIN_OSPEED_100M(GPIOC_BOARD_POWER_OUTPUT) |\
                                     PIN_OSPEED_100M(GPIOC_BLE_NRESET_OUTPUT) |\
                                     PIN_OSPEED_100M(GPIOC_BS_POWER_OUTPUT) |\
                                     PIN_OSPEED_100M(GPIOC_BLE_NPOWER_OUTPUT) |\
                                     PIN_OSPEED_100M(GPIOC_MS_INT_INPUT) |  \
                                     PIN_OSPEED_100M(GPIOC_PIN6) |          \
                                     PIN_OSPEED_100M(GPIOC_PIN7) |          \
                                     PIN_OSPEED_100M(GPIOC_SDCARD_D0) |     \
                                     PIN_OSPEED_100M(GPIOC_SDCARD_D1) |     \
                                     PIN_OSPEED_100M(GPIOC_SDCARD_D2) |     \
                                     PIN_OSPEED_100M(GPIOC_SDCARD_D3) |     \
                                     PIN_OSPEED_100M(GPIOC_SDCARD_CLK) |    \
                                     PIN_OSPEED_100M(GPIOC_NBTN_INPUT) |    \
                                     PIN_OSPEED_100M(GPIOC_OSC32_IN) |      \
                                     PIN_OSPEED_100M(GPIOC_OSC32_OUT))
#define VAL_GPIOC_PUPDR             (PIN_PUPDR_FLOATING(GPIOC_BLE_WAKEUP_OUTPUT) |\
                                     PIN_PUPDR_FLOATING(GPIOC_BOARD_POWER_OUTPUT) |\
                                     PIN_PUPDR_FLOATING(GPIOC_BLE_NRESET_OUTPUT) |\
                                     PIN_PUPDR_FLOATING(GPIOC_BS_POWER_OUTPUT) |\
                                     PIN_PUPDR_FLOATING(GPIOC_BLE_NPOWER_OUTPUT) |\
                                     PIN_PUPDR_PULLDOWN(GPIOC_MS_INT_INPUT) |\
                                     PIN_PUPDR_PULLUP(GPIOC_PIN6) |         \
                                     PIN_PUPDR_PULLDOWN(GPIOC_PIN7) |       \
                                     PIN_PUPDR_FLOATING(GPIOC_SDCARD_D0) |  \
                                     PIN_PUPDR_FLOATING(GPIOC_SDCARD_D1) |  \
                                     PIN_PUPDR_FLOATING(GPIOC_SDCARD_D2) |  \
                                     PIN_PUPDR_FLOATING(GPIOC_SDCARD_D3) |  \
                                     PIN_PUPDR_PULLDOWN(GPIOC_SDCARD_CLK) | \
                                     PIN_PUPDR_FLOATING(GPIOC_NBTN_INPUT) | \
                                     PIN_PUPDR_PULLDOWN(GPIOC_OSC32_IN) |   \
                                     PIN_PUPDR_PULLDOWN(GPIOC_OSC32_OUT))
#define VAL_GPIOC_ODR               (PIN_ODR_LOW(GPIOC_BLE_WAKEUP_OUTPUT) | \
                                     PIN_ODR_LOW(GPIOC_BOARD_POWER_OUTPUT) |\
                                     PIN_ODR_HIGH(GPIOC_BLE_NRESET_OUTPUT) |\
                                     PIN_ODR_LOW(GPIOC_BS_POWER_OUTPUT) |   \
                                     PIN_ODR_HIGH(GPIOC_BLE_NPOWER_OUTPUT) |\
                                     PIN_ODR_HIGH(GPIOC_MS_INT_INPUT) |     \
                                     PIN_ODR_HIGH(GPIOC_PIN6) |             \
                                     PIN_ODR_HIGH(GPIOC_PIN7) |             \
                                     PIN_ODR_HIGH(GPIOC_SDCARD_D0) |        \
                                     PIN_ODR_HIGH(GPIOC_SDCARD_D1) |        \
                                     PIN_ODR_HIGH(GPIOC_SDCARD_D2) |        \
                                     PIN_ODR_HIGH(GPIOC_SDCARD_D3) |        \
                                     PIN_ODR_HIGH(GPIOC_SDCARD_CLK) |       \
                                     PIN_ODR_HIGH(GPIOC_NBTN_INPUT) |       \
                                     PIN_ODR_HIGH(GPIOC_OSC32_IN) |         \
                                     PIN_ODR_HIGH(GPIOC_OSC32_OUT))
#define VAL_GPIOC_AFRL              (PIN_AFIO_AF(GPIOC_BLE_WAKEUP_OUTPUT, 0) |\
                                     PIN_AFIO_AF(GPIOC_BOARD_POWER_OUTPUT, 0) |\
                                     PIN_AFIO_AF(GPIOC_BLE_NRESET_OUTPUT, 0) |\
                                     PIN_AFIO_AF(GPIOC_BS_POWER_OUTPUT, 0) |\
                                     PIN_AFIO_AF(GPIOC_BLE_NPOWER_OUTPUT, 0) |\
                                     PIN_AFIO_AF(GPIOC_MS_INT_INPUT, 0) |   \
                                     PIN_AFIO_AF(GPIOC_PIN6, 0) |           \
                                     PIN_AFIO_AF(GPIOC_PIN7, 0))
#define VAL_GPIOC_AFRH              (PIN_AFIO_AF(GPIOC_SDCARD_D0, 0) |      \
                                     PIN_AFIO_AF(GPIOC_SDCARD_D1, 0) |      \
                                     PIN_AFIO_AF(GPIOC_SDCARD_D2, 0) |      \
                                     PIN_AFIO_AF(GPIOC_SDCARD_D3, 0) |      \
                                     PIN_AFIO_AF(GPIOC_SDCARD_CLK, 0) |     \
                                     PIN_AFIO_AF(GPIOC_NBTN_INPUT, 0) |     \
                                     PIN_AFIO_AF(GPIOC_OSC32_IN, 0) |       \
                                     PIN_AFIO_AF(GPIOC_OSC32_OUT, 0))

/*
 * GPIOD setup:
 *
 * PD0  - PIN0                      (input pulldown).
 * PD1  - PIN1                      (input pulldown).
 * PD2  - SDCARD_CMD                (input floating).
 * PD3  - PIN3                      (input pulldown).
 * PD4  - PIN4                      (input pulldown).
 * PD5  - PIN5                      (input pulldown).
 * PD6  - PIN6                      (input pulldown).
 * PD7  - PIN7                      (input pulldown).
 * PD8  - PIN8                      (input pulldown).
 * PD9  - PIN9                      (input pulldown).
 * PD10 - PIN10                     (input pulldown).
 * PD11 - PIN11                     (input pulldown).
 * PD12 - PIN12                     (input pulldown).
 * PD13 - PIN13                     (input pulldown).
 * PD14 - PIN14                     (input pulldown).
 * PD15 - PIN15                     (input pulldown).
 */
#define VAL_GPIOD_MODER             (PIN_MODE_INPUT(GPIOD_PIN0) |           \
                                     PIN_MODE_INPUT(GPIOD_PIN1) |           \
                                     PIN_MODE_INPUT(GPIOD_SDCARD_CMD) |     \
                                     PIN_MODE_INPUT(GPIOD_PIN3) |           \
                                     PIN_MODE_INPUT(GPIOD_PIN4) |           \
                                     PIN_MODE_INPUT(GPIOD_PIN5) |           \
                                     PIN_MODE_INPUT(GPIOD_PIN6) |           \
                                     PIN_MODE_INPUT(GPIOD_PIN7) |           \
                                     PIN_MODE_INPUT(GPIOD_PIN8) |           \
                                     PIN_MODE_INPUT(GPIOD_PIN9) |           \
                                     PIN_MODE_INPUT(GPIOD_PIN10) |          \
                                     PIN_MODE_INPUT(GPIOD_PIN11) |          \
                                     PIN_MODE_INPUT(GPIOD_PIN12) |          \
                                     PIN_MODE_INPUT(GPIOD_PIN13) |          \
                                     PIN_MODE_INPUT(GPIOD_PIN14) |          \
                                     PIN_MODE_INPUT(GPIOD_PIN15))
#define VAL_GPIOD_OTYPER            (PIN_OTYPE_PUSHPULL(GPIOD_PIN0) |       \
                                     PIN_OTYPE_PUSHPULL(GPIOD_PIN1) |       \
                                     PIN_OTYPE_PUSHPULL(GPIOD_SDCARD_CMD) | \
                                     PIN_OTYPE_PUSHPULL(GPIOD_PIN3) |       \
                                     PIN_OTYPE_PUSHPULL(GPIOD_PIN4) |       \
                                     PIN_OTYPE_PUSHPULL(GPIOD_PIN5) |       \
                                     PIN_OTYPE_PUSHPULL(GPIOD_PIN6) |       \
                                     PIN_OTYPE_PUSHPULL(GPIOD_PIN7) |       \
                                     PIN_OTYPE_PUSHPULL(GPIOD_PIN8) |       \
                                     PIN_OTYPE_PUSHPULL(GPIOD_PIN9) |       \
                                     PIN_OTYPE_PUSHPULL(GPIOD_PIN10) |      \
                                     PIN_OTYPE_PUSHPULL(GPIOD_PIN11) |      \
                                     PIN_OTYPE_PUSHPULL(GPIOD_PIN12) |      \
                                     PIN_OTYPE_PUSHPULL(GPIOD_PIN13) |      \
                                     PIN_OTYPE_PUSHPULL(GPIOD_PIN14) |      \
                                     PIN_OTYPE_PUSHPULL(GPIOD_PIN15))
#define VAL_GPIOD_OSPEEDR           (PIN_OSPEED_100M(GPIOD_PIN0) |          \
                                     PIN_OSPEED_100M(GPIOD_PIN1) |          \
                                     PIN_OSPEED_100M(GPIOD_SDCARD_CMD) |    \
                                     PIN_OSPEED_100M(GPIOD_PIN3) |          \
                                     PIN_OSPEED_100M(GPIOD_PIN4) |          \
                                     PIN_OSPEED_100M(GPIOD_PIN5) |          \
                                     PIN_OSPEED_100M(GPIOD_PIN6) |          \
                                     PIN_OSPEED_100M(GPIOD_PIN7) |          \
                                     PIN_OSPEED_100M(GPIOD_PIN8) |          \
                                     PIN_OSPEED_100M(GPIOD_PIN9) |          \
                                     PIN_OSPEED_100M(GPIOD_PIN10) |         \
                                     PIN_OSPEED_100M(GPIOD_PIN11) |         \
                                     PIN_OSPEED_100M(GPIOD_PIN12) |         \
                                     PIN_OSPEED_100M(GPIOD_PIN13) |         \
                                     PIN_OSPEED_100M(GPIOD_PIN14) |         \
                                     PIN_OSPEED_100M(GPIOD_PIN15))
#define VAL_GPIOD_PUPDR             (PIN_PUPDR_PULLDOWN(GPIOD_PIN0) |       \
                                     PIN_PUPDR_PULLDOWN(GPIOD_PIN1) |       \
                                     PIN_PUPDR_FLOATING(GPIOD_SDCARD_CMD) | \
                                     PIN_PUPDR_PULLDOWN(GPIOD_PIN3) |       \
                                     PIN_PUPDR_PULLDOWN(GPIOD_PIN4) |       \
                                     PIN_PUPDR_PULLDOWN(GPIOD_PIN5) |       \
                                     PIN_PUPDR_PULLDOWN(GPIOD_PIN6) |       \
                                     PIN_PUPDR_PULLDOWN(GPIOD_PIN7) |       \
                                     PIN_PUPDR_PULLDOWN(GPIOD_PIN8) |       \
                                     PIN_PUPDR_PULLDOWN(GPIOD_PIN9) |       \
                                     PIN_PUPDR_PULLDOWN(GPIOD_PIN10) |      \
                                     PIN_PUPDR_PULLDOWN(GPIOD_PIN11) |      \
                                     PIN_PUPDR_PULLDOWN(GPIOD_PIN12) |      \
                                     PIN_PUPDR_PULLDOWN(GPIOD_PIN13) |      \
                                     PIN_PUPDR_PULLDOWN(GPIOD_PIN14) |      \
                                     PIN_PUPDR_PULLDOWN(GPIOD_PIN15))
#define VAL_GPIOD_ODR               (PIN_ODR_HIGH(GPIOD_PIN0) |             \
                                     PIN_ODR_HIGH(GPIOD_PIN1) |             \
                                     PIN_ODR_HIGH(GPIOD_SDCARD_CMD) |       \
                                     PIN_ODR_HIGH(GPIOD_PIN3) |             \
                                     PIN_ODR_HIGH(GPIOD_PIN4) |             \
                                     PIN_ODR_HIGH(GPIOD_PIN5) |             \
                                     PIN_ODR_HIGH(GPIOD_PIN6) |             \
                                     PIN_ODR_HIGH(GPIOD_PIN7) |             \
                                     PIN_ODR_HIGH(GPIOD_PIN8) |             \
                                     PIN_ODR_HIGH(GPIOD_PIN9) |             \
                                     PIN_ODR_HIGH(GPIOD_PIN10) |            \
                                     PIN_ODR_HIGH(GPIOD_PIN11) |            \
                                     PIN_ODR_HIGH(GPIOD_PIN12) |            \
                                     PIN_ODR_HIGH(GPIOD_PIN13) |            \
                                     PIN_ODR_HIGH(GPIOD_PIN14) |            \
                                     PIN_ODR_HIGH(GPIOD_PIN15))
#define VAL_GPIOD_AFRL              (PIN_AFIO_AF(GPIOD_PIN0, 0) |           \
                                     PIN_AFIO_AF(GPIOD_PIN1, 0) |           \
                                     PIN_AFIO_AF(GPIOD_SDCARD_CMD, 0) |     \
                                     PIN_AFIO_AF(GPIOD_PIN3, 0) |           \
                                     PIN_AFIO_AF(GPIOD_PIN4, 0) |           \
                                     PIN_AFIO_AF(GPIOD_PIN5, 0) |           \
                                     PIN_AFIO_AF(GPIOD_PIN6, 0) |           \
                                     PIN_AFIO_AF(GPIOD_PIN7, 0))
#define VAL_GPIOD_AFRH              (PIN_AFIO_AF(GPIOD_PIN8, 0) |           \
                                     PIN_AFIO_AF(GPIOD_PIN9, 0) |           \
                                     PIN_AFIO_AF(GPIOD_PIN10, 0) |          \
                                     PIN_AFIO_AF(GPIOD_PIN11, 0) |          \
                                     PIN_AFIO_AF(GPIOD_PIN12, 0) |          \
                                     PIN_AFIO_AF(GPIOD_PIN13, 0) |          \
                                     PIN_AFIO_AF(GPIOD_PIN14, 0) |          \
                                     PIN_AFIO_AF(GPIOD_PIN15, 0))


I'll pull out my STM32F4 Discovery board and see if I can find a demo or test case that uses the SD2 driver successfully.
User avatar
Giovanni
Site Admin
Posts: 14892
Joined: Wed May 27, 2009 8:48 am
Has thanked: 1202 times
Been thanked: 996 times

Re: Serial Driver on USART2 TX not working

Post by Giovanni »

Hi,

Try the provided Nucleo demo, SD2 is used for communications and it works. The alternate settings are done in the Nucleo board files.

Giovanni
jayalfredprufrock
Posts: 36
Joined: Tue Jan 13, 2015 6:33 am
Has thanked: 8 times

Re: Serial Driver on USART2 TX not working

Post by jayalfredprufrock »

Thanks Giovanni, I just tried the STM32F411RE Nucleo Demo and still nothing on the TX line. I'm starting to think that the GPIO got fried or something.
User avatar
Giovanni
Site Admin
Posts: 14892
Joined: Wed May 27, 2009 8:48 am
Has thanked: 1202 times
Been thanked: 996 times

Re: Serial Driver on USART2 TX not working

Post by Giovanni »

It is possible, is the board plugged on a base board? The pin could be pulled or pushed by something.

Try using it as a GPIO and see if it toggles.

Giovanni
jayalfredprufrock
Posts: 36
Joined: Tue Jan 13, 2015 6:33 am
Has thanked: 8 times

Re: Serial Driver on USART2 TX not working

Post by jayalfredprufrock »

So after realizing that I couldn't toggle the GPIO, I looked a bit closer at the F411RE Nucleo datasheet. I discovered that by default, USART2 is connected to the ST-Link portion of the board for debug purposes. There are solder bridges on the back that need to be changed so that the USART2 pins are actually routed to the board headers instead of the ST-Link circuit. How I ever thought I had things working on that port is a mystery...Here are the changes for anybody stumbling onto this:

SB62 and SB63 ON
SB13 and SB14 OFF

After making those changes I regained control over the pins but was still having issues with USART. After some experiments, I realized that initializing the SD driver with sdObjectInit(&SD2, NULL, NULL) was the culprit. I guess when you pass NULLs it somehow prevents the normal ISR routines from running. After removing that line from my code everything started working perfectly. Perhaps a note could be added to the docs to caution people from using this function unless they are writing their own ISRs? Or should I not be using the xxObjectInit() functions at all anyway?

Thanks for all your help Giovanni.
User avatar
Giovanni
Site Admin
Posts: 14892
Joined: Wed May 27, 2009 8:48 am
Has thanked: 1202 times
Been thanked: 996 times

Re: Serial Driver on USART2 TX not working

Post by Giovanni »

Hi,

Driver instances are initialized internally to halInit() when the peripheral is enabled in mcuconf.h. xxxObjectInit is only required when using objects not linked to a specific peripheral, for example the MMC_SPI.

Giovanni
Post Reply