SM32CubeMX是ST公司推出的图形化工具,用于生成的工程的初始化代码。节约了搭建工程和配置芯片初始化的时间。现在记录一下使用STM32CubeMX工具创建工程,实现流水灯的功能。
STMCubeMX的安装十分简单,只要在ST官网下载安装即可,地址如下:https://www.st.com/content/st_com/zh/products/development-tools/software-development-tools/stm32-software-development-tools/stm32-configurators-and-code-generators/stm32cubemx.html
官网下载需要注册ST账号,提供百度网盘链接:https://pan.baidu.com/s/1un1z8CQ0g2JalFpjWHM62A 提取码:xtld
下载完成后进入软件界面如下:
点击画圈处开始创建第一个工程。第一次会加载一些资源,等待片刻即可。
如果使用的是ST公司推出的开发板套件,可以选择第二个,初始化开发板的所有管脚。这里我使用的是一块stm32的最小系统板,使用芯片型号为stm32f103rct6。
按照上图顺序,选择好芯片型号。点击Start Project,进入下个界面。
在这个界面,我们可以进行芯片的管脚配置,系统时钟的设置,芯片的一些基本外设,如TIME,USART,ADC,IIC,SPI都可以单独的进行配置。
对于实现流水灯功能来说,虽然不会配置太多的东西,但可以通过它来掌握一些基础的配置。
- 第一步,配置时钟:
在System Core中选择RCC,选择HSE(外部高速时钟)为Crystal/Ceramic Resonator(晶振/陶瓷谐振器),做完这一步可以看到在右侧芯片中与外部晶振连接的两个管脚由灰色变成绿色(绿色代表该GPIO管脚已被使用,灰色代表没有使用,黄色代表该GPIO已被用于其他功能)。选择这菜单栏中的Clock Configuration,进入系统时钟树。
时钟的配置也是图形化界面,根据项目需求,各种外设使用的时钟都可以直接配置。流水灯的实现不需要考虑太多,stm32最高时钟为72Mhz,直接在HCLK处输入72即可自动完成配置。
- 第二步,配置GPIO:
点击管脚PC3,在菜单中选择GPIO_Output,依次配置流水灯所需的其他管脚,我这里使用的是PC1,PC2,PC3。可以在左侧GPIO中看到每个管脚的配置,输出模式默认的是推挽输出,因此不需要做改动。
习惯上会配置一下USART1,用于串口调试,USART1一般系统板上都会与usb接口连接在一起,可以通过数据线,与上位机通讯。当然,实现流水灯不需要这个功能。
在Connectify中,选择USART1,模式选择Asynchronous(异步),即可完成配置,下方可以修改波动率之类的设置。
- 第三步,配置调试接口:
这一步很重要,不配置调试接口,生成的代码将无法烧录和调试。在System Core中选择SYS,Debug根据需求选择,我使用的SW接口,选择Serial Wire完成配置。
- 最后一步,工程设置和代码生成:
在Project Manger界面中选择Project,按要求填入相关信息,建议地址不要有中文字符和空格。SM32CubeMX提供主流的编译器代码生成,推荐使用ST自家推出的STM32CubeIDE,这是一款免费的编译器。下载方式如同SM32CubeMX,官网搜索下载即可,这里提供百度网盘链接:https://pan.baidu.com/s/1Z7xJTnGaL1nAUZB8O5lxgA 提取码:yn89
注意,SM32CubeIDE基于JAVA,因此在下载之前要先安装配置好JAVA的运行环境。
有个小技巧,可以在Code Gendertor中选中Generate peripheral initialization as a pair of '.c/.h' files per peripheral ,这会单独生成刚刚配置的gpio.c和usart.c以及对应的头文件,如果有其他外设的配置也会单独显示出来。
最后,点击“GENERATE CODE”,生成对应的工程文件。
这是在STM32CubeIDE打开的工程文件。
在编写用户代码是应该在注释/* USER CODE BEGIN */和/* USER CODE END XX*/之间,这样在再次生成工程文件时不会删除用户代码。建议第一次生成工程后先编译一下,确保初始化代码无误。
在while(1)中加入流水灯代码即可实现循环流水灯功能。代码如下:
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,GPIO_PIN_SET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,GPIO_PIN_RESET);
HAL_Delay(500);
}
/* USER CODE END 3 */
至此,流水灯功能全部实现。