STM32 HAL库学习笔记 - 从CubeMX创建工程

STM32CubeMX是ST官方开发的一款很好用的软件,主要用于STM32系列单片机的硬件驱动层的配置。网上也有一些关于STM32CubeMX的相关教程,对它的相关操作进行说明。
从今天起,小柯希望能将自己从CubeMX入门STM32 HAL库的学习笔记分享给大家,与大家一起探索其中的奥秘~

1. 下载安装STM32CubeMX

对于STM32CubeMX(以下简称CubeMX)的安装与使用方法,小柯发现,知乎上有一位朋友有比较全面的讲述。在此,小柯也将链接分享给大家,希望对大家有用!同时,ST官网上也提供了免费的最新版CubeMX,只要注册一个账号即可下载。小柯也为大家奉上链接!

STM32CubeMX系列教程
STM32CubeMX官方下载地址

2. 实验准备

  1. STM32F103C8T6最小系统板 x 1
  2. ST-Link x 1
  3. STM32CubeMX
    STM32F103C8T6与ST-Link

3. 创建工程

今天,小柯选用了比较便宜且普遍使用的STM32F103C8T6。这款单片机最小系统板的在某宝上大约十几元,非常适合用来入门和玩耍。

其实CubeMX对不同型号的单片机的硬件驱动层配置大同小异,学习了一个型号之后,很容易在其他型号举一反三。这也是小柯喜欢CubeMX的原因之一。

3.1 打开CubeMX

打开CubeMX,你会看到以下界面。点击箭头所示按钮,开始创建。
CubeMX开始页面

3.2 选择单片机

点击之后,CubeMX会跳出单片机选择界面。按如下三步选择自己想要的单片机型号,既可开始工程。

注:如果是第一次使用某一型号,需要下载对应的固件库。只要按照提示确认下载即可。

选择单片机型号
然后我们就进入配置的主页啦!

4. 调试方式选择

首先,我们要对系统调试方式进行配置。

在这个实验中,我们选用了ST-Link作为调试工具。所以,我们需要在 “System Core --> SYS --> Debug” 栏中选择 “Serial Wire (串行)” 的调试方式。

选择调试方式

注:如果左侧的菜单栏是按照字符排序,则有可能没有 System Core 菜单。对此,我们只要直接找到 SYS 选项就可以了。

选择之后,右侧芯片上的 PA13 和 PA14 引脚会变成绿色,这就是我们 ST-Link 需要接的引脚。

5. 时钟配置

对于单片机系统来说,最主要的就是时钟配置。好在STM32系列的单片机基本上都有内部时钟,即使我们保持复位值,系统也可以正常运行。

不过,一般单片机的内部时钟源精度不是特别高。如果对时钟精度要求高的话,那就需要用到外部晶振。在此,STM32提供了有源晶振和无源晶振两种时钟源的接入方式。

由于在此实验中,我们并没有对时钟精度的需求,所以小柯就保持了其原有的配置。对于单片机时钟配置的方法,小柯也会在后续笔记中跟进,敬请关注。

6. 项目管理

CubeMX的 “Project Manager” 栏目提供了详细的项目配置。

小柯选用 Keil MDK-ARM 作为编译器,故做了如下配置。
工程配置方法
同时,CubeMX还提供了一些代码生成的选项。小柯根据个人习惯,也对它进行了调整。
代码生成配置
至此,项目配置就完成了!

7. 引脚配置

让单片机驱动一个 LED 灯,并使他周期性闪烁,可以算作是单片机领域的 “Hello World” 工程了。在此,小柯需要利用已经接在 PC13 引脚的 LED 进行显示。如果核心板上没有相应 LED, 可以自己外接一个。

配置引脚时,我们只要选中 PC13 引脚,选择 “GPIO_Output” 模式即可。为了方便后续操作,小柯给 PC13 引脚自定义一个标签 “LED”。
引脚配置
引脚标签配置

8. 生成代码

最后,只要点击窗口右上方的 “GENERATE CODE” 就可以生成代码了。

如果是第一次使用,此过程可能需要下载固件

生成代码
生成完成后,点击 “Open Project”,即可自动打开 Keil。
打开项目

9. 编辑小灯代码

网上有很多关于小灯闪烁的代码,但都大同小异。主要就是在 main 函数的 while(1) 循环中反转引脚并延时。若要以此方式实现,我们只需要找到 main.c 文件 main 函数中的 while(1) 循环,根据代码提示,在 /* USER CODE BEGIN 3 // USER CODE END 3 */中间插入如下代码即可。

		HAL_Delay(500);                                 //延时500ms
		HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);     //对LED所对应引脚输出反转

插入代码

不过这种方式并不能一劳永逸。当插入其他代码后,小灯的闪烁频率就不再是 1Hz 了。

为此,小柯找到了系统定时器中断的回调函数 SysTick_Handler(),在 “stm32f1xx_it.c” 的最后部分。

在默认配置中,SysTick_Handler() 函数将每1ms被调用一次。我们对其做如下改变,就能实现小灯 1Hz的闪烁了。

我们先删除上面在 main 函数中写的两行代码,然后在中断回调函数中加入如下代码:

  /* USER CODE BEGIN SysTick_IRQn 0 */
	millis++;
	if(millis % 500 == 0)
			HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
  /* USER CODE END SysTick_IRQn 0 */

其中 millis 表示 milliseconds, 即千分之一秒。

为了能在全局都可以用 millis 变量,我们可以分别在 “main.c” 和 “main.h” 中定义和声明该变量。

由于小柯没有在 main.h 文件中找到相应的声明变量的位置,于是借用了声明常数的位置。

//以下代码在main.c文件中
/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */
uint32_t millis = 0;		//milliseconds -- 千分之一秒
/* USER CODE END PV */

//以下代码在main.h中
/* Exported constants --------------------------------------------------------*/
/* USER CODE BEGIN EC */
extern uint32_t millis;		//milliseconds -- 千分之一秒
/* USER CODE END EC */

10. 配置下载方式

点击 Keil 窗口顶部的 “Options for Target” 图标,进入配置界面。
Keil配置
选择 “Debug” 标签,选择用 ST-Link Debugger 调试。
Dubugger配置
并点击 Setting, 在 Flash Download 栏中勾选 “Reset and Run”,使单片机在烧录后自动重置运行。
Download设置

11. 烧录验证

将单片机的 PA13 与 PA14 引脚分别与 ST-Link 的 SWDIO 和 SWCLK 相连,并为单片机供电。依次点击 “Build” 和 “Download” 按钮进行烧录。
烧录之后,单片机自动运行,小灯开始以 1Hz 的频率开始闪烁。

STM32 HAL库学习笔记 - 从CubeMX创建工程 - 小灯闪烁 - 16

12. 注意事项

  1. 在编写小灯闪烁代码中,小柯介绍了两种方式,请不要同时使用。
  2. 在编辑所有由CubeMX生成的文件时,必须在其规定的位置添加用户代码。否则重新生成项目时,那些代码将被复原。为防止被复原,可以在 CubeMX 的 “Project Manager --> Code Generator” 中勾选 “Backup previously generated files when re-generating.” 如果是自己创建的文件,则不需要遵循该规则。
  3. 单片机的两个 BOOT 引脚必须接地。

13. 联系小柯

如果您对小柯或者小柯的文章有任何建议或者想法,都可以通过邮箱 [email protected] 来联系小柯!小柯看到后一定尽快回复,谢谢!

猜你喜欢

转载自blog.csdn.net/weixin_43896435/article/details/106936986