打印

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

[复制链接]
516|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
白鹭hu|  楼主 | 2018-8-16 15:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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 */

使用特权

评论回复

相关帖子

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

本版积分规则

396

主题

396

帖子

0

粉丝