[应用相关]

HAL_UART_MspInit在两个不同文件中出现,有啥区别

[复制链接]
688|9
手机看帖
扫描二维码
随时随地手机跟帖
zhanglli|  楼主 | 2017-10-28 21:33 | 显示全部楼层 |阅读模式
HAL_UART_MspInit在两个不同文件中出现,有啥区别
yufe| | 2017-10-28 21:34 | 显示全部楼层

是CubeMX的时候发现的,还是keil中添加库文件的时候发现的

使用特权

评论回复
wangpe| | 2017-10-28 21:37 | 显示全部楼层

官网有个hal库的详解,可以参考一下

使用特权

评论回复
zhuww| | 2017-10-28 21:40 | 显示全部楼层
在uart.c文件中的的那个函数定义之前还加了weak修饰符,说明这个函数如果在其他地方还有定义的话,这个优先级会更低一些,其于CubeMX的架构,这个函数需要在其他文件中有调用,如果用户没有自行定义这个函数的话,就会报错

使用特权

评论回复
zhuomuniao110| | 2017-10-28 22:21 | 显示全部楼层
楼上说的很对,一个是备用而已,弱函数,如果存在非弱函数就失效了。

使用特权

评论回复
lium| | 2017-10-29 10:43 | 显示全部楼层
msp的是你用代码生成器生成的,hal库里的是_weak 修饰的   msp里的优先级高  

使用特权

评论回复
llia| | 2017-10-29 10:44 | 显示全部楼层
这是HAL中三种回调函数之一HAL_PPP_MspInit()/_DeInit(),由HAL_PPP_Init()调用,api函数用来执行外设系统级的初始化(GPIOs,clock,DMA,interrupt);在../Src/stm32f4xx_hal_msp.c中重写.
比如uart初始化时设置更底层的GPIOs,clock,DMA,interrupt,下面用uart来说明它是如何工作的
//在stm32f4xx_hal_uart.c定义,用__weak 关键字表示废弃函数定义,在其他地方重写
__weak void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
   /* Prevent unused argument(s) compilation warning */
  UNUSED(huart);
  /* NOTE: This function Should not be modified, when the callback is needed,
           the HAL_UART_MspInit could be implemented in the user file
   */
}
//在stm32f4xx_hal_uart.c调用
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, USART3 and USART6 */
    assert_param(IS_UART_HWFLOW_INSTANCE(huart->Instance));
    assert_param(IS_UART_HARDWARE_FLOW_CONTROL(huart->Init.HwFlowCtl));
  }
  else
  {
    assert_param(IS_UART_INSTANCE(huart->Instance));
  }
  assert_param(IS_UART_WORD_LENGTH(huart->Init.WordLength));
  assert_param(IS_UART_OVERSAMPLING(huart->Init.OverSampling));
  
  if(huart->gState == HAL_UART_STATE_RESET)
  {  
    /* Allocate lock resource and initialize it */
    huart->Lock = HAL_UNLOCKED;
    /* Init the low level hardware */
    HAL_UART_MspInit(huart);//此处调用
  }

  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.*/
  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->RxState= HAL_UART_STATE_READY;
  
  return HAL_OK;
}

下面的stm32f4xx_hal_msp.c重写
void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{  
  GPIO_InitTypeDef  GPIO_InitStruct;
  
  /*##-1- Enable peripherals and GPIO Clocks #################################*/
  /* Enable GPIO TX/RX clock */
  USARTx_TX_GPIO_CLK_ENABLE();
  USARTx_RX_GPIO_CLK_ENABLE();
  /* Enable USART1 clock */
  USARTx_CLK_ENABLE();
  
  /*##-2- Configure peripheral GPIO ##########################################*/  
  /* UART TX GPIO pin configuration  */
  GPIO_InitStruct.Pin       = USARTx_TX_PIN;
  GPIO_InitStruct.Mode      = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull      = GPIO_NOPULL;
  GPIO_InitStruct.Speed     = GPIO_SPEED_FAST;
  GPIO_InitStruct.Alternate = USARTx_TX_AF;
  
  HAL_GPIO_Init(USARTx_TX_GPIO_PORT, &GPIO_InitStruct);
   
  /* UART RX GPIO pin configuration  */
  GPIO_InitStruct.Pin = USARTx_RX_PIN;
  GPIO_InitStruct.Alternate = USARTx_RX_AF;
   
  HAL_GPIO_Init(USARTx_RX_GPIO_PORT, &GPIO_InitStruct);
   
  /*##-3- Configure the NVIC for UART ########################################*/
  /* NVIC for USART1 */
  HAL_NVIC_SetPriority(USARTx_IRQn, 0, 1);
  HAL_NVIC_EnableIRQ(USARTx_IRQn);
}这样我们初始化时只要针对实例中变动的部分写出来就可以了,比如uart,我们只关注pin,中断就可以了

使用特权

评论回复
zhuww| | 2017-10-29 10:46 | 显示全部楼层
对这个框架还不是很清楚,没有中文的手册讲解,英文的看不懂。

使用特权

评论回复
huanghuac| | 2017-10-29 10:47 | 显示全部楼层
有好几个函数是两个文件里面都有的,很奇怪。。比如重定向函数。。

使用特权

评论回复
zhanglli|  楼主 | 2017-10-29 10:48 | 显示全部楼层
哦,那我就知道怎么回事了,多谢大家,结贴了哈

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1016

主题

9386

帖子

1

粉丝