苦寻无果,往念成株
本章任务
STM32有多种开发方式,如基于寄存器、基于标准外设库(或称“STD库”)、基于HAL库和基于LL库。更多简介可以查看官方的定义,这里不再过多赘述。但需要注意的是一般来说STD库和HAL库是不兼容的。
本章将讲解如何基于HAL库快速开发STM32工程的第一步。工程以自己乱画的PCB为硬件载体,主控芯片为STM32F103C8T6。
编程环境
工程建立:STM32CubeMX Version 6.2.1
第一次出现就简单介绍一下,后面可能就不会再介绍了:这是一款ST公司基于其旗下芯片生态开发的一图形工具,通过分步过程可以非常轻松地配置STM32微控制器和微处理器以及为Arm® Cortex®-M内核或面向Arm® Cortex®-A内核的特定Linux®设备树生成相应的初始化C代码。
其支持的IDE工具有EWARM、MDK-ARM、SW4STM32、TrueSTUDIO、STM32CubeIDE等等,简单点说,就是一个初始化代码生成器,笔者用来建立STM32工程。
工程编辑:Keil uVision V5.30.0.0
也简单点说,就是一个编译代码,支持ST-LINK/J-LINK烧录的嵌入式开发环境。本文开发ST Cortex-M3内核的芯片,需要安装其F1的支持包 Keil.STM32F1xx_DFP.2.3.0.pack ,有条件可以升级到更新更少BUG的Keil.STM32F1xx_DFP.2.4.0.pack。
步骤说明
(1)打开STM32CubeMX环境
再明确一下使用这个环境的用途——建立工程。
基本工程环境配置主要的任务是,没有任务。但至少保证Keil uVision可以顺利编译(Bulid)和烧录(Download)。
打开环境后,在主界面选择通过芯片建立工程的方式建立工程。
(2)选择目标芯片
在左侧的“Part Number”中键入关键字“F103C8”,可以查找到对应的芯片,在右下栏“MCUs/MPUs List:x item”中双击对应的芯片,如下图所示位置。即可完成工程目标芯片选择,可跳转到下一步界面中。
(3)配置下载方式※
SWD下载方式为个人开发常用下载流派,如果忘记了请参考《STM32芯片救砖指南》(有空补)。
在左侧System Core中选择SYS项,在右侧展出的设置栏“SYS Mode and Configuration”中配置Debug模式为Serial Wire,即常见的SWD下载模式/四线下载方式,可以看到配置完成,芯片引脚PA13和PA14被标识为已配置。其中PA13为SWDIO,PA14为SWCLK。
(4)时钟配置
不必要,但可以做。
笔者习惯芯片跑到最高频,STM32F103C8T6最高支持72MHz主频,需要选择外部晶振(内部晶振最高跑64MHz主频)。这里因为板子设计时使用外部无源晶振,因此选择Crystal/Ceramic Resonator,如果是有源晶振,或者外部时钟输入,选择BYPASS Clock Source,即旁路时钟源,可以到Clock Configuration中查看二者区别,最显而易见的区别就是Crystal/Ceramic Resonator是双向的,而BYPASS Clock Source是单向输入的,所以硬件中若使用有源晶振或者外部时钟信号输入,其应该连PC14或PD0,即RCC_OSC32_IN或者RCC_OSC_IN。
勾选完成后切换到Clock Configuration选项卡,在HCLK(MHz)中直接键入72并回车完成一键配置。一键修改过程中,可能会出现一些弹窗,提示您当前的其他设置不能满足72MHz的配置,巴拉巴拉的…点OK就可以。
上图为配置前时钟树设置,下图为配置后时钟树设置。
(5)其他配置
不必要,但可以做。
这一个配置是为了检验代码是否成功烧录到目标芯片中的重要环节。
查看PCB设计原理图,发现有一些LED,可以做做文章。
返回引脚配置选项卡,将RGB1的三个引脚配置为GPIO_Output,并修改IO的一些属性:
(6)工程信息管理
最后一环,比较重要,注意一些细节,免功亏一篑。
在这个选项卡中,含有三个子选项卡,其中Project选项卡,按下图配置,若带有中文,其实也没有什么大不了的,只是芯片启动文件startup_stm32f103xb.s可能无法拷贝到所选择的路径下,可能会造成无法编译成功,各种错误神神齐齐。
代码通用设置页面,可以参考笔者配置
更多配置,暂时用不上。在完成所需配置后,可以生成/更新工程
生成成功,弹窗提示…successfully…。一般来说,中间的Open Project慎重点击。
这里需要注意若工程已经打开,建议直接Close,再于Keil uVison5中更新代码更改。
可以在Open Folder后,在对应目录中找到所选IDE的工程文件,再进行接下来的环节。
(7)编译工程
进来第一步,啥也不改,好习惯,直接编译一次。
0 Erros(s),0 Warning(s)
(8)点灯编程
双击打开main.c文件,在第99行书写用户代码:
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_GPIO_TogglePin(RGB1_R_GPIO_Port, RGB1_R_Pin);
HAL_Delay(300);
HAL_GPIO_TogglePin(RGB1_G_GPIO_Port, RGB1_G_Pin);
HAL_Delay(300);
HAL_GPIO_TogglePin(RGB1_B_GPIO_Port, RGB1_B_Pin);
HAL_Delay(300);
}
/* USER CODE END 3 */
重复上一步的编译步骤,确保工程无错误。
(9)配置下载
打开下载配置窗口,进行如下配置:
点击确定,ok,保存。笔者使用ST-LINK工具进行程序烧录下载,如果使用其他工具,在Debug选项卡中,Use:下拉列表中选择其他工具选项。
重新编译后,进行下载烧录,烧录完成可以在Build Output中查看到烧录完成信息。
附录
点灯完成,RGB六色交替