科研项目中需要用单片机来完成信号的采集、处理和显示。因参与课题的研究生有一定的STM32基础,最终选择了基于这款芯片来完成目标。我对此一窍不通,但为了能跟学生交流,也为了学生毕业后这个项目能在课题组延续下去,决定自学这门学问。将学习笔记整理出来,主要目的是为了总结提高。教学相长,是之谓也。初学难免幼稚,专家不吝赐教。

1. STM32CubeIDE下载与安装

STM32CubeIDE是ST官方提供的免费开发软件,可以到
https://www.st.com/zh/development-tools/stm32cubeide.html#overview&secondary=st-get-software 下载最新版本。下载后双击进行安装。安装过程很简单,按提示进行安装即可。需要注意的是,目前该软件对中文支持不是太好,所有不要安装在中文目录中。

2.选择工作目录

STM32CubeIDE首次启动会提示选择Workspace。如下图所示。

STM32CubeIDE基于Workspace来管理项目。在每个Workspace目录下都有一个.metadata文件夹,用来保存IDE的设置参数。同一Workspace中的项目共享相同的IDE配置参数,可以一起在STM32CubeIDE中管理。而不同Workspace中的项目则无法同时管理,需要先切换到相应的Workspace,才可以打开和编辑其中的项目。默认的Workspace是C:\Users\计算机名称\STM32CubeIDE\workspace_x.x.x。可以根据需要选择其他位置和命名目录名称。

注意:不要将硬盘根目录或有其他非项目文件的目录作为Workspace,否则IDE清理Workspace时可能会把其他非项目目录删除!!!

3.信息中心和帮助文档

STM32CubeIDE启动后默认会打开Information
Center,如图2所示。这里汇总了常用文档和工具的链接,是一个学习STM32CubeIDE的资料库。左侧4个蓝色的链接提供了4种创建新项目的方式;右侧是官方支持和社区以及相关工具的链接;中部上方是介绍当前版本新增功能的宣传页,下方是相关的文档和入门资源的链接。个人觉得比较重要的两个为:

  • Read STM32CubeIDE Documentation 汇总了大量的帮助文档。PDF格式的文档均存储于本地计算机上。HTML格式的需要在线浏览。
  • STM32 MPU wiki 是一个STM32百科词典。对初学者而言,最重要的可能要数其中的缩写词词典。STM32的软件、文档和各种教程中有大量的缩写词,初学者如读天书,进入这个链接,从右侧选择Glossary,然后按Ctrl+F可以快速查询各种缩写词的全名。

注:Information Center关闭后,可以从Help菜单打开;另一个查缩写词的地方是《The Definitive Guide to the ARM Cortex-M3》,Ctrl+F,反向搜索,附录中一般可以找到。

4. 创建项目-跑马灯

下面以经典的跑马灯为例,说明利用STM32CubeIDE进行开发的一般过程。用到的硬件包括:开发板(任意品牌都可以),DAP仿真器。创建项目主要包括以下步骤:选择芯片、配置引脚、配置时钟、编辑代码、代码编译、调试和运行等。简述如下:

(1)选择芯片

点击Information Center左侧最上方的Start new STM32 project或者从菜单File-New-STM32 Project,会弹出下图所示的STM32 Project对话框。在这里可以选择芯片型号。

在第一个选项卡的左上方,输入芯片的Part
Number。例如我用的是STM32F103ZET6,则输入前11位即可。输入过程中会有个下拉列表进行提示,窗口右下方也会实时更新匹配的芯片列表。该列表会显示芯片的一些基本信息,例如批发价、封装、Flash和RAM大小、IO数量、主频等。从右下方的列表中选定芯片后,从右上方的窗口中可以查看芯片的基本信息,点击上方的链接可以切换栏目,包括特征(Features)、简图(Block Diagram)、文档(Docs&Resources)、参数表(Datasheet)、以及购买方式(Buy)。如下图所示,从这里可以下载芯片资料。

可以点选第一列的五角星将自己常用的芯片加入收藏。以后只要点击窗口左侧左上角的五角星,可以迅速定位芯片。选定芯片后点击Next,会弹出如下图左侧所示的对话框。

在左侧所示的窗口中为项目命名、选择存储路径和选项,然后点Next会弹出图5右侧所示的对话框,选择硬件包版本和代码生成选项。不用担心,如果所选的Firmware版本没有安装,STM32CubeIDE会自动下载并安装。设置完毕点击Finish按钮。如果弹出切换视图(Perspective)的提示框,点击Yes。

(2)配置引脚

接下来软件会根据前述设置进行必要的初始化。初始化完毕会自动打开如图6所示的窗口。CubeIDE集成了CubeMX,右侧实际上是STM32CubeMX的视图,藉此可以用可视化的方式对引脚、时钟等硬件参数进行配置。在窗口中转动鼠标滚轮可以对芯片框图进行缩放。在左下方的搜索框可以输入引脚名称,进行快速定位。点击引脚,弹出的列表中会列出该引脚所有可选功能,只需点选选择所需即可。再次右击引脚,还可以通过Enter
User Label为引脚设置名称,以提高代码的可读性。如下图所示,依次配置用到的所有引脚。

引脚功能配置完成后,点击右侧的分类列表,对引参数进行必要设置。具体到本例,需要设置System
Core条目下的GPIO、RCC、SYS三项,如果用到ADC等其他功能,也需要到相应的条目进行参数设置。点击右侧的System
Core,然后点击GPIO,从右侧上方点选IO引脚,在下方设置IO参数,如下图所示。

本例中PB5的GPIO output level设为Low,PE5的为High。二者均为推挽模式(Ooutput Push Pull),最高输出速度High。如果前面没有设置,引脚的User Lable也可以在这里设置。

GPIO引脚参数设置好以后,点击右侧的RCC,将HSE和LSE均设为Crystal/Ceramic
Resonator,即选择外部时钟。然后,点击右侧的SYS,根据需要选择调试模式。对DAP仿真器,调试模式可选择为Serial
Wire。这一步设置很重要,否则可能会导致DAP仿真器无法下载程序。

(3)配置时钟

点击左侧窗口顶部的Clock Configuration,在如图9所示的位置将时钟HCLK设置为72MHz,输入数值,回车确认。若弹出确认窗口,点Yes即可。

其余参数按需设置,本例无需修改。配置完成后,点击工具栏上的保存按钮,会提示是否生成代码,点击Yes。如果提示切换视图(Perspective),点击Yes。建议同时选中Remember my decision,以后就不会再出现相应的提示了。

(4)编辑代码

代码自动生成完成后,会自动切换到C/C++ Perspective,并自动打开main.c。在main函数中的while循环中添加如下代码:

HAL_Delay(1000);
HAL_GPIO_WritePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, GPIO_PIN_SET);
HAL_Delay(1000);
HAL_GPIO_WritePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, GPIO_PIN_RESET);

其中设置GPIO电平的代码可以从MX_GPIO_Init函数中复制自动生成的代码,然后按需修改。点击右侧的MX_GPIO_Init,找到设置电平的代码复制即可。HAL_Delay是HAL库自带的延时函数,时延单位是ms,注意大小写。

注意:STM32CubeMX自动生成的代码中有许多成对出现的/* USER CODE BEGIN xxx */的注释,这是用户代码的起始标记。用户代码要写在两个成对的标记之间,开发过程中如果回STM32CubeMX中修改了引脚参数,会重新自动生成代码,所有不在用户代码标记区域的代码都会被清空。所以,不要删除和修改这些标记

(5)编译编译

代码编辑完成后,点击工具栏上的锤子图标,进行代码编译。STM32CubeIDE提供两种编译方式,Debug和Release,点击锤子右侧的下拉列表可以进行切换。二者的主要区别是编译器优化程度的不同,Debug模式适用于调试阶段,方便调试过程中定位错误代码和查看变量。调试没问题以后再用Release模式编译后写入芯片。用不同模式编译时会在工作目录下创建相应的Debug/Release文件夹,存储编译结果和中间文件等。

(6)调试和运行

代码编译通过后,可以下载到芯片进行调试和运行。首次调试和运行需要进行配置。点击爬虫右侧的下拉箭头,选择Debug
Configurations....。在弹出的窗口中(如图10所示),从右侧选择最下方的STM32 Cortex-M C/C++
Application后,点击上方工具栏最左侧的图标New launch
configuration,创建调试和运行方案。对同一个项目,可以创建多个方案,比如针对Debug和Release分别创建调试方案。在图10所示窗口右侧,可以为调试方案命名,通过四个标签页设置必要的参数。Main页面可以用默认参数。调试器页面的设置与所选的模拟器有关。对于本例所采用的DAP调试器,设置如下图所示:

几经尝试,发现调试探头得选SEGGER J-LINK,接口SWD,开启Serial Wire
Viewer。连接DAP仿真器到板子,接通电源。点击Debug按钮。代码写入成功后,软件会自动切换到调试视图(Debut
Perspective),如果没有自动切换,点窗口右上角的爬虫图标切换过去。此时可以在程序中设置断点,进行调试。比如,点工具栏上的Resume图标或按F8,应该可以看到跑马灯开始闪烁。对复杂的程序,可以在编辑器中,双击代码行右侧设置断点,并通过Window-Show
View菜单开启所需的调试窗口,进行调试。

5. 常用快捷键

  • F11 Debug
  • Ctrl+B Build All
  • Ctrl+Shift+R 快速查找和打开项目中的文件。支持通配符。
  • Ctrl+Shift+小键盘的 -/+ Editor中字体缩放。
  • Alt+Shift+A 首次按,启动块选模式;再次按,退出。块选模式下可按列选择、复制、粘贴、插入文本。鼠标定位后可用Shift+箭头选择或插入列。
  • Ctrl+Alt+/ 代码自动完成。
  • Ctrl+Shift+L 首次按,弹出快捷键列表;再次按,打开Preferences对话框,配置快捷键。