打印
[应用相关]

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

[复制链接]
999|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xxmmi|  楼主 | 2019-3-13 16:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
HAL_UART_MspInit在两个不同文件中出现,有啥区别
沙发
zhuhuis| | 2019-3-13 16:22 | 只看该作者
是CubeMX的时候发现的,还是keil中添加库文件的时候发现的

使用特权

评论回复
板凳
dingy| | 2019-3-13 16:24 | 只看该作者


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

使用特权

评论回复
地板
tian111| | 2019-3-13 16:31 | 只看该作者
在uart.c文件中的的那个函数定义之前还加了weak修饰符,说明这个函数如果在其他地方还有定义的话,这个优先级会更低一些,其于CubeMX的架构,这个函数需要在其他文件中有调用,如果用户没有自行定义这个函数的话,就会报错

使用特权

评论回复
5
songqian17| | 2019-3-13 16:33 | 只看该作者

楼上说的很对,一个是备用而已,弱函数,如果存在非弱函数就失效了。

使用特权

评论回复
6
chenho| | 2019-3-13 16:37 | 只看该作者
msp的是你用代码生成器生成的,hal库里的是_weak 修饰的   msp里的优先级高  

使用特权

评论回复
7
zwll| | 2019-3-13 16:41 | 只看该作者
这是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,中断就可以了

使用特权

评论回复
8
chuxh| | 2019-3-13 16:43 | 只看该作者
对这个框架还不是很清楚,没有中文的手册讲解,英文的看不懂。

使用特权

评论回复
9
dingy| | 2019-3-13 16:46 | 只看该作者
有好几个函数是两个文件里面都有的,很奇怪。。比如重定向函数。。

使用特权

评论回复
10
xxmmi|  楼主 | 2019-3-13 16:50 | 只看该作者
哦,那我就知道怎么回事了,多谢大家,结贴了哈

使用特权

评论回复
11
guanjiaer| | 2019-4-2 11:42 | 只看该作者
不要介意这个  用起来是没有问题的

使用特权

评论回复
12
heimaojingzhang| | 2019-4-2 11:43 | 只看该作者
一直都是这样的 不过我没有在意过  反正能用

使用特权

评论回复
13
keaibukelian| | 2019-4-2 11:54 | 只看该作者
不要太介意 是弱函数  没关系的

使用特权

评论回复
14
labasi| | 2019-4-2 11:58 | 只看该作者
tian111 发表于 2019-3-13 16:31
在uart.c文件中的的那个函数定义之前还加了weak修饰符,说明这个函数如果在其他地方还有定义的话,这个优先 ...

感谢解答 长知识了

使用特权

评论回复
15
paotangsan| | 2019-4-2 12:03 | 只看该作者
主副关系而已

使用特权

评论回复
16
renzheshengui| | 2019-4-2 12:08 | 只看该作者
没什么太大的区别 不会影响单片机工作的

使用特权

评论回复
17
wakayi| | 2019-4-2 12:11 | 只看该作者
没关注过 就知道有而已

使用特权

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

本版积分规则

369

主题

4278

帖子

2

粉丝