第5章—STM32工程创建

开发板:YS-F1PRO

处理器型号:stm32f103zet6

keil版本:5.38.0.0

CubeMX版本:6.3.0


STM32的编程方法

STM32CubeMX创建STM32工程

1.工程初步建立

方法一:依次点击"File->New Project"即可建新工程。如果之前打开过的话,左侧最近打开的过程一列会有打开的工程列表,直接点击这些工程也可以打开。

方法二:直接点击 ACCESS TO MCU SELECTOR。具体操作如图所示。

点击新建工程后,可能会弹出如图的窗口,提示需要联网下载一些文件,可能等待时间比较长,可以直接选择取消即可。我们可以通过关闭自动更新设置来禁止弹出这个窗口。

之后都可以进入芯片选型界面,如图所示。

选择具体的芯片型号,如图所示。

鼠标双击选择的芯片型号后,弹出主设计界面,如图所示。

芯片的电源引脚均为浅黄色表示

2.GPIO引脚配置

目的是要点亮板子上的三个LED灯,原理图如图所示

使用 STM32CubeMX 工具配置 STM32F1 的 GPIO 口。这里我们回到 STM32CubeMX 的 Pinout&Configuration 选项,在搜索栏输入 PB0 后回车,可以在引脚图中显示位置,如下图所示:

接下来,我们在下图引脚图中点击 PB5,在弹出的下拉菜单中,选择 IO 口的功能为 GPIO_Output。操作方法如下图所示:

同样的方法,我们配置 PG6、PG7选择功能为 GPIO_Oput 即可。设置好即可看到引脚从灰色变成绿色,标识该管脚已经启用。这里我们需要说明一下,如果我们要配置 IO 口为外部中断引脚或者其他复用功能,我们选择相应的选项即可。配置完 IO 口功能之后,还要配置 IO 口的速度,上下拉等参数。这些参数我们通过 System Core 下的 GPIO 选项进行配置,如图所示

点击想配置的引脚,然后在下方的框里配置即可

User Label 用户符号,我们可以给 PB50起一个别的名字 LED1。

在配置时会出现感叹号是因为ADC用到的引脚设置成了其他模式,与ADC功能时的引脚模式不对应。

3.HSE和LSE时钟源设置

设置时钟源 HSE 和 LSE。如图所示。

标号④和⑤,我们都选择了 Crystal/Ceramic Resonator,表示外部晶振作为它们的时钟源。开发板的外部高速晶振和外部低速晶振分别是:8MHZ 和 32.768KHZ,所以 HSE 时钟频率就是 8MHZ,LSE 时钟频率就是 32.768KHZ。

选项 Master Clock Output 1 用来选择是否使能 MCO1 (PA8)引脚时钟输出

4.时钟树配置

点击 Clock Configuration 选项卡即可进入时钟系统配置栏

进入 Clock Configuration 配置栏之后可以看到,界面展现一个完整的 STM32F1 时钟系统框图。从这个时钟树配置图可以看出,配置的主要是外部晶振大小,分频系数,倍频系数以及选择器。在我们配置的工程中,时钟值会动态更新,如果某个时钟值在配置过程中超过允许值,那么相应的选项框会红色提示。

配置一个以 HSE(外部高速时钟,HSI为内部高速时钟,也为8M,但用的很少,因为不稳定) 为时钟源,配置 PLL (锁相环/倍频器)相关参数,然后系统时钟选择 PLLCLK为时钟源,最终配置系统时钟为 72MHz

把系统时钟配置分为七个步骤,分别用标号 1~5 表示,详细过程为:

① 时钟源参数设置:我们选择 HSE 为时钟源,所以我们要根据硬件实际的高速晶振频率(这里我们是 8MHZ)填写。

② 时钟源选择:我们配置选择器选择 HSE 即可。

③ PLL 倍频系数 PLLMUL 配置。倍频系数 PLLMUL 我们设置为 9。

④ 系统时钟时钟源选择:PLL,HSI 还是 HSE。我们选择 PLL,选择器选择 PLLCLK 即可。

⑤ 经过上面配置以后此时 SYSCLK=72MHz。

经过上面的 5 个步骤,就配置好 STM32F1 的系统时钟为 72MHz。接下来我们还需要配置AHB、APB1、APB2 和 Systick 的分频系数,为 STM32 的片上外设或 M3 内核设置对应的工作时钟,为后续使用这些硬件功能做好准备。配置如下图所示:

AHB、APB1 和 APB2 总线时钟以及 Systick 时钟的来源于系统时钟 SYSCLK。其中 AHB总线时钟 HCLK 由 SYSCLK 经过 AHB 预分频器之后得到,如果我们要设置 HCLK 为 72MHz(最大为 72Mhz),那么我们只需要配置图中标号⑥的地方为 1 即可。得到 HCLK 之后,接下来我们将在图标号⑦~⑨处同样的方法依次配置 Systick、APB1 和 APB 分频系数分别为 1、2 和 1。

注意!systick固定为72MHz,配置完成之后,那么HCLK=72MHZ,Systic=72MHz,PCLK1=36MHz,PCLK2=72MHz,这和之前例程配置的时钟是主频一样的。

以上方法是手动计算的方法,是为了帮助我们更好地去认识 STM32 时钟的配置方法,当然CubeMX 也提供了更简单的方法:在上图的"HCLK(MHz)"位置,实际上是可以编辑的。我们直接输入我们要的主频,这里是 72Mzh,按回车键,CubeMX 会帮我们提供一种设置主频和其它时钟的建议,选择是后会由软件自动配置好,当然只有启用外部的晶振后才能配置到72Mhz 的时钟。

在第3步配置时钟源时,如果使能了Master Clock Output,则可以配置此处,选择输出的时钟的类型

5.配置Debug选项

由于 CubeMX 默认把 Debug 选项关闭了,这样会给我们带来麻烦:用 CubeMX 生成的工程编译下载一次后,后续再次下载就会提示错误,因此我们要把 Debug 选项打开。这里有多种选择,我们设置成图所示的情况即可。

如果已经不小心关闭了 Debug 选项,那么下次下载的时候按住复位键,等到工程提示的时候松开复位键即可,因为 STM32 的芯片默认复位上电时的 Debug 引脚功能是开启的。

6.生成工程源码

选择 Project Manager-> Project选项用来配置工程的选项,我们了解一下里面的信息。

Project Name:工程名称,填入工程名称(半角,不能有中文字符)

Project Location:工程保存路径,点击 Browse 选择保存的位置(半角,不能有中文字符)

Toolchain Folder Location:工具链文件夹位置,默认即可。

Application Structure:应用的结构,选择 Basic(基础),不勾选 Do not generate the main(),因为我们要其生成 main 函数。

Toolchain/IDE:工具链/集成开发环境,我们使用 Keil,因此选择 MDK-ARM,Min Version 选择 V5.27,这里根据 CubeMX 的版本可能会有差异,我们默认使用 V5 以上的版本即可。

Linker Settings 链接器设置:

Minimum Heap Size 最小堆大小,默认(大工程需按需调整)。

Minimum Stack Size 最小栈大小,默认(大工程需按需调整)。

MCU and Firmware Package 是 MCU 及固件包设置:

MCU Reference:目标 MCU 系列名称。

Firmware Package Name and Version:固件包名称及版本。

勾选 Use Default Firmware Location,文本框里面的路径就是固件包的存储地址,我们使用默认地址即可。(这里因为我有两个版本的固件包,所以它默认使用最新的,这个关系不大,就用新的)。这样工程生成的设置就设置好了,如图所示。

Advanced和Basic创建的工程文件的区别如下:

打开 Project Manager-> Code Generator 选项,Generated files 生成文件选项,勾选 Generate peripheral initialization as a pair of '.c/.h'files per peripheral,勾选这个选项的话将会将每个外设单独分开成一组.c、.h 文件,使得代码结构更加的清晰,如图所示

由于 CubeMX 默认勾选了复制所有的库,即工程中不使用到的代码也会复制进来,为了节省 CubeMX 生成工程的空间,我们勾选生成工程时只复制用到的库(这一步是可选操作,大家根据自己的实际选择),如图所示:

保存工程并生成工程

工程架构如下:

Drivers 文件夹存放的是 HAL 库文件和 CMSIS 相关文件。

Inc 文件夹存放的是工程必须的部分头文件。

MDK-ARM 下面存放的是 MDK 工程文件。

Src 文件夹下面存放的是工程必须的部分源文件。

Template.ioc 是 STM32CubeMX 工程文件,双击该文件就会在 STM32CubeMX 中打开

7.编译

在编写用户程序之前,首先我们打开生成的工程模板进行编译,如果配置的 CubeMX 的工程名和路径名不含中文或中文字符,按上述步骤生成的工程就可以直接编译通过了。

注意:STM32CubeMX 生成的 main.c 文件中,有很多地方有"/* USER CODE BEGIN X /"和"/ USER CODE END X */"格式的注释,我们在这些注释的 BEGIN 和 END之间编写代码,那么重新生成工程之后,这些代码会保留而不会被覆盖。

8.添加用户程序

生成的代码编译通过后,可编写用户自己的逻辑程序,最后再编译、下载验证

相关推荐
llilian_1610 小时前
总线授时卡 CPCI总线授时卡的工作原理及应用场景介绍 CPCI总线校时卡
运维·单片机·其他·自动化
禾仔仔11 小时前
USB MSC从理论到实践(模拟U盘为例)——从零开始学习USB2.0协议(六)
嵌入式硬件·mcu·计算机外设
The Electronic Cat12 小时前
树莓派使用串口启动死机
单片机·嵌入式硬件·树莓派
先知后行。15 小时前
常见元器件
单片机·嵌入式硬件
恒锐丰小吕15 小时前
屹晶微 EG2302 600V耐压、低压启动、带SD关断功能的高性价比半桥栅极驱动器技术解析
嵌入式硬件·硬件工程
Dillon Dong16 小时前
按位或(|=)的核心魔力:用宏定义优雅管理嵌入式故障字
c语言·stm32
Free丶Chan17 小时前
dsPIC系列-1:dsPIC33点灯 [I/O、RCC、定时器]
单片机·嵌入式硬件
v先v关v住v获v取18 小时前
塔式立体车库5张cad+设计说明书+三维图
科技·单片机·51单片机
恒锐丰小吕18 小时前
屹晶微 EG2106D 600V耐压、半桥MOS/IGBT驱动芯片技术解析
嵌入式硬件·硬件工程