void UART_Init(UART0_Type* UARTx, UART_InitTypeDef *init) { assert_param(IS_UART_ALL_PERIPH(UARTx)); assert_param(init); assert_param(IS_UART_STOPBITS(init->UART_StopBits)); assert_param(IS_UART_PARITY(init->UART_Parity)); /* TODO : assume clock is 50MHz */ UARTx->BAUDRATE = UART_CalcBaudrateReload( UART_GetClock(UARTx), init->UART_BaudRate); UARTx->CTRL_b.MODE = (init->UART_Parity == UART_Parity_None) ? UART_Mode_8b : UART_Mode_8b_Parity; UARTx->CTRL_b.STOP = init->UART_StopBits; UARTx->CTRL_b.PARITY = (init->UART_Parity == UART_Parity_None) ? UART_Parity_Even : init->UART_Parity; UARTx->CTRL_b.LOOPBACK = init->UART_LoopBack; UARTx->CTRL_b.RX_EN = init->UART_RxEn; UARTx->CTRL_b.CTS = init->UART_CtsEn; UARTx->CTRL_b.BAUD_MODE = (init->UART_BaudRate > UART_BaudMode_Division) ? UART_BaudMode_1 : UART_BaudMode_0; UARTx->CTRL_b.FIFO_EN = TRUE; UARTx->CTRL_b.RX_THRESHOLD = UART_WR_MAX_FIFO_SIZE; UARTx->CTRL_b.RX_HALF_FULL = (UART_WR_MAX_FIFO_SIZE >> 1); UARTx->TIMEOUT = 0xFF; UARTx->INT_MASK |= UART_Int_All; UARTx->INT_SEEN &= UART_Int_All; }
uint32_t UART_Init(UART_TypeDef *UARTx, UART_InitTypeDef* UART_InitStruct) { float baud_divisor; uint32_t tmpreg=0x00, uartclock=0x00; uint32_t integer_baud = 0x00, fractional_baud = 0x00; assert_param(IS_UART_01_PERIPH(UARTx)); assert_param(IS_UART_WORD_LENGTH(UART_InitStruct->UART_WordLength)); assert_param(IS_UART_PARITY(UART_InitStruct->UART_Parity)); assert_param(IS_UART_STOPBITS(UART_InitStruct->UART_StopBits)); assert_param(IS_UART_HARDWARE_FLOW_CONTROL(UART_InitStruct->UART_HardwareFlowControl)); assert_param(IS_UART_MODE(UART_InitStruct->UART_Mode)); UARTx->CR &= ~(UART_CR_UARTEN); // Set baudrate CRG->UARTCLK_SSR = CRG_UARTCLK_SSR_RCLK; // Set UART Clock using internal Oscilator ( 8MHz ) //CRG->UARTCLK_SSR = CRG_UARTCLK_SSR_OCLK; // Set UART Clock using external Oscilator uartclock = (8000000UL) / (1 << CRG->UARTCLK_PVSR); baud_divisor = ((float)uartclock / (16 * UART_InitStruct->UART_BaudRate)); integer_baud = (uint32_t)baud_divisor; fractional_baud = (uint32_t)((baud_divisor - integer_baud) * 64 + 0.5); UARTx->IBRD = integer_baud; UARTx->FBRD = fractional_baud; tmpreg = UARTx->LCR_H; tmpreg &= ~(0x00EE); tmpreg |= (UART_InitStruct->UART_WordLength | UART_InitStruct->UART_StopBits | UART_InitStruct->UART_Parity); UARTx->LCR_H |= tmpreg; tmpreg = UARTx->CR; tmpreg &= ~(UART_CR_CTSEn | UART_CR_RTSEn | UART_CR_RXE | UART_CR_TXE | UART_CR_UARTEN); tmpreg |= (UART_InitStruct->UART_Mode | UART_InitStruct->UART_HardwareFlowControl); UARTx->CR |= tmpreg; UARTx->CR |= UART_CR_UARTEN; return 0; }
/** @brief: set registers acc to info in huart * @details: used in HAL_UART3Debug_Init, private ****************************************************************/ static void MyUARTSetConfig(UART_HandleTypeDef * huart) { uint32_t tmpreg = 0x00; /* Check the parameters */ assert_param(IS_UART_BAUDRATE(huart->Init.BaudRate)); assert_param(IS_UART_STOPBITS(huart->Init.StopBits)); assert_param(IS_UART_PARITY(huart->Init.Parity)); assert_param(IS_UART_MODE(huart->Init.Mode)); /*------- UART-associated USART registers setting : CR2 Configuration ------*/ /* Configure the UART Stop Bits: Set STOP[13:12] bits according * to huart->Init.StopBits value */ MODIFY_REG(huart->Instance->CR2, USART_CR2_STOP, huart->Init.StopBits); /*------- UART-associated USART registers setting : CR1 Configuration ------*/ /* Configure the UART Word Length, Parity and mode: Set the M bits according to huart->Init.WordLength value Set PCE and PS bits according to huart->Init.Parity value Set TE and RE bits according to huart->Init.Mode value */ tmpreg = (uint32_t) huart->Init.WordLength | huart->Init.Parity | huart->Init.Mode; MODIFY_REG(huart->Instance->CR1, (uint32_t)(USART_CR1_M | USART_CR1_PCE | USART_CR1_PS | USART_CR1_TE | USART_CR1_RE), tmpreg); /*------- UART-associated USART registers setting : CR3 Configuration ------*/ /* Configure the UART HFC: Set CTSE and RTSE bits according to huart->Init.HwFlowCtl value */ MODIFY_REG(huart->Instance->CR3, (USART_CR3_RTSE | USART_CR3_CTSE), huart->Init.HwFlowCtl); /*------- UART-associated USART registers setting : BRR Configuration ------*/ if ((huart->Instance == USART1)) { huart->Instance->BRR = UART_BRR_SAMPLING16(HAL_RCC_GetPCLK2Freq(), huart->Init.BaudRate); } else { huart->Instance->BRR = UART_BRR_SAMPLING16(HAL_RCC_GetPCLK1Freq(), huart->Init.BaudRate); } }
/** @brief: set registers acc to info in huart * @details: used in HAL_UART3Debug_Init, private ****************************************************************/ static void MyUARTSetConfig(UART_HandleTypeDef *huart) { uint32_t tmpreg = 0x00; /* Check the parameters */ assert_param(IS_UART_BAUDRATE(huart->Init.BaudRate)); assert_param(IS_UART_STOPBITS(huart->Init.StopBits)); assert_param(IS_UART_PARITY(huart->Init.Parity)); assert_param(IS_UART_MODE(huart->Init.Mode)); /*-------------------------- USART CR2 Configuration -----------------------*/ tmpreg = huart->Instance->CR2; /* Clear STOP[13:12] bits */ tmpreg &= (uint32_t) ~((uint32_t) USART_CR2_STOP); /* Configure the UART Stop Bits: Set STOP[13:12] bits according to huart->Init.StopBits value */ tmpreg |= (uint32_t) huart->Init.StopBits; /* Write to USART CR2 */ huart->Instance->CR2 = (uint32_t) tmpreg; /*-------------------------- USART CR1 Configuration -----------------------*/ tmpreg = huart->Instance->CR1; /* Clear M, PCE, PS, TE and RE bits */ tmpreg &= (uint32_t) ~((uint32_t) (USART_CR1_M | USART_CR1_PCE | USART_CR1_PS | USART_CR1_TE | USART_CR1_RE | USART_CR1_OVER8)); /* Configure the UART Word Length, Parity and mode: Set the M bits according to huart->Init.WordLength value Set PCE and PS bits according to huart->Init.Parity value Set TE and RE bits according to huart->Init.Mode value Set OVER8 bit according to huart->Init.OverSampling value */ tmpreg |= (uint32_t) huart->Init.WordLength | huart->Init.Parity | huart->Init.Mode | huart->Init.OverSampling; /* Write to USART CR1 */ huart->Instance->CR1 = (uint32_t) tmpreg; /*-------------------------- USART CR3 Configuration -----------------------*/ tmpreg = huart->Instance->CR3; /* Clear CTSE and RTSE bits */ tmpreg &= (uint32_t) ~((uint32_t) (USART_CR3_RTSE | USART_CR3_CTSE)); /* Configure the UART HFC: Set CTSE and RTSE bits according to huart->Init.HwFlowCtl value */ tmpreg |= huart->Init.HwFlowCtl; /* Write to USART CR3 */ huart->Instance->CR3 = (uint32_t) tmpreg; /* Check the Over Sampling */ if (huart->Init.OverSampling == UART_OVERSAMPLING_8) { /*-------------------------- USART BRR Configuration ---------------------*/ if ((huart->Instance == USART1) || (huart->Instance == USART6)) { huart->Instance->BRR = UART_DIV_SAMPLING8(HAL_RCC_GetPCLK2Freq(), huart->Init.BaudRate); } else { huart->Instance->BRR = UART_DIV_SAMPLING8(HAL_RCC_GetPCLK1Freq(), huart->Init.BaudRate); } } else { /*-------------------------- USART BRR Configuration ---------------------*/ if ((huart->Instance == USART1) || (huart->Instance == USART6)) { huart->Instance->BRR = UART_DIV_SAMPLING16(HAL_RCC_GetPCLK2Freq(), huart->Init.BaudRate); } else { huart->Instance->BRR = UART_DIV_SAMPLING16(HAL_RCC_GetPCLK1Freq(), huart->Init.BaudRate); } } }