20254|13

49

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

HAL_UART_MspInit在两个不同文件中出现,有啥区别 [复制链接]

在stm32f7xx_hal_msp.c中和stm32f7xx_hal_uart.c中都有void HAL_UART_MspInit(UART_HandleTypeDef *huart)这个函数,这是啥意思呢?求解
此帖出自stm32/stm8论坛

最新回复

感谢分享   详情 回复 发表于 2020-6-5 13:47
点赞 关注
 

回复
举报

4177

帖子

9

TA的资源

五彩晶圆(高级)

沙发
 
楼主,您这个问题是CubeMX的时候发现的,还是keil中添加库文件的时候发现的?
此帖出自stm32/stm8论坛
 
 

回复

49

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
huaiqiao 发表于 2016-3-29 23:06
楼主,您这个问题是CubeMX的时候发现的,还是keil中添加库文件的时候发现的?

看官方给的例程中发现的。
此帖出自stm32/stm8论坛

点评

哦哦,这个官网有个hal库的详解,您可以看看呢。官方的例程好像跟MX配的差不多。 附件,您参考下。  详情 回复 发表于 2016-3-29 23:44
 
 

回复

4177

帖子

9

TA的资源

五彩晶圆(高级)

4
 
杏花雨 发表于 2016-3-29 23:10
看官方给的例程中发现的。

哦哦,这个官网有个hal库的详解,您可以看看呢。官方的例程好像跟MX配的差不多。
附件,您参考下。

HAL驱动详解.pdf (4.48 MB, 下载次数: 5700)
此帖出自stm32/stm8论坛

点评

感谢分享,手头上有个板子是STM32F746BGx,正缺这个手册  详情 回复 发表于 2017-10-17 08:19
 
 
 

回复

578

帖子

0

TA的资源

纯净的硅(初级)

5
 
在uart.c文件中的的那个函数定义之前还加了weak修饰符,说明这个函数如果在其他地方还有定义的话,这个优先级会更低一些,其于CubeMX的架构,这个函数需要在其他文件中有调用,如果用户没有自行定义这个函数的话,就会报错,不知道这样说你能不能明白
此帖出自stm32/stm8论坛
 
个人签名刻苦学习,共同进步
 
 

回复

49

帖子

0

TA的资源

一粒金砂(中级)

6
 
迈尔风随 发表于 2016-3-30 00:31
在uart.c文件中的的那个函数定义之前还加了weak修饰符,说明这个函数如果在其他地方还有定义的话,这个优先 ...

恩,看了看资料,他写的也是需要使用者自定义这个函数,懂一些了。不过好像没定义的话也不会报错
此帖出自stm32/stm8论坛

点评

是的,这一点我说错了,应该是就算用户没有定义自己实际的函数,在编译的时候也不会报错  详情 回复 发表于 2016-3-30 09:14
 
 
 

回复

49

帖子

0

TA的资源

一粒金砂(中级)

7
 
还有在使用每个外设的时候都会定义一个类似这样的结构体 static DCMI_HandleTypeDef  hDcmiHandler;这个结构体的初始化在哪儿写呢?没看到初始化,但是后面需要用这个结构体了,这是咋回事了。
此帖出自stm32/stm8论坛

点评

懂了,懂了,地址穿进去了。  详情 回复 发表于 2016-3-30 09:10
 
 
 

回复

49

帖子

0

TA的资源

一粒金砂(中级)

8
 
杏花雨 发表于 2016-3-30 08:56
还有在使用每个外设的时候都会定义一个类似这样的结构体 static DCMI_HandleTypeDef  hDcmiHandler;这个结 ...

懂了,懂了,地址穿进去了。
此帖出自stm32/stm8论坛
 
 
 

回复

1976

帖子

1

TA的资源

五彩晶圆(初级)

9
 
杏花雨 发表于 2016-3-30 08:07
恩,看了看资料,他写的也是需要使用者自定义这个函数,懂一些了。不过好像没定义的话也不会报错

是的,这一点我说错了,应该是就算用户没有定义自己实际的函数,在编译的时候也不会报错
此帖出自stm32/stm8论坛
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(初级)

10
 
msp的是你用代码生成器生成的,hal库里的是_weak 修饰的   msp里的优先级高  
此帖出自stm32/stm8论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

11
 
本帖最后由 guanjilai 于 2016-9-11 23:43 编辑

这是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,中断就可以了

此帖出自stm32/stm8论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(中级)

12
 
huaiqiao 发表于 2016-3-29 23:44
哦哦,这个官网有个hal库的详解,您可以看看呢。官方的例程好像跟MX配的差不多。
附件,您参考下。


...

感谢分享,手头上有个板子是STM32F746BGx,正缺这个手册
此帖出自stm32/stm8论坛

点评

不过我不知道F7的HAL的库 跟附件的这个有多大的区别哦。 我附件的这个是F4的哦。  详情 回复 发表于 2017-10-17 09:51
 
 
 

回复

4177

帖子

9

TA的资源

五彩晶圆(高级)

13
 
doniexun 发表于 2017-10-17 08:19
感谢分享,手头上有个板子是STM32F746BGx,正缺这个手册

不过我不知道F7的HAL的库 跟附件的这个有多大的区别哦。
我附件的这个是F4的哦。
此帖出自stm32/stm8论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

14
 
huaiqiao 发表于 2016-3-29 23:44 哦哦,这个官网有个hal库的详解,您可以看看呢。官方的例程好像跟MX配的差不多。 附件,您参考下。 ...

感谢分享

此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表