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 */ |