LED原理圖如圖所示:?
代碼
DS0和DS1每過500ms一次交替閃爍,實現類似跑馬燈的效果
GPIO輸出配置步驟
(1)使能對應GPIO時鐘
STM32在使用任何外設之前,我們都要先使能其時鐘(下同)。本實驗用到PB5和PE5 兩 個IO 口,因此需要先使能GPIOB和GPIOE 的時鐘
(2)設置對應 GPIO工作模式(推挽輸出)
本實驗GPIO使用推挽輸出模式,控制LED亮滅,通過函數HAL_GPIO_Init設置實現。
(3)控制GPIO 引腳輸出高低電平
在配置好GPIO工作模式后,我們就可以通過HAL_GPIO_WritePin 函數控制GPIO 引腳 輸 出高低電平,從而控制LED的亮滅了。
led.h
#ifndef _LED_H
#define _LED_H
//led初始化
void led_init(void);
#endif
led.c
#include "./BSP/LED/led.h"
#include "./SYSTEM/sys/sys.h"
//led初始化
void led_init(void){
? ? GPIO_InitTypeDef g_gppio_struct;
? ? __HAL_RCC_GPIOE_CLK_ENABLE(); ?//使能時鐘--PE5--LED1
? ? __HAL_RCC_GPIOB_CLK_ENABLE(); ?//使能時鐘--PB5--LED0
? ??
? ? g_gppio_struct.Pin=GPIO_PIN_5;
? ? g_gppio_struct.Mode=GPIO_MODE_OUTPUT_PP; ?//推挽輸出
? ? g_gppio_struct.Pull=GPIO_NOPULL; ?//無上下拉
? ? g_gppio_struct.Speed=GPIO_SPEED_FREQ_HIGH; ?//高速
? ? HAL_GPIO_Init(GPIOE,&g_gppio_struct); ?//初始化LED1
? ??
? ? g_gppio_struct.Pin=GPIO_PIN_5;
? ? g_gppio_struct.Mode=GPIO_MODE_OUTPUT_PP; ?//推挽輸出
? ? g_gppio_struct.Pull=GPIO_NOPULL; ?//無上下拉
? ? g_gppio_struct.Speed=GPIO_SPEED_FREQ_HIGH; ?//高速
? ? HAL_GPIO_Init(GPIOB,&g_gppio_struct); ?//初始化LED0
}
1、使能外設時鐘
我們要使用某個外設,必需先使能該外設時鐘
(1)HAL庫使能某個外設時鐘的方法?
__HAL_RCC_GPIOx_CLK_ENABLE();??
例如:LED0被PB5管腳控制,則x為B
(2)HAL庫禁止某個外設時鐘的方法?
__HAL_RCC_GPIOx_CLK_DISABLE();??
2、HAL_GPIO_Init 函數
函數聲明:
void HAL_GPIO_Init (GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init);?
//用于配置GPIO功能模式,還可以設置EXTI功能
2.1 形參1:GPIO_TypeDef *GPIOx
是端口號,GPIOA~GPIOE
2.2 形參2:GPIO_InitTypeDef *GPIO_Init
是GPIO_InitTypeDef類型的結構體變量
typedef struct{
? uint32_t Pin; ? ? ? /*!< 指定要配置的 GPIO 引腳。-------引腳號
? ? ? ? ? ? ? ? ? ? ? ? ? ?此參數可以是 @ref GPIO_pins_define 的任何值 */? uint32_t Mode; ? ? ?/*!< 指定所選引腳的模式。-------模式設置
? ? ? ? ? ? ? ? ? ? ? ? ? ?此參數可以是 @ref GPIO_mode_define 的值 */? uint32_t Pull; ? ? ?/*!< 指定所選引腳的 Pull-up 或 Pull-Down 激活。-------上拉下拉設置
? ? ? ? ? ? ? ? ? ? ? ? ? ?此參數可以是 @ref GPIO_pull_define */? uint32_t Speed; ? ? /*!< 指定選定引腳的速度。-------速度設置
? ? ? ? ? ? ? ? ? ? ? ? ? ?此參數可以是 @ref GPIO_speed_define 的值 */
} GPIO_InitTypeDef;
2.2.1?Pin
表示引腳號,范圍:GPIO_PIN_0 到 GPIO_PIN_15,另外還有 GPIO_PIN_All 和 GPIO_PIN_MASK可選
例如:?LED0被PB5管腳控制,則為GPIO_PIN_5
2.2.2?Mode
是GPIO 的模式選擇,有以下選擇項:?
#define ?GPIO_MODE_INPUT? ? 0x00000000u ? /*!< 輸入模式 ? ? ? ? ? ? ? ? ? */
#define ?GPIO_MODE_OUTPUT_PP? ? 0x00000001u ? /*!< 推挽輸出模式 ? ? ? ? ? ? ? ? */
#define ?GPIO_MODE_OUTPUT_OD? ? 0x00000011u ? /*!< 開漏輸出模式 ? ? ? ? ? ? ? ?*/
#define ?GPIO_MODE_AF_PP ? ? ? ? ? ? ? ? ? ? ? ?0x00000002u ? /*!< 推挽式復用模式? ? ?*/
#define ?GPIO_MODE_AF_OD ? ? ? ? ? ? ? ? ? ? ? ?0x00000012u ? /*!< 開漏式復用 ? ?*/
#define ?GPIO_MODE_AF_INPUT ? ? ? ? ? ? ? ? ? ? GPIO_MODE_INPUT ? ? ? ? ?/*!< Alternate Function Input Mode ? ? ? ? */#define ?GPIO_MODE_ANALOG ? ? ? ? ? ? ? ? ? ? ? 0x00000003u ? /*!< Analog Mode ?*/
#define ?GPIO_MODE_IT_RISING ? ? ? ? ? ? ? ? ? ?0x10110000u ? /*!< External Interrupt Mode with Rising edge trigger detection ? ? ? ? ?*/
#define ?GPIO_MODE_IT_FALLING ? ? ? ? ? ? ? ? ? 0x10210000u ? /*!< External Interrupt Mode with Falling edge trigger detection ? ? ? ? */
#define ?GPIO_MODE_IT_RISING_FALLING ? ? ? ? ? ?0x10310000u ? /*!< External Interrupt Mode with Rising/Falling edge trigger detection ?*/#define ?GPIO_MODE_EVT_RISING ? ? ? ? ? ? ? ? ? 0x10120000u ? /*!< External Event Mode with Rising edge trigger detection ? ? ? ? ? ? ? */
#define ?GPIO_MODE_EVT_FALLING ? ? ? ? ? ? ? ? ?0x10220000u ? /*!< External Event Mode with Falling edge trigger detection ? ? ? ? ? ? ?*/
#define ?GPIO_MODE_EVT_RISING_FALLING ? ? ? ? ? 0x10320000u ? /*!< External Event Mode with Rising/Falling edge trigger detection ? ? ? */
2.2.3?Pull
用于配置上下拉電阻,有以下選擇項:
#define ?GPIO_NOPULL? ? ? ? ? ? ?0x00000000u ? /*? ? 無上下拉 ?*/
#define ?GPIO_PULLUP? ? ? ? ? ? ?0x00000001u ? /*? ? ?上拉 ? ? ? ? */
#define ?GPIO_PULLDOWN ? ? ?0x00000002u ? /*? ? ?下拉 ? ? ? ? */?
2.2.4?Speed
用于配置GPIO 的速度,有以下選擇項:
#define ?GPIO_SPEED_FREQ_LOW ? ? ? ? ? ? ?(GPIO_CRL_MODE0_1)? ? ?/*? 低速??*/
#define ?GPIO_SPEED_FREQ_MEDIUM ? ? ? ?(GPIO_CRL_MODE0_0)? ? /*? 中速? */
#define ?GPIO_SPEED_FREQ_HIGH ? ? ? ? ? ? (GPIO_CRL_MODE0)? ? ? ? /*? 高速? */?
main.c
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
int main(void){
? ? //固定代碼
? ? HAL_Init();
? ? sys_stm32_clock_init(RCC_PLL_MUL9);
? ? delay_init(72);
? ??
? ? led_init();
? ? HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,GPIO_PIN_RESET); ?//點亮
? ? while(1){
? ? ? ? HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,GPIO_PIN_RESET); ?//點亮
? ? ? ? delay_ms(200);
? ? ? ? HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,GPIO_PIN_SET); ?//熄滅
? ? ? ? delay_ms(200);
? ? ? ??
? ? ? ? //上述等價于
? ? ? ? /*HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_5);
? ? ? ? delay_ms(200);*/
? ? }
}
每一個文檔在最后都要空2行,不然會出現警告?
1、HAL_GPIO_WritePin 函數?
是 GPIO 口的寫引腳函數。其聲明如下:
void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
(1)形參1:端口號,可以選擇范圍:GPIOA~GPIOG
(2)形參2:引腳號,可以選擇范圍:GPIO_PIN_0~GPIO_PIN_15
(3)形參3:要設置輸出的狀態,有兩個選擇:GPIO_PIN_SET表示高電平,GPIO_PIN_RESET表示低電平
2、HAL_GPIO_TogglePin?函數
是 GPIO 口的電平翻轉函數。其聲明如下:
void HAL_GPIO_TogglePin (GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
(1)形參1:端口號,可以選擇范圍:GPIOA~GPIOG
(2)形參2:引腳號,可以選擇范圍:GPIO_PIN_0~GPIO_PIN_15