当前位置:   article > 正文

【三】零基础上手HAL库之—GPIO点灯_hal_gpio_togglepin

hal_gpio_togglepin

【三】零基础上手HAL库之—GPIO点灯

3.1前言

我们已经大致的了解了Cubemx软件界面的一般操作,懂得如何新建工程和使用步骤了,接下来我们正式进入使用Hal库开发的旅程,这是一个惊心动魄的时刻,为什么呢?在使用Hal库的同时你会感觉到其优势性,开发效率大大提高带来的快感,来吧我们先点灯。

前期准备

  • STM32各类型的板子(本人使用F103Rc和F407ZE)。
  • CubeMx软件,Keil_IDE。
    流水灯

3.2 LED流水灯

我们先来看看板子对应流水灯的原理图:

image-20210831143330844

采用共阴极连接的LED灯,只有当引脚输出高电平时,发光二极管正向导通发光。

我们知道了板子硬件的电路构造,那么我们来看看软件上怎么配置。

幻灯片1

1、新建工程:

image-20210831144827291

搜索或者筛选芯片后,点击Start Project成功创建一个项目

幻灯片2

2、时钟配置

image-20210831145137213

点击RCC进入时钟配置,配置高速时钟为外部晶振,软件自动配置了两个晶振的引脚如图PD0和PD1

注意引脚颜色:

  • 绿色 :已经配置了功能且选择了模式
  • 黄色:配置了功能,但未配置模式
  • 灰色:暂未配置
  • 米白色:不可配置引脚

幻灯片3

3、GPIO引脚配置

image-20210831150326617

  • ① 找到流水灯对应的引脚PC14(PC15),设置为输出。
  • ② 找到GPIO模块设置对应的模式
  • ③ 当前项目配置的引脚的总览页面
  • ④ GPIO模式的具体配置(包括初始化输出电平,输出模式,上下拉模式,引脚速度,引脚功能用户标签)

幻灯片4

4、GPIO模式具体配置

image-20210831150944152

  • ① 当前配置的引脚,这里是PC15
  • ② 初始化输出电平,由于我们的LED灯是共阴极接法,所以输出为高电平时灯会亮
  • ③ 输出的模式(推挽、开漏输出),这里使用默认的推挽输出即可。
  • ④ 是否上下拉引脚(上拉,下拉),这里使用默认。
  • ⑤ 引脚速度(低,中,高速),流水灯对引脚速度没有特殊要求,低速即可。
  • ⑥ 用户标签,在初始化完成后,对应的引脚和端口会有对应的宏定义在main.h中生成。

幻灯片5

5、下载模式配置(一定要配置)

image-20210831151555557

  • DAP-Link
  • JTAG

按照自己所使用的下载(调式)方式进行对应的配置,我是用的是DAP所以配置为Serial Wire,如果不进行配置进行一次下载后,再一次下程序可能就下不进了,注意注意一定要配置。

幻灯片6

6、时钟配置

这里我们采用最简单,最方便,最快捷的配置方式,见下图:

点击Clock Configuration后对应②中填入72(F407最高频率为168,不同芯片可以配置的最高频率不同)按下回车。

image-20210831151929939

然后得到如下形式,表示时钟已经配置成功:

image-20210831152114661

幻灯片7

7、项目管理配置以及代码生成

在熟悉Cubemx软件框架中已经细细的讲过这部分内容,我们需要配置的是项目名称,项目保存位置,所用IDE的配置

image-20210831152259584

选择如下两个选项后,点击右上角的GNEERATE CODE按钮,产生代码。

image-20210831152528608

在进行大型项目编写时,常常要求模块化编程,以及对文件大小有所约束,一般情况下,选择以上两个选项可以大大的优化编程。在代码量和代码可读性上有所优化。

幻灯片88、编写业务代码

打开main.c文件,我们可以看到如下界面,我们在使用Cubemx和Keil开发时,所有的用户代码都是写入在

/* USER CODE BEGIN 1 */

/* USER CODE END 1 */

  • 1
  • 2
  • 3
  • 4

这样的注释之间,而且常常在不用的区间编写不同的代码。

image-20210831154341967

API

我们再来看看GPIO模块对应的API函数:

/* 初始化和删除初始化函数,
	HAL_GPIO_Init:cubemx生成代码后自动调用初始化函数
	HAL_GPIO_DeInit:解除初始化,不想使用时可以主动使用*/
void  HAL_GPIO_Init(GPIO_TypeDef  *GPIOx, GPIO_InitTypeDef *GPIO_Init);
void  HAL_GPIO_DeInit(GPIO_TypeDef  *GPIOx, uint32_t GPIO_Pin);

/* 操作GPIO的函数,包括读取,写入,翻转,加锁,中断服务函数以及回调函数
	HAL_GPIO_ReadPin:读取引脚电平
	HAL_GPIO_WritePin:写入引脚电平
	HAL_GPIO_TogglePin:翻转引脚电平
	HAL_GPIO_LockPin:所以引脚当前电平,将无法改变
	HAL_GPIO_EXTI_IRQHandler:引脚的中断服务函数
	HAL_GPIO_EXTI_Callback:引脚的中断回调函数 */
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
main( )函数

我们可以在main.h中看到之前定义的用户标签,如下:

#define LED1_Pin GPIO_PIN_14
#define LED1_GPIO_Port GPIOC
#define LED2_Pin GPIO_PIN_15
#define LED2_GPIO_Port GPIOC

  • 1
  • 2
  • 3
  • 4
  • 5

下面是mian()函数:

int main(void)
{
  /* USER CODE BEGIN 1 */
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* 复位所有外设,以及初始化Flash接口和嘀嗒定时器 */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* 之前在 Clock Configuration 配置的时钟生成为此函数 */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* 初始化所有的外设,GPIO外设在此初始化 */
  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    HAL_Delay(500);
    HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
    HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

所以说,生成了代码之后,Cubemx把必要的初始化函数已经全部就绪,你要做的就是使用它,把对应的代码写入到对应的代码区中,下载代码到板子中,我们可以见到板子上的灯已经开始以半秒每次开始闪了。

好啦,流水灯就是这么简单就结束了,怎么样是不是感觉很简单呀!

流水灯END

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/305217
推荐阅读
相关标签
  

闽ICP备14008679号