Exemple #1
0
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;
}
Exemple #3
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);
	}
}
Exemple #4
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));

	/*-------------------------- 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);
		}
	}
}