【2022年的STM32】 01-开发环境上手初体验
概述
最近基于NXP S32K1完成博客专栏,决定看一下好多年未使用ST的MCU,看其是否在开发环境、驱动、芯片特性上更好用了呢?
开发环境
STM32的开发环境有很多
-
Eclipse ARM EMbed Keil IAR Systems STM32CUBE IDE
STM32CUBE
这里我们选择ST官方基于eclipse的免费STM32CUBE IDE,下载地址:
STM32 CubeMX
代码生成工具,配置时钟、引脚和片上外设功能等。下载地址:
开始使用CubeMX
打开CubeMX,选择一款芯片,对其时钟、引脚、外设任意配置:
然后再Project Manager中进行工程相关配置,如输出到哪个文件夹,建立哪个IDE的开发环境等。 最后,点击Generate Code生成工程。
生成后,可根据弹窗打开CUBE。
开始使用Cube
由于是基于Eclipse的IDE,感觉各项操作和NXP S32DS相同,譬如字体设置、背景颜色等。
回到工程本身,其逻辑上分成3部分,驱动(HAL各个片上外设、CMSIS中stm32内存映射、时钟等)、应用(这里包含在Core中)、其它(.ld链接文件等)。
代码分析
stm32f4xx_it中是使能外设的中断函数定义与申明,待用户补充; main中完成各个外设的初始化,然后while(1)。
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {
0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOF_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_2, GPIO_PIN_RESET);
/*Configure GPIO pin : PF1 */
GPIO_InitStruct.Pin = GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
//...
}
ST还是一如既往的使用结构体逐个初始化的方式完成外设初始化…只是在接口名称上不同了而已。 那么,初始化了多少个引脚,就要调用HAL_GPIO_Init多少次!!! 其结构体中Mode、Pull用uint32_t定义的,GPIO_MODE_IT_RISING、GPIO_MODE_INPUT等使用#define定义,在stm32f4xx_hal_gpio中定义,未使用枚举定义,相对而言,代码可对象较差。
HAL 中提供了GPIO相关操作接口,满足使用,它在中断处理HAL_GPIO_EXTI_Callback定义成__weak,在其它地方重新定义。 不过貌似并不是每个GPIO都有中断功能,这一点相对NXP S32K1较弱。
总结
ST提供了CubeMX可以配置外设、时钟、引脚等,可以生成不同IDE的工程,其还有免费的IDE STM32CUBE。
