【STM32】標準庫與HAL庫對照學習教程三--使用庫函式配置GPIO點亮LED燈
- 一、前言
- 二、準備作業
- 三、LED硬體電路
- 四、使用標準庫工程點亮LED燈
- 1、GPIO初始化一般步驟
- 2、GPIO標準庫函式介紹
- 3、使用庫函式撰寫程式使LED燈閃爍操作
- 4、實驗效果
- 五、使用cubemx生成HAL庫工程點亮LED燈
- 1、cubemx配置生成工程
- 2、HAL庫控制函式介紹
- 3、撰寫使LED燈閃爍的程式
- 4、實驗效果
一、前言
本章主要介紹如何使用標準庫工程與cubemx配置工程使LED燈閃爍,可以直接點擊目錄看自己想要看的內容,文章教程可以讓您一步一步學會如何用標準庫工程與cubemx使LED閃爍,
二、準備作業
- STM32開發板(我使用的是普中的STM32F103ZE的Z200系列)
- STM32cubemx、Keil5(MDK)、開發板原理圖
- 標準庫工程模板
有關STM32芯片GPIO的講解可以看這篇文章:【STM32】SMT32標準庫與HAL庫對照學習教程特別篇–GPIO詳講
有關庫函式工程模板的創建可以看這篇文章:【STM32】STM32標準庫與HAL庫對照學習教程二–庫函式模板創建
標準庫模板工程檔案我已上傳至百度網盤,網盤鏈接:https://pan.baidu.com/s/1Ok_wIMi1V1cVAHdGETPJzQ
密碼:lob1
三、LED硬體電路
硬體原理圖看自己的開發板



可以看到開發板的兩個LED分別由PE5與PB5引腳控制,由原理圖可知,當兩引腳給低電平時,發光二級管LED導通,LED被點亮,給高電平時,LED燈熄滅,
四、使用標準庫工程點亮LED燈
1、GPIO初始化一般步驟
- 打開對應GPIO引腳的時鐘,
- 定義GPIO埠結構體變數,
- 配置結構體變數(設定IO、設定模式、設定速率),
- 初始化GPIO函式,
2、GPIO標準庫函式介紹
(1)GPIO外設庫的檔案:
stm32f10x_gpio.c、
stm32f10x_gpio.h
(2)GPIO常用標準庫函式:
void GPIO_Init(GPIO_TypeDef* GPIOx,GPIO_InitTypeDef* GPIO_InitStruct)
功能:初始化一個或多個IO口(同一組埠)的作業模式、輸出速度,
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
功能:設定某個IO口為高電平(可同時設定同一埠的多個IO),底層是通過配置BSRR暫存器,
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
功能:設定某個IO口為低電平(可同時設定同一埠的多個IO),底層是通過配置BSRR暫存器,
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin,
BitAction BitVal);
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
功能:設定埠管腳輸出電平,很少使用,
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t
GPIO_Pin);
功能:讀取埠中的某個管腳輸入電平,底層是通過讀取IDR暫存器,
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
功能:讀取某組埠的輸入電平,底層是通過讀取IDR暫存器,
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t
GPIO_Pin);
功能:讀取埠中的某個管腳輸出電平,底層是通過讀取ODR暫存器,
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
功能:讀取某組埠的輸出電平,底層是通過讀取ODR暫存器,
(3)使能GPIO時鐘函式
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
3、使用庫函式撰寫程式使LED燈閃爍操作
(1)復制模板工程,重新命名為庫函式點亮LED,

(2)在工程檔案中新建一個App檔案夾,專門用來存放外設檔案,

(3)在App在新建一個LED檔案夾用來存放LED的.c和.h檔案,

這樣做的好處是便于移植外設檔案
(4)打開工程,新建檔案,格式保存為.h,寫入LED初始化申明部分,
- ①

- ②

- ③
程式:
#ifndef LED_H_
#define LED_H_
#include "stm32f10x.h"
/* 宏定義LED時鐘埠、引腳的定義 */
#define LED0_GPIO_Port GPIOB
#define LED0_Pin GPIO_Pin_5
#define LED0_Port_RCC RCC_APB2Periph_GPIOB
#define LED1_GPIO_Port GPIOE
#define LED1_Pin GPIO_Pin_5
#define LED1_Port_RCC RCC_APB2Periph_GPIOE
void LED_Init(void); //LED初始化函式
#endif
(5)新建檔案,格式保存為.c,寫入LED初始化函式,
- ①

- ②
程式:
#include "LED.h"
/*************************************************
*函式名: LED_Init
*函式功能: LED燈初始化函式
*輸入: 無
*回傳值: 無
**************************************************/
void LED_Init()
{
GPIO_InitTypeDef GPIO_InitStructure; //定義結構體變數
RCC_APB2PeriphClockCmd(LED0_Port_RCC|LED1_Port_RCC,ENABLE); //使能時鐘
GPIO_InitStructure.GPIO_Pin=LED0_Pin; //選擇設定LED0的IO口
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //設定推挽輸出模式
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //設定傳輸速率
GPIO_Init(LED0_GPIO_Port,&GPIO_InitStructure); /* 初始化GPIO */
GPIO_SetBits(LED0_GPIO_Port, LED0_Pin); //輸出高電平,LED0熄滅
GPIO_InitStructure.GPIO_Pin=LED1_Pin; //選擇設定LED1的IO口
GPIO_Init(LED1_GPIO_Port,&GPIO_InitStructure); /* 初始化GPIO */
GPIO_SetBits(LED1_GPIO_Port, LED1_Pin); //輸出高電平,LED01熄滅
}
(6)添加檔案在目錄,并添加檔案路徑,
- ①

- ②

(7)撰寫主函式,并編譯燒入程式,
程式:
- ①
#include "LED.h"
/*************************************************
*函式名: delay
*函式功能: 延時函式,通過while回圈占用CPU,到達延時目的
*輸入: i
*回傳值: 無
**************************************************/
void delay(u32 i)
{
while(i--);
}
/*************************************************
*函式名: main
*函式功能: 主函式
*輸入: 無
*回傳值: 無
**************************************************/
int main()
{
LED_Init();
while(1)
{
GPIO_SetBits(LED0_GPIO_Port, LED0_Pin);
GPIO_ResetBits(LED1_GPIO_Port, LED1_Pin);
delay(6000000);
GPIO_SetBits(LED1_GPIO_Port, LED1_Pin);
GPIO_ResetBits(LED0_GPIO_Port, LED0_Pin);
delay(6000000);
}
}
- ②
編譯后無錯誤,無警告,燒入程式到開發板,

我使用的普中提供的串口燒入軟體

4、實驗效果

五、使用cubemx生成HAL庫工程點亮LED燈
有關cubemx一些使用可以看:【STM32】STM32標準庫與HAL庫對照學習教程二–庫函式模板創建
有關cubemx功能部分,下面的配置不會多做介紹,
1、cubemx配置生成工程
(1)打開cubemx,點擊ACCESS TO MCU SELECTOR,

(2)選擇自己開發板的芯片,

(3)配置SYS,

(4)配置RCC,選擇外部時鐘,

(5)配置PB5、PE6引腳,
- ①

- ②

PE5操作相同
(6)點擊GPIO配置模式,

PE5操作相同
(7)配置時鐘樹,

有關時鐘樹不懂的可以看這篇文章:【STM32】STM32標準庫與HAL庫對照學習教程特別篇–系統時鐘RCC詳講
(8)點擊Project Manager,組態檔,生成工程,
- ①

重點提醒:路徑和工程名都不要帶中文
- ②

2、HAL庫控制函式介紹
(1)GPIO外設庫的檔案:
stm32f10xx_hal_gpio.h、
stm32f10xx_hal_gpio.c
(2)操作GPIO常用HAL庫函式:
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);
功能:翻轉一個引腳的電平,
3、撰寫使LED燈閃爍的程式
程式:
HAL_GPIO_WritePin(LED0_GPIO_Port,LED0_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET);
HAL_Delay(500); //HAL庫自帶的ms級延時函式
HAL_GPIO_WritePin(LED0_GPIO_Port,LED0_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET);
HAL_Delay(500);

編譯后0錯誤0警告,燒入到開發板,

4、實驗效果

到這里就結束啦!

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/356186.html
標籤:其他
