乐趣区

关于c:三零基础上手HAL库之GPIO点灯

【三】零根底上手 HAL 库之—GPIO 点灯

3.1 前言

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

后期筹备

  • STM32 各类型的板子(自己应用 F103Rc 和 F407ZE)。
  • CubeMx 软件,Keil\_IDE。

3.2 LED 流水灯

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

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

咱们晓得了板子硬件的电路结构,那么咱们来看看软件上怎么配置。

1、新建工程:

搜寻或者筛选芯片后,点击 Start Project 胜利创立一个我的项目

2、时钟配置

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

留神引脚色彩:

  • 绿色:曾经配置了性能且抉择了模式
  • 黄色:配置了性能,但未配置模式
  • 灰色:暂未配置
  • 米红色:不可配置引脚

3、GPIO 引脚配置

  • ① 找到流水灯对应的引脚 PC14(PC15),设置为输入。
  • ② 找到 GPIO 模块设置对应的模式
  • ③ 以后我的项目配置的引脚的总览页面
  • ④ GPIO 模式的具体配置(包含初始化输入电平,输入模式,高低拉模式,引脚速度,引脚性能用户标签)

4、GPIO 模式具体配置

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

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

  • DAP-Link
  • JTAG

依照本人所应用的下载(调式)形式进行对应的配置,我是用的是 DAP 所以配置为 Serial Wire,如果不进行配置进行一次下载后,再一次下程序可能就下不进了,留神留神肯定要配置。

6、时钟配置

这里咱们采纳最简略,最不便,最快捷的配置形式,见下图:

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

而后失去如下模式,示意时钟曾经配置胜利:

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

在相熟 Cubemx 软件框架中曾经细细的讲过这部分内容,咱们须要配置的是项目名称,我的项目保留地位,所用 IDE 的配置

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

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

8、编写业务代码

关上 main.c 文件,咱们能够看到如下界面,咱们在应用 Cubemx 和 Keil 开发时,所有的用户代码都是写入在

/* USER CODE BEGIN 1 */

/* USER CODE END 1 */

这样的正文之间,而且经常在不必的区间编写不同的代码。

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);
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

上面是 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 */
}

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

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

退出移动版