打印
[应用相关]

不同文件中HAL_UART_MspInit的区别

[复制链接]
5529|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Soraka|  楼主 | 2017-12-27 11:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在stm32f7xx_hal_msp.c中和stm32f7xx_hal_uart.c中都有void HAL_UART_MspInit(UART_HandleTypeDef *huart)这个函数,这是啥意思呢?求解
沙发
Garen2| | 2017-12-27 11:26 | 只看该作者
这个问题是CubeMX的时候发现的,还是keil中添加库文件的时候发现的?

使用特权

评论回复
板凳
734774645| | 2017-12-27 11:28 | 只看该作者
对,是有两个,两个内容貌似不一样。

使用特权

评论回复
地板
734774645| | 2017-12-27 11:29 | 只看该作者
其中一个应该是弱函数吧。

使用特权

评论回复
5
734774645| | 2017-12-27 11:30 | 只看该作者

使用特权

评论回复
6
Ryze| | 2017-12-27 11:41 | 只看该作者
官网有个hal库的详解,官方的例程好像跟MX配的差不多

使用特权

评论回复
7
Varus| | 2017-12-27 11:49 | 只看该作者
HAL驱动详解

HAL驱动详解.pdf

4.48 MB

使用特权

评论回复
8
Snow7| | 2017-12-27 12:41 | 只看该作者
在uart.c文件中的的那个函数定义之前还加了weak修饰符,说明这个函数如果在其他地方还有定义的话,这个优先级会更低一些,其于CubeMX的架构,这个函数需要在其他文件中有调用,如果用户没有自行定义这个函数的话,就会报错,不知道这样说你能不能明白

使用特权

评论回复
9
android2| | 2017-12-27 12:50 | 只看该作者
在使用每个外设的时候都会定义一个类似这样的结构体 static DCMI_HandleTypeDef  hDcmiHandler;这个结构体的初始化在哪儿写呢?没看到初始化,但是后面需要用这个结构体了,这是咋回事了。

使用特权

评论回复
10
643757107| | 2017-12-27 14:06 | 只看该作者
这就是弱函数的使用,如果没有其他同名的函数,它就会被调用,如果有同名的,它就是摆设。

使用特权

评论回复
11
一周一天班| | 2017-12-27 15:41 | 只看该作者
这个是库初始化回调函数,有需要才改,一般不动它

使用特权

评论回复
12
643757107| | 2017-12-27 17:22 | 只看该作者
这个你不用动就行,参考例程。

使用特权

评论回复
13
拉克丝| | 2017-12-27 17:45 | 只看该作者
应该是就算用户没有定义自己实际的函数,在编译的时候也不会报错

使用特权

评论回复
14
lefeng| | 2017-12-27 17:53 | 只看该作者

msp的是你用代码生成器生成的,hal库里的是_weak 修饰的   msp里的优先级高  

使用特权

评论回复
15
CaLipton| | 2017-12-27 18:39 | 只看该作者
这是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,中断就可以了

使用特权

评论回复
评论
wdliming 2019-2-26 17:03 回复TA
知道了,在HAL_UART_Init()函数中调用的。。。一层一层调用,剥皮一样 
16
Rospiers| | 2017-12-27 18:49 | 只看该作者
手头上有个板子是STM32F746BGx,正缺这个手册

使用特权

评论回复
17
wdliming| | 2019-2-26 16:58 | 只看该作者
CaLipton 发表于 2017-12-27 18:39
这是HAL中三种回调函数之一HAL_PPP_MspInit()/_DeInit(),由HAL_PPP_Init()调用,api函数用来执行外设系统 ...

我想请问,HAL_UART_MspInit()这个函数案例调用呢?没有调用,也可以使用uart外设吗?

使用特权

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

本版积分规则

178

主题

865

帖子

5

粉丝