硬汉嵌入式论坛

 找回密码
 立即注册
查看: 12088|回复: 8
收起左侧

STM32F7系列只能使用HAL固件库,本帖记录HAL库和旧库的差异

[复制链接]

747

主题

1049

回帖

3295

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3295
发表于 2016-6-30 00:58:38 | 显示全部楼层 |阅读模式
STM32F7XX系列只能使用HAL固件库了,风格变化太大,老客户可能一时半会适应不了。本帖记录旧库和HAL库之间的差异。

HAL库也经历了几次升级。其中 stm32_hal_legacy.h 这个文件对很多旧宏进行了重定义,目的是兼容旧的源代码(legacy的意思是遗产,表示先前的版本)。大家做新程序就不要用这个文件里面的宏了。最新的HAL库中带 _ex 尾巴的文件都是新HAL库,比如 stm32f7xx_hal_rcc_ex.h。
注意这些全大写字母的宏函数不是真正的函数,在代码中会就地展开,展开后就是原汁原味的寄存器操作了,执行效率已经最快。再讨论所谓的用寄存器开发还是固件库开发已经没有任何意义了。

1. USART1的时钟使能
旧库: RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
HAL: __HAL_RCC_USART1_CLK_ENABLE();

2. GPIOA时钟使能
旧库: RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
HAL: __HAL_RCC_GPIOA_CLK_ENABLE();

3. 配置GPIO PA9为复用功能USART1_TX
旧库:
{
        GPIO_InitTypeDef GPIO_InitStructure;

        GPIO_PinAFConfig(GPIOA, GPIO_PinSource9,  GPIO_AF_USART1);
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;    /* 输出类型为推挽 */
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;    /* 内部上拉电阻使能 */
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;    /* 复用模式 */
        GPIO_InitStructure.GPIO_Pin = GPIN_Pin_9;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(_GPIO_Tx, &GPIO_InitStructure);
}
HAL库:
{
  GPIO_InitTypeDef gpio_init_structure;
  gpio_init_structure.Pin = GPIO_PIN_9;   
  gpio_init_structure.Mode = GPIO_MODE_AF_PP;
  gpio_init_structure.Speed = GPIO_SPEED_FAST;
  gpio_init_structure.Pull = GPIO_PULLUP;
  gpio_init_structure.Alternate = GPIO_AF7_USART1;
  HAL_GPIO_Init(COM_TX_PORT[COM], &gpio_init_structure);
}
配置复用功能不用再单独调用 GPIO_PinAFConfig函数了。
ST的开发人员终于将以前的小写字母Pin修改为大写了。要知道,WINDOWS C++程序风格中常量宏都是全大写字母的。搞不懂ST公司为啥之前搞个不伦不类的 GPIO_Pin_9 出来。HAL库中的GPIO_PULLUP、GPIO_MODE_AF_PP等常量宏都遵循了全大写字母的约定。可以想象ST软件开发部门经理更换了好几茬,从最开始的 u8 到标准的uint8_t,到全大写宏。ST软件开发人员的编程水平在逐年提高,代码越来越规范了。
目前就是觉得范例中的局部变量名称太长了,敲着不累啊。gpio_init_structure 你就不能写成 gpio_init或者init 也不影响大家理解啊。


AF标记,其他串口都是唯一的,唯独UART5有两个AF标记可选项,GPIO_AF7_UART5,GPIO_AF8_UART5。大家选择UART5的时候需要特别注意下。


HAL库  BUG:
#if defined (STM32F765xx) || defined(STM32F767xx) || defined(STM32F769xx) || defined(STM32F777xx) || defined(STM32F779xx)
#define GPIO_AF6_UART4         ((uint8_t)0x06U)   /* UART4 Alternate Function mapping     */   
#define GPIO_AF6_DFSDM1        ((uint8_t)0x06U)  /* DFSDM1 Alternate Function mapping     */
#endif /* STM32F767xx || STM32F769xx || STM32F777xx || STM32F779xx */   
既然定义了 这些型号可以使用 GPIO_AF6_UART4,但是在 IS_GPIO_AF(AF) 判断形参时,并没有包含这个配置,可能一般不常用这个配置吧。

4. 使能串口UART接收中断(接收数据非空),和发送空中断。
旧库: USART_ITConfig(_USARTx, USART_IT_RXNE, ENABLE);   
            USART_ITConfig(_USARTx, USART_IT_TXE, ENABLE);
HAL库:SET_BIT(_USARTx->CR1, USART_CR1_RXNEIE);
             SET_BIT(huart->Instance->CR1, USART_CR1_TXEIE);   /* Enable the UART Transmit Data Register Empty Interrupt */

   
   
   
回复

使用道具 举报

1

主题

14

回帖

17

积分

新手上路

积分
17
发表于 2016-6-30 14:23:12 | 显示全部楼层
抬个凳子慢慢的看......
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2016-7-1 07:14:57 | 显示全部楼层
[s:151]
回复

使用道具 举报

4

主题

64

回帖

76

积分

初级会员

积分
76
发表于 2016-7-4 10:57:04 | 显示全部楼层
有没有一句简短的话来说明旧库和HAL的区别
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2016-7-4 11:07:48 | 显示全部楼层

回 heitu103 的帖子

heitu103:有没有一句简短的话来说明旧库和HAL的区别 (2016-07-04 10:57) 
两种不同的库。
回复

使用道具 举报

116

主题

800

回帖

1148

积分

至尊会员

积分
1148
QQ
发表于 2016-7-5 11:37:44 | 显示全部楼层
估计以后不得不转换到HAL库
回复

使用道具 举报

32

主题

187

回帖

283

积分

高级会员

积分
283
发表于 2016-10-11 15:43:26 | 显示全部楼层
ST以后发布的芯片都使用HAL库
回复

使用道具 举报

4

主题

20

回帖

4

积分

新手上路

积分
4
发表于 2017-1-19 15:21:57 | 显示全部楼层
我以前没用过stm32 ,现在刚接触,所以觉得这个HAL库很好用啊,傻瓜式图形界面。
回复

使用道具 举报

17

主题

121

回帖

172

积分

初级会员

积分
172
发表于 2017-2-4 09:50:01 | 显示全部楼层

回 eric2013 的帖子

eric2013:两种不同的库。 (2016-07-04 11:07) 
高手[s:151]
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-15 20:43 , Processed in 0.290067 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表