void serial_init(serial_t *obj, PinName tx, PinName rx) { // Determine the UART to use (UART_1, UART_2, ...) UARTName uart_tx = (UARTName)pinmap_peripheral(tx, PinMap_UART_TX); UARTName uart_rx = (UARTName)pinmap_peripheral(rx, PinMap_UART_RX); // Get the peripheral name (UART_1, UART_2, ...) from the pin and assign it to the object obj->uart = (UARTName)pinmap_merge(uart_tx, uart_rx); MBED_ASSERT(obj->uart != (UARTName)NC); // Enable USART clock if (obj->uart == UART_1) { __USART1_CLK_ENABLE(); obj->index = 0; } #if defined USART2_BASE if (obj->uart == UART_2) { __USART2_CLK_ENABLE(); obj->index = 1; } #endif #if defined USART3_BASE if (obj->uart == UART_3) { __USART3_CLK_ENABLE(); obj->index = 2; } #endif #if defined USART4_BASE if (obj->uart == UART_4) { __USART4_CLK_ENABLE(); obj->index = 3; } #endif #if defined USART5_BASE if (obj->uart == UART_5) { __USART5_CLK_ENABLE(); obj->index = 4; } #endif #if defined USART6_BASE if (obj->uart == UART_6) { __USART6_CLK_ENABLE(); obj->index = 5; } #endif #if defined USART7_BASE if (obj->uart == UART_7) { __USART7_CLK_ENABLE(); obj->index = 6; } #endif #if defined USART8_BASE if (obj->uart == UART_8) { __USART8_CLK_ENABLE(); obj->index = 7; } #endif // Configure the UART pins pinmap_pinout(tx, PinMap_UART_TX); pinmap_pinout(rx, PinMap_UART_RX); if (tx != NC) { pin_mode(tx, PullUp); } if (rx != NC) { pin_mode(rx, PullUp); } // Configure UART obj->baudrate = 9600; obj->databits = UART_WORDLENGTH_8B; obj->stopbits = UART_STOPBITS_1; obj->parity = UART_PARITY_NONE; obj->pin_tx = tx; obj->pin_rx = rx; init_uart(obj); // For stdio management if (obj->uart == STDIO_UART) { stdio_uart_inited = 1; memcpy(&stdio_uart, obj, sizeof(serial_t)); } }
/** * @brief UART MSP Initialization * This function configures the hardware resources used in this example: * - Peripheral's clock enable * - Peripheral's GPIO Configuration * - NVIC configuration for UART interrupt request enable * @param huart: UART handle pointer * @retval None */ void HAL_UART_MspInit(UART_HandleTypeDef *huart) { GPIO_InitTypeDef GPIO_InitStruct; switch((uint32_t)huart->Instance) { case (uint32_t)USART1 : { /*##-1- Enable peripherals and GPIO Clocks #################################*/ /* Enable GPIO TX/RX clock */ __GPIOA_CLK_ENABLE(); /* Enable USARTx clock */ __USART1_CLK_ENABLE(); /*##-2- Configure peripheral GPIO ##########################################*/ /* UART TX GPIO pin configuration */ GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_10; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; GPIO_InitStruct.Alternate = GPIO_AF1_USART1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /*##-3- Configure the NVIC for UART ########################################*/ /* NVIC for USART */ HAL_NVIC_SetPriority(USART1_IRQn, 1, 0); HAL_NVIC_EnableIRQ(USART1_IRQn); } break; case (uint32_t)USART2 : { /*##-1- Enable peripherals and GPIO Clocks #################################*/ /* Enable GPIO TX/RX clock */ __GPIOD_CLK_ENABLE(); /* Enable USARTx clock */ __USART2_CLK_ENABLE(); /*##-2- Configure peripheral GPIO ##########################################*/ /* UART TX GPIO pin configuration */ GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_5; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; GPIO_InitStruct.Alternate = GPIO_AF0_USART2; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); /*##-3- Configure the NVIC for UART ########################################*/ /* NVIC for USART */ HAL_NVIC_SetPriority(USART2_IRQn, 1, 0); HAL_NVIC_EnableIRQ(USART2_IRQn); } break; case (uint32_t)USART3 : { /*##-1- Enable peripherals and GPIO Clocks #################################*/ /* Enable GPIO TX/RX clock */ __GPIOD_CLK_ENABLE(); /* To allow the IT source identification */ __SYSCFG_CLK_ENABLE(); /* Enable USARTx clock */ __USART3_CLK_ENABLE(); /*##-2- Configure peripheral GPIO ##########################################*/ /* UART TX GPIO pin configuration */ GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; GPIO_InitStruct.Alternate = GPIO_AF0_USART3; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); /*##-3- Configure the NVIC for UART ########################################*/ /* NVIC for USART */ HAL_NVIC_SetPriority(USART3_8_IRQn, 0, 0); HAL_NVIC_EnableIRQ(USART3_8_IRQn); } break; case (uint32_t)USART4 : { /*##-1- Enable peripherals and GPIO Clocks #################################*/ /* Enable GPIO TX/RX clock */ __GPIOC_CLK_ENABLE(); /* To allow the IT source identification */ __SYSCFG_CLK_ENABLE(); /* Enable USARTx clock */ __USART4_CLK_ENABLE(); /*##-2- Configure peripheral GPIO ##########################################*/ /* UART TX GPIO pin configuration */ GPIO_InitStruct.Pin = GPIO_PIN_10 | GPIO_PIN_11; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; GPIO_InitStruct.Alternate = GPIO_AF0_USART4; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); /*##-3- Configure the NVIC for UART ########################################*/ /* NVIC for USART */ HAL_NVIC_SetPriority(USART3_8_IRQn, 0, 0); HAL_NVIC_EnableIRQ(USART3_8_IRQn); } break; case (uint32_t)USART5 : { /*##-1- Enable peripherals and GPIO Clocks #################################*/ /* Enable GPIO TX/RX clock */ __GPIOB_CLK_ENABLE(); /* To allow the IT source identification */ __SYSCFG_CLK_ENABLE(); /* Enable USARTx clock */ __USART5_CLK_ENABLE(); /*##-2- Configure peripheral GPIO ##########################################*/ /* UART TX GPIO pin configuration */ GPIO_InitStruct.Pin = GPIO_PIN_3 | GPIO_PIN_4; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; GPIO_InitStruct.Alternate = GPIO_AF4_USART5; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /*##-3- Configure the NVIC for UART ########################################*/ /* NVIC for USART */ HAL_NVIC_SetPriority(USART3_8_IRQn, 0, 0); HAL_NVIC_EnableIRQ(USART3_8_IRQn); } break; case (uint32_t)USART6 : { /*##-1- Enable peripherals and GPIO Clocks #################################*/ /* Enable GPIO TX/RX clock */ __GPIOF_CLK_ENABLE(); /* To allow the IT source identification */ __SYSCFG_CLK_ENABLE(); /* Enable USARTx clock */ __USART6_CLK_ENABLE(); /*##-2- Configure peripheral GPIO ##########################################*/ /* UART TX GPIO pin configuration */ GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_10; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; GPIO_InitStruct.Alternate = GPIO_AF1_USART6; HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); /*##-3- Configure the NVIC for UART ########################################*/ /* NVIC for USART */ HAL_NVIC_SetPriority(USART3_8_IRQn, 0, 0); HAL_NVIC_EnableIRQ(USART3_8_IRQn); } break; case (uint32_t)USART7 : { /*##-1- Enable peripherals and GPIO Clocks #################################*/ /* Enable GPIO TX/RX clock */ __GPIOF_CLK_ENABLE(); /* To allow the IT source identification */ __SYSCFG_CLK_ENABLE(); /* Enable USARTx clock */ __USART7_CLK_ENABLE(); /*##-2- Configure peripheral GPIO ##########################################*/ /* UART TX GPIO pin configuration */ GPIO_InitStruct.Pin = GPIO_PIN_3 | GPIO_PIN_2; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; GPIO_InitStruct.Alternate = GPIO_AF1_USART7; HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); /*##-3- Configure the NVIC for UART ########################################*/ /* NVIC for USART */ HAL_NVIC_SetPriority(USART3_8_IRQn, 0, 0); HAL_NVIC_EnableIRQ(USART3_8_IRQn); } break; case (uint32_t)USART8 : { /*##-1- Enable peripherals and GPIO Clocks #################################*/ /* Enable GPIO TX/RX clock */ __GPIOC_CLK_ENABLE(); /* To allow the IT source identification */ __SYSCFG_CLK_ENABLE(); /* Enable USARTx clock */ __USART8_CLK_ENABLE(); /*##-2- Configure peripheral GPIO ##########################################*/ /* UART TX GPIO pin configuration */ GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; GPIO_InitStruct.Alternate = GPIO_AF1_USART8; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); /*##-3- Configure the NVIC for UART ########################################*/ /* NVIC for USART */ HAL_NVIC_SetPriority(USART3_8_IRQn, 1, 0); HAL_NVIC_EnableIRQ(USART3_8_IRQn); } break; } }