系列教程-定时器原理与配置
前情回顾
通过前面几篇的学习,见目录,我们对STM32的基本架构以及原理有了一定了解,对GPIO的概念了有一定的认识,接下来通过一个简单的点灯项目,进步学习STM32编程。
一 项目要求
1 选用STM32F103R6T单片机;
2 在该单片机的引脚PA1引脚连接一个LED灯;
3 每个一秒控制一次LED等的亮灭。
二 项目实战
2.1 CubeMX篇
进入界面后按照从左到右的顺序进行项目配置。
- 配置引脚信息
在STM32CubeMX中选择Pintout view选项卡,借助图形化界面快速配置STM32F103R6T的引脚工作模式。
单击PA1引脚选择“GPIO_Output”选项作为单片机的输出引脚,同时从图中可以看出单片机有些引脚是专用引脚,作为供电、接地等使用。
此时会在界面的左侧出现下图红色区域标志,这里需要设置该GPIO引脚的输出模式以及输出的速率等信息。
单击列表中的PA1所在行,此时界面出现该引脚的详细设置界面,如下图所示。
其中“GPIO mode” 这里设置为推挽输出;
“GPIO output level”默认单片机上电后该引脚的输出电平,这里设置为高电平输出,即3.3V输出;
“PIO maximum output speed”选项仅针对通信外设有用(如复用为串口通信需要设置),本项目中设置为最低档降低芯片功耗;
User label的作用是为PA1这个引脚起个别名,方便记忆。
- 配置时钟信息
接着点这里的“Clock Confinguration”配置时钟,如下图所示。
在出的如下界面中可以设置对应总线的时钟频率。
- 生成项目代码
在ProjectManager选项卡选中后,出现如下的界面。界面左侧有三个功能按钮,接下来按照上从到下的顺序配置对应项。
首先切换到“Project”中,设置项目代码的存放路径;
其次,切换至“Code ”中,这里设置生成的代码中需要包含那么些文件代码。这里我们勾选拷贝所有代码到工程文件夹下面,实际工程中,只选添加必须的即可。
- 生成代码
点击界面左上角“GENERATE CODE”,生成代码。
如下图所示,生成代码。
代码生成之后,界面弹出对话框,选择打开所在目录,看下生产的代码的内容。
2.2 keil 篇
2.1 main.h文件
在生成的文件夹中寻找“MDK-ARM”文件夹,双击其中的keil工程,打开自动生成的工程文件。
keil工程打开后,左侧的项目导航树种列出了该型单片的所有外设库。
找到项目中的“main.c”文件,打开进入main文件进行编辑。
main.c文件中首先引入了两个头文件。
#include "main.h"
#include "gpio.h"
main.h头文件中,定了LED_Pin 来标识PA1引脚,这是因为我们在上面配置该引脚时为其配置了名为“LED”的别名
故在自动生成的代码中在main.h文件中自动添加了该代码与之前配置保持一致。
#define LED_Pin GPIO_PIN_1
#define LED_GPIO_Port GPIOA
2.2 main.c文件
生成的main函数是整个单片机的执行函数,即单片机从main函数的第一行语句开始执行。首先执行的是HAL_Init()函数。
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
int i=0;
while (1)
{
}
}
这里我们直接分析调用的第三个函数“ MX_GPIO_Init()”,这个函数是放在gpio.c文件中,主要功能是完成PA1引脚的初始化,直接从左侧的文件树中找到gpio.c文件,该函数的代码如下。
void MX_GPIO_Init(void)
{
//定义GPIO结构体变量
GPIO_InitTypeDef GPIO_InitStruct = {0};
//总线时钟使能
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOA_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
//配置GPIO结构体变量的值
/*Configure GPIO pin : PtPin */
GPIO_InitStruct.Pin = LED_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
HAL_GPIO_Init(LED_GPIO_Port, &GPIO_InitStruct);
}
HAL_GPIO_Init(LED_GPIO_Port, &GPIO_InitStruct)该语句的作用是将定义的GPIO结构体参数与PA1引脚关联起来,具体就是程序按照GPIO结构体参数自动配置PA1相对应的寄存器。
从上面函数可知,GPIO的配置顺序如下:
1)使能对应总线APB2的时钟;
2)定义GPIO_InitStruct结构体,并设置对应的值;
3)调用HAL_GPIO_Init完成自动配置PA引脚族相对应的寄存器。
2.3 添加点灯代码
main函数执行到while(1)后,进入死循环,我们的程序代码就放到这个while循环中。在while循环中添加如下四行代码。这里用到了两个新的HAL库函数HAL_GPIO_WritePin和 HAL_Delay。
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
int i=0;
while (1)
{
HAL_Delay(1000);
HAL_GPIO_WritePin(LED_GPIO_Port, GPIO_PIN_1, GPIO_PIN_RESET);
HAL_Delay(1000);
HAL_GPIO_WritePin(LED_GPIO_Port, GPIO_PIN_1, GPIO_PIN_SET);
}
}
HAL_Delay在API手册中给出函数定义,该函数主要用于延时。
HAL_GPIO_WritePin函数用于设置PA1引脚的输出状态,API中给出函数定义如下:
函数的第一个参数为IO引脚族,第二个参数为该IO引脚族内的引脚编号,第三个参数可传入GPIO_PIN_RESET和GPIO_PIN_SET两个值。
GPIO_PIN_RES,负责置0,即IO引脚输出地电平,0V;
GPIO_PIN_SET负责置1,即IO引脚输出高电平,3.3V。
文末送出了查找需要用的的HAL库函数API手册的方法。
2.4 编译工程
点击下图中的编译按钮或使用快捷键F7进行程序编译。
三 获取HAL库函数
首先打开CobeMX软件找到“HELP”菜单,按照图中步骤选中要下载的用户手册。
然后找打下载路径
最后,从下载目录中获取HAL库API文件。