一. GPIO初始化
【資料圖】
STM32單片機和51單片機不同,51單片機只需與引腳相連后就可以使用引腳發(fā)出高低電平信號控制外部器件,而STM32單片機需要先對引腳進行配置(初始化),如果使用引腳用作I2C、SPI、USART等通訊接口時,就是所謂的復(fù)用功能時,就需要再配置外設(shè)的工作參數(shù)。
1.使能GPIO端口時鐘;
RCC_APBxPeriphClockCmd(RCC_APBxPeriph_GPIOy , ENANLE/DISABLE);
函數(shù)表示使能或者不使能APBx(Advanced Peripheral Bus)的外設(shè)時鐘,APBx表示時鐘總線APB1或APB2,APB1為低速的外設(shè)時鐘(最大為36MHz),APB2為高速的外設(shè)時鐘(最大為72MHz)。GPIOy表示GPIO的端口(A.B.C...)。兩個時鐘總線上都掛載著不同的引腳端口和外設(shè),使用時需要注意,APB1的使能函數(shù)不能使能掛載在APB2總線上的引腳端口和外設(shè)。
2.初始化GPIO目標引腳的工作模式
因為官方庫函數(shù)已經(jīng)將初始化GPIO的所需要的功能進行了封裝,成為一個結(jié)構(gòu)體,所以需要先定義一個GPIO_InitTypeDef類型的結(jié)構(gòu)體。注意:定義結(jié)構(gòu)體要放在GPIO配置函數(shù)內(nèi)的第一行。
GPIO_InitTypeDef GPIO_InitStructure;
然后選擇需要控制的引腳,x表示所控制端口的第幾個引腳。
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_x;
然后設(shè)置引腳模式,xx表示8種不同的引腳模式,如果只是想要控制引腳的高低電平用于LED的亮滅控制,則可以選擇GPIO_Mode_Out_PP(通用推挽輸出);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_xx;
然后設(shè)置引腳的速率,xx表示輸出最大的頻率,共有10MHz、2MHz、50MHz三種選擇,速度越大,I/O口的相應(yīng)速度越快,但相應(yīng)的功耗和噪聲也大。
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_xxMHz;
3.調(diào)用庫函數(shù),初始化GPIO端口
GPIOx為需要使用端口,在前面已經(jīng)使能其的時鐘;GPIO_InitStructure為第2步定義的結(jié)構(gòu)體。
GPIO_Init(GPIOx, &GPIO_InitStructure);
4.定義引腳的高低電平
GPIO_SetBits(GPIOx , GPIO_Pin_y)表示將Px(y)的引腳拉高;
GPIO_ResetBits(GPIOx , GPIO_Pin_y)表示將Px(y)的引腳拉低;
二. 示例程序:通過控制引腳PB5輸出高低電平實現(xiàn)led燈的亮滅。
“bsp_led.c” //led驅(qū)動文件#include "bsp_led.h"void LED_GPIO_Config(void){ GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB , ENABLE ); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); }"bsp_led.h" //led頭文件#ifndef __LED_H#define __LED_H#include "stm32f10x.h"void LED_GPIO_Config(void);#define LED_OFF GPIO_SetBits(GPIOB , GPIO_Pin_5); //PB5引腳為低電平#define LED_ON GPIO_ResetBits(GPIOB , GPIO_Pin_5); //PB5引腳為高電平#endif /* __LED_H */"main.c" //主函數(shù)文件#include "stm32f10x.h"#include "bsp_led.h"void delay_ms(uint16_t nms) //延時函數(shù),ms級別{ uint16_t i , j; for(i=0;i< 1000;i++) { for(j=0 ; i< 1000 ; j++) }}int main(void) //led循環(huán)亮滅各0.5秒{ LED_GPIO_Config(); while(1) { LED_ON; delay_ms(500); //延時500ms LED_OFF; delay_ms(500); //延時500ms }}
三. 電路圖示意
LED接線示意圖
當PB5為低電平時,led亮;當PB5為高電平時,led滅。由于led的內(nèi)阻較小,而且有最大電流限制,所以需要串聯(lián)電阻調(diào)節(jié)電流,我選用的led的最大電流為20mA,所以我使用330Ω的電阻,使其電流為10mA,不會超過電流限制。
標簽: