rtyu789 发表于 2024-10-15 23:06

ST NUCLEO-WB09KE-UART串口

<div class='showpostmsg'>

CubeMX配置UART

!(/data/attachment/forum/202410/15/230533z8g6xtc8otxbcx9g.png.thumb.jpg?rand=3250.5230704587993)


主函数
```C++
int main(void)
{
HAL_Init();
SystemClock_Config();
PeriphCommonClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
uint8_t str_test1[] = "test str\n";
uint8_t str_test2[] = "Hello EEWorld\n";
while (1)
{
        HAL_UART_Transmit(&huart1,(uint8_t*)str_test1, sizeof(str_test1)-1,100);
        HAL_UART_Transmit(&huart1,(uint8_t*)str_test2, sizeof(str_test2)-1,100);
        delay_ms(500);
}
}
```



UART初始化函数
```C++
/**
* @brief USART1 Initialization Function
* @param None
* @retval None
*/
static void MX_USART1_UART_Init(void)
{

/* USER CODE BEGIN USART1_Init 0 */

/* USER CODE END USART1_Init 0 */

/* USER CODE BEGIN USART1_Init 1 */

/* USER CODE END USART1_Init 1 */
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
    Error_Handler();
}
if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
{
    Error_Handler();
}
if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
{
    Error_Handler();
}
if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK)
{
    Error_Handler();
}
/* USER CODE BEGIN USART1_Init 2 */

/* USER CODE END USART1_Init 2 */

}


/**
* @brief Initialize the UART mode according to the specified
*      parameters in the UART_InitTypeDef and initialize the associated handle.
* @param huart UART handle.
* @retval HAL status
*/
HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart)
{
/* Check the UART handle allocation */
if (huart == NULL)
{
    return HAL_ERROR;
}

if (huart->Init.HwFlowCtl != UART_HWCONTROL_NONE)
{
    /* Check the parameters */
    assert_param(IS_UART_HWFLOW_INSTANCE(huart->Instance));
}
else
{
    /* Check the parameters */
    assert_param((IS_UART_INSTANCE(huart->Instance)) || (IS_LPUART_INSTANCE(huart->Instance)));
}

if (huart->gState == HAL_UART_STATE_RESET)
{
    /* Allocate lock resource and initialize it */
    huart->Lock = HAL_UNLOCKED;

#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
    UART_InitCallbacksToDefault(huart);

    if (huart->MspInitCallback == NULL)
    {
      huart->MspInitCallback = HAL_UART_MspInit;
    }

    /* Init the low level hardware */
    huart->MspInitCallback(huart);
#else
    /* Init the low level hardware : GPIO, CLOCK */
    HAL_UART_MspInit(huart);
#endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */
}

huart->gState = HAL_UART_STATE_BUSY;

__HAL_UART_DISABLE(huart);

/* Perform advanced settings configuration */
/* For some items, configuration requires to be done prior TE and RE bits are set */
if (huart->AdvancedInit.AdvFeatureInit != UART_ADVFEATURE_NO_INIT)
{
    UART_AdvFeatureConfig(huart);
}

/* Set the UART Communication parameters */
if (UART_SetConfig(huart) == HAL_ERROR)
{
    return HAL_ERROR;
}

/* In asynchronous mode, the following bits must be kept cleared:
- LINEN and CLKEN bits in the USART_CR2 register,
- SCEN, HDSEL and IRENbits in the USART_CR3 register.*/
CLEAR_BIT(huart->Instance->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN));
CLEAR_BIT(huart->Instance->CR3, (USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN));

__HAL_UART_ENABLE(huart);

/* TEACK and/or REACK to check before moving huart->gState and huart->RxState to Ready */
return (UART_CheckIdleState(huart));
}

/**
* @briefSet the TXFIFO threshold.
* @param huart      UART handle.
* @param ThresholdTX FIFO threshold value
*          This parameter can be one of the following values:
*            @arg @ref UART_TXFIFO_THRESHOLD_1_8
*            @arg @ref UART_TXFIFO_THRESHOLD_1_4
*            @arg @ref UART_TXFIFO_THRESHOLD_1_2
*            @arg @ref UART_TXFIFO_THRESHOLD_3_4
*            @arg @ref UART_TXFIFO_THRESHOLD_7_8
*            @arg @ref UART_TXFIFO_THRESHOLD_8_8
* @retval HAL status
*/
HAL_StatusTypeDef HAL_UARTEx_SetTxFifoThreshold(UART_HandleTypeDef *huart, uint32_t Threshold)
{
uint32_t tmpcr1;

/* Check parameters */
assert_param(IS_UART_FIFO_INSTANCE(huart->Instance));
assert_param(IS_UART_TXFIFO_THRESHOLD(Threshold));

/* Process Locked */
__HAL_LOCK(huart);

huart->gState = HAL_UART_STATE_BUSY;

/* Save actual UART configuration */
tmpcr1 = READ_REG(huart->Instance->CR1);

/* Disable UART */
__HAL_UART_DISABLE(huart);

/* Update TX threshold configuration */
MODIFY_REG(huart->Instance->CR3, USART_CR3_TXFTCFG, Threshold);

/* Determine the number of data to process during RX/TX ISR execution */
UARTEx_SetNbDataToProcess(huart);

/* Restore UART configuration */
WRITE_REG(huart->Instance->CR1, tmpcr1);

huart->gState = HAL_UART_STATE_READY;

/* Process Unlocked */
__HAL_UNLOCK(huart);

return HAL_OK;
}



/**
* @briefSet the RXFIFO threshold.
* @param huart      UART handle.
* @param ThresholdRX FIFO threshold value
*          This parameter can be one of the following values:
*            @arg @ref UART_RXFIFO_THRESHOLD_1_8
*            @arg @ref UART_RXFIFO_THRESHOLD_1_4
*            @arg @ref UART_RXFIFO_THRESHOLD_1_2
*            @arg @ref UART_RXFIFO_THRESHOLD_3_4
*            @arg @ref UART_RXFIFO_THRESHOLD_7_8
*            @arg @ref UART_RXFIFO_THRESHOLD_8_8
* @retval HAL status
*/
HAL_StatusTypeDef HAL_UARTEx_SetRxFifoThreshold(UART_HandleTypeDef *huart, uint32_t Threshold)
{
uint32_t tmpcr1;

/* Check the parameters */
assert_param(IS_UART_FIFO_INSTANCE(huart->Instance));
assert_param(IS_UART_RXFIFO_THRESHOLD(Threshold));

/* Process Locked */
__HAL_LOCK(huart);

huart->gState = HAL_UART_STATE_BUSY;

/* Save actual UART configuration */
tmpcr1 = READ_REG(huart->Instance->CR1);

/* Disable UART */
__HAL_UART_DISABLE(huart);

/* Update RX threshold configuration */
MODIFY_REG(huart->Instance->CR3, USART_CR3_RXFTCFG, Threshold);

/* Determine the number of data to process during RX/TX ISR execution */
UARTEx_SetNbDataToProcess(huart);

/* Restore UART configuration */
WRITE_REG(huart->Instance->CR1, tmpcr1);

huart->gState = HAL_UART_STATE_READY;

/* Process Unlocked */
__HAL_UNLOCK(huart);

return HAL_OK;
}


/**
* @briefDisable the FIFO mode.
* @param huart      UART handle.
* @retval HAL status
*/
HAL_StatusTypeDef HAL_UARTEx_DisableFifoMode(UART_HandleTypeDef *huart)
{
uint32_t tmpcr1;

/* Check parameters */
assert_param(IS_UART_FIFO_INSTANCE(huart->Instance));

/* Process Locked */
__HAL_LOCK(huart);

huart->gState = HAL_UART_STATE_BUSY;

/* Save actual UART configuration */
tmpcr1 = READ_REG(huart->Instance->CR1);

/* Disable UART */
__HAL_UART_DISABLE(huart);

/* Disable FIFO mode */
CLEAR_BIT(tmpcr1, USART_CR1_FIFOEN);
huart->FifoMode = UART_FIFOMODE_DISABLE;

/* Restore UART configuration */
WRITE_REG(huart->Instance->CR1, tmpcr1);

huart->gState = HAL_UART_STATE_READY;

/* Process Unlocked */
__HAL_UNLOCK(huart);

return HAL_OK;
}
```

分析一下UART初始化函数:
1. 初始化端口,波特率,字长为8B,停止位1位,定义为收发模式,没有硬件控制,16倍过采样数据,之后初始化端口
2. 设置TX的FIFO门限,设置RX的FIFO门限
3. 关闭FIFO模式


UART传输函数
```C++
/**
* @brief Send an amount of data in blocking mode.
* @note   When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01),
*         the sent data is handled as a set of u16. In this case, Size must indicate the number
*         of u16 provided through pData.
* @note When FIFO mode is enabled, writing a data in the TDR register adds one
*       data to the TXFIFO. Write operations to the TDR register are performed
*       when TXFNF flag is set. From hardware perspective, TXFNF flag and
*       TXE are mapped on the same bit-field.
* @note   When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01),
*         address of user data buffer containing data to be sent, should be aligned on a half word frontier (16 bits)
*         (as sent data will be handled using u16 pointer cast). Depending on compilation chain,
*         use of specific alignment compilation directives or pragmas might be required
*         to ensure proper alignment for pData.
* @param huart   UART handle.
* @param pData   Pointer to data buffer (u8 or u16 data elements).
* @param Size    Amount of data elements (u8 or u16) to be sent.
* @param Timeout Timeout duration.
* @retval HAL status
*/
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout)
{
const uint8_t*pdata8bits;
const uint16_t *pdata16bits;
uint32_t tickstart;

/* Check that a Tx process is not already ongoing */
if (huart->gState == HAL_UART_STATE_READY)
{
    if ((pData == NULL) || (Size == 0U))
    {
      returnHAL_ERROR;
    }

    /* In case of 9bits/No Parity transfer, pData buffer provided as input parameter
       should be aligned on a u16 frontier, as data to be filled into TDR will be
       handled through a u16 cast. */
    if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
    {
      if ((((uint32_t)pData) & 1U) != 0U)
      {
      returnHAL_ERROR;
      }
    }

    huart->ErrorCode = HAL_UART_ERROR_NONE;
    huart->gState = HAL_UART_STATE_BUSY_TX;

    /* Init tickstart for timeout management */
    tickstart = HAL_GetTick();

    huart->TxXferSize= Size;
    huart->TxXferCount = Size;

    /* In case of 9bits/No Parity transfer, pData needs to be handled as a uint16_t pointer */
    if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
    {
      pdata8bits= NULL;
      pdata16bits = (const uint16_t *) pData;
    }
    else
    {
      pdata8bits= pData;
      pdata16bits = NULL;
    }

    while (huart->TxXferCount > 0U)
    {
      if (UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK)
      {

      huart->gState = HAL_UART_STATE_READY;

      return HAL_TIMEOUT;
      }
      if (pdata8bits == NULL)
      {
      huart->Instance->TDR = (uint16_t)(*pdata16bits & 0x01FFU);
      pdata16bits++;
      }
      else
      {
      huart->Instance->TDR = (uint8_t)(*pdata8bits & 0xFFU);
      pdata8bits++;
      }
      huart->TxXferCount--;
    }

    if (UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TC, RESET, tickstart, Timeout) != HAL_OK)
    {
      huart->gState = HAL_UART_STATE_READY;

      return HAL_TIMEOUT;
    }

    /* At end of Tx process, restore huart->gState to Ready */
    huart->gState = HAL_UART_STATE_READY;

    return HAL_OK;
}
else
{
    return HAL_BUSY;
}
}
```

串口成功接收报文,这是串口助手的参数

!(/data/attachment/forum/202410/15/230534xp2nm0nmvz2jkzzm.png.thumb.jpg?rand=3701.7801121446946)


# 参考资料

(https://blog.csdn.net/wangwenxue1989/article/details/48289715)








</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                               
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>
页: [1]
查看完整版本: ST NUCLEO-WB09KE-UART串口