STM32CubeIDE 串口DMA 代码分析

本文主要分析了STM32CubeIDE中串口初始化和DMA设置的过程。在串口初始化后,详细讨论了如何进行DMA的初始化,这部分代码在HAL_UART_MspInit中被调用。值得注意的是,在提供的配置中,串口并未开启任何中断。同时,文章并未涉及串口中断服务函数的详细内容。
摘要由CSDN通过智能技术生成

串口初始化

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;                        //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;      //过采样设置,8倍或者16倍
  if (HAL_UART_Init(&huart1) != HAL_OK)              //
  {
    Error_Handler();
  }
  /* USER CODE BEGIN USART1_Init 2 */


  /* USER CODE END USART1_Init 2 */

}
HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart)
{
  /* Check the UART handle allocation */
  if (huart == NULL)                                                     
  {
    return HAL_ERROR;
  }

  /* Check the parameters */
  if (huart->Init.HwFlowCtl != UART_HWCONTROL_NONE)
  {
    /* The hardware flow control is available only for USART1, USART2 and USART3 */
    /* assert_param 的定义
    #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) 
    表示参数expr为false,则执行后面的assert_failed()函数,__FILE__, __LINE__是标准库函数中的宏定义,表示文件名和行号;
    如果参数exp为TRUE,则执行((void)0),什么都不做
  */
    assert_param(IS_UART_HWFLOW_INSTANCE(huart->Instance));   
   /*
   如果IS_UART_HWFLOW_INSTANCE(huart->Instance)是true,则什么都不做,
   表示IS_UART_HWFLOW_INSTANCE(huart->Instance)为false,则执行后面的assert_failed()函数,  
  */
    assert_param(IS_UART_HARDWARE_FLOW_CONTROL(huart->Init.HwFlowCtl));
  }
  else
  {
    assert_param(IS_UART_INSTANCE(huart->Instance));
  }
  /*
  如果有硬件控制,则检查 HARDWARE_FLOW_CONTROL  和 IS_UART_HWFLOW_INSTANCE
 #define IS_UART_HWFLOW_INSTANCE(INSTANCE) (((INSTANCE) == USART1) || \
                                           ((INSTANCE) == USART2) || \
                                           ((INSTANCE) == USART3))
  无则检查IS_UART_INSTANCE
  #define IS_UART_INSTANCE(INSTANCE) (((INSTANCE) == USART1) || \
                                    ((INSTANCE) == USART2) || \
                                    ((INSTANCE) == USART3) || \
                                    ((INSTANCE) == UART4)  || \
                                    ((INSTANCE) == UART5))  
  */
  assert_param(IS_UART_WORD_LENGTH(huart->Init.WordLength));        //检查数据位
  /*
  #define IS_UART_WORD_LENGTH(LENGTH) (((LENGTH) == UART_WORDLENGTH_8B) || \
                                     ((LENGTH) == UART_WORDLENGTH_9B))
 */
  
#if defined(USART_CR1_OVER8)
  assert_param(IS_UART_OVERSAMPLING(huart->Init.OverSampling));
#endif /* USART_CR1_OVER8 */


  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,初始化GPIO和时钟
    HAL_UART_MspInit(huart);
#endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */
  }

  huart->gState = HAL_UART_STATE_BUSY;                           //把串口状态设置为忙

  /* Disable the peripheral */
  __HAL_UART_DISABLE(huart);                                          // 停用串口

  /* Set the UART Communication parameters */
  UART_SetConfig(huart);                                                  //真正设置串口寄存器的波特率,停止位等

  /* In asynchronous mode, the following bits must be kept cleared:
     - LINEN and CLKEN bits in the USART_CR2 register,
     - SCEN, HDSEL and IREN  bits in the USART_CR3 register.*/
     /*
     在异步模式下,必须清除以下位::
    CR2 寄存器中的  LINEN 和 CLKEN 位

    LINEN: LIN模式使能 (LIN mode enable)
                   该位由软件设置或清除。
                 0:禁止LIN模式;
                1:使能LIN模式。
                在LIN模式下,可以用USART_CR1寄存器中的SBK位发送LIN同步断开符(低13位),以及检测LIN同步断开符。

  CLKEN:时钟使能 (Clock enable)
                   该位用来使能CK引脚
                   0:禁止CK引脚;
                   1:使能CK引脚。
  
    CR3 寄存器中SCEN, HDSEL 和 IREN  位
    
    SCEN: 智能卡模式使能 (Smartcard mode enable)
		该位用来使能智能卡模式
		0:禁止智能卡模式;
		1:使能智能卡模式。
		注: UART4和UART5上不存在这一位

	HDSEL:半双工选择 (Half-duplex selection)
	选择单线半双工模式
	0:不选择半双工模式;
	1:选择半双工模式。

	IREN:红外模式使能 (IrDA mode enable)
	该位由软件设置或清除。
	0:不使能红外模式;
	1:使能红外模式。
    
     */
  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));

  /* Enable the peripheral */
    /* 使能串口*/
  __HAL_UART_ENABLE(huart);        

  /* Initialize the UART state */
  /*初始化串口的状态:无错误/全局状态准备好/接收准备好/发送准备好
  huart->ErrorCode = HAL_UART_ERROR_NONE;
  huart->gState = HAL_UART_STATE_READY;
  huart-
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值