零基础入门STM32编程——点灯(HAL库)(六)

系列教程-定时器原理与配置

系列教程--GPIO原理与配置原则

前情回顾

通过前面几篇的学习,见目录,我们对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文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值