本文开发环境:
- MCU型号:STM32F051R8T6
- IDE环境: MDK 5.18
- 代码生成工具:STM32CubeMx 5.0.1
本文内容:
- 初始化IO口
- IO口的读和写
当我们安装好STM32CubeMx以及芯片对应的固件包之后,就可以开始一个新的工程。对于一个MCU来说,IO口的读和写是简单的,通常作为一个单片机裸机中外设开发的第一步。本文演示如同通过CubeMx来生成一个初始化IO口工程,并实现IO口的读写。
IO口工程的建立
本文以初始化 PA0 和 PC9 为例,其中,PA0作为输入IO口,PA9作为输出IO口,分别演示IO的读和写操作。建立一个工程主要有以下几个操作:
- 选择芯片
- 初始化RCC,选择系统时钟
- 开启 SW 调试功能
- 初始化外设
- 生成工程
- 编写用户代码
接着下来分别介绍这些步骤的具体操作。
选择芯片
建立工程的第一步,有2种方式可以选择:选择芯片和选择板子,这里只介绍选择芯片的方式。
点击Start My Project from Mcu 下的 ACCESS TO MCU SELECTOR,如下图所示:
确定方式后,你可以通过多种方法来确定一个芯片,比如Core,Series等等,但是通过Part Number来确定是很便捷的。首先,我们在Part Number的搜索框中输入STM32F051R8,得到了该芯片系列,接着在MCUs List列表中选择STM32F051RBTx(如果点到 STM32F0DISCOVERY这样则变成通过选择板子而非选择芯片的方式来创建工程了),步确定具体芯片。由于芯片型号的最后一个字母表示包装方式,对生成代码没有影响,所以这里用x来表示可以是任何值,当然也包括本文的“6”。
当我们选中STM32F051R8Tx后,MCU 列表上的简介窗口出现了该芯片的信息,右上角的 Start Project也变成了有效按钮,即可点击状态。如下图所示:
点击Start Project就可以开始一个新的工程,进入新界面:
初始化RCC,选择系统时钟
MCU有多种时钟源可以选择,如外部高速时钟(HSE),外部低速时钟(LSE),还有内部时钟等。本文硬件平台已经接入一个8M的晶振。这里以外部高速时钟作为系统时钟,首先展开System Core,点击RCC,在Mode栏的 High Speed Clock(HES)选项框选择Crystall/Ceramic Resonator,如果你的板子没有外部晶振,那么也可以使用内部时钟。其余的保持默认,可以看到右侧芯片引脚PF0,PF1已经变成绿色,表示已经使用。如下图所示:
现在我们只是使能了外部时钟,接着我们进入Clock Configuration来配置系统的时钟源为外部时钟,如下图所示:
进入Clock Configuration,可以看到系统默认使用的是内部时钟源,如下图所示:
这里我们以外部高速时钟为例,具体配置如下图所示,实心表示点选择:
可以看到,我们还配置了PLL的倍率(绿框部分),提高系统时钟至最高的48Mhz。至此我们便配置好系统的时钟源。
开启SW调试功能
初始化外设
配置好每一个工程都需要配置的系统时钟源,我们便可以配置外设,外设则根据用户所需来配置,以本文为例,我们回到 Pinout & Configuration配置选项卡中,展开System Core,接着选择GPIO,这样就可以开始配置在Pinout view窗口中图形化配置IO口了。如下图所示:
本文以PC9作为输出IO口,PA0作为输入IO口,所以分别在点击PC9和PA0,选择对应的模式,如下图所示:
当我们选择好IO口模式后,可以发现 GPIO Mode and Configuration窗口中多了2个IO选项,我们可以点击选择它们,进行进一步的配置,以PA0为例,如下图所示:
输入口的模式我们选择浮输入,User Lable是用户自定义的,因为我的板子PA0接了一个按键,所以我命名为button。
PC9的配置也是同理,这里输入我们选择了推挽输入,如下图所示:
至此我们就完成了IO口的初始化配置,最后我们就可以生成工程了。
生成工程
选择 Project Manager 工程管理来生成工程需要的一些配置:
如下图所示,我想写入工程的名字,存储的位置,已经生成什么IDE的工程,本文开发IDE为MDK5,所以在Toolchain/IED中选择MDK-ARM V5,这里需要你对应的IDE既可。具体如下图所示:
之后我们配置好了工程,点击右上角的GENEARTE CODE就可以生成一个工程了:
等待工程生成:
生成以后,可以直接打开工程:
这样便打开了一个工程,展开Application/User,进入main函数,可看到工程已经生成一些代码:
编写用户代码
当然,由于我们以后可能会用工具继续生成代码,那么不可避免的,CubeMx会修改main.c或其他文件,所以如果我们代码插入的地方不合适,就会被覆盖掉,在CubeMx工程中,用户代码需要插入在 带 BEGIN 和 END 注释的区域之中,这样CubeMx就可以识别到,在此生成代码时候,不会修改到这部分代码。
我们选择在 USER CODE BEGIN 3 和 USER CODE END 3中添加以下代码:
if(HAL_GPIO_ReadPin(button_GPIO_Port, button_Pin)) //读取PA0口的值,并判断
{
HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET); //值为非0,拉低PA0
}
else
{
HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET); //值为0,拉高PA0
}
}
如下图所示:
编译下载程序后,可以发现:LED灯亮了。当按下按键后,LED暗。弹起按键后,LED又恢复点亮状态,这样我们就完成了一个简单的IO初始化工程,接下来我们可以用STM32CubeMx来配置串口(uart,usart),定时器(TIM,PWM),外部中断)EXIT)等等。