一. GPIO初始化
STM32單片機和51單片機不同,51單片機只需與引腳相連后就可以使用引腳發出高低電平信號控制外部器件,而STM32單片機需要先對引腳進行配置(初始化),如果使用引腳用作I2C、SPI、USART等通訊接口時,就是所謂的復用功能時,就需要再配置外設的工作參數。
RCC_APBxPeriphClockCmd(RCC_APBxPeriph_GPIOy , ENANLE/DISABLE);
函數表示使能或者不使能APBx(Advanced Peripheral Bus)的外設時鐘,APBx表示時鐘總線APB1或APB2,APB1為低速的外設時鐘(最大為36MHz),APB2為高速的外設時鐘(最大為72MHz)。GPIOy表示GPIO的端口(A.B.C...)。兩個時鐘總線上都掛載著不同的引腳端口和外設,使用時需要注意,APB1的使能函數不能使能掛載在APB2總線上的引腳端口和外設。
2.初始化GPIO目標引腳的工作模式
因為官方庫函數已經將初始化GPIO的所需要的功能進行了封裝,成為一個結構體,所以需要先定義一個GPIO_InitTypeDef類型的結構體。注意:定義結構體要放在GPIO配置函數內的第一行。
GPIO_InitTypeDef GPIO_InitStructure;
然后選擇需要控制的引腳,x表示所控制端口的第幾個引腳。
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_x;
然后設置引腳模式,xx表示8種不同的引腳模式,如果只是想要控制引腳的高低電平用于LED的亮滅控制,則可以選擇GPIO_Mode_Out_PP(通用推挽輸出);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_xx;
然后設置引腳的速率,xx表示輸出最大的頻率,共有10MHz、2MHz、50MHz三種選擇,速度越大,I/O口的相應速度越快,但相應的功耗和噪聲也大。
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_xxMHz;
3.調用庫函數,初始化GPIO端口
GPIOx為需要使用端口,在前面已經使能其的時鐘;GPIO_InitStructure為第2步定義的結構體。
GPIO_Init(GPIOx, &GPIO_InitStructure);
4.定義引腳的高低電平
GPIO_SetBits(GPIOx , GPIO_Pin_y)表示將Px(y)的引腳拉高;
GPIO_ResetBits(GPIOx , GPIO_Pin_y)表示將Px(y)的引腳拉低;
二. 示例程序:通過控制引腳PB5輸出高低電平實現led燈的亮滅。
“bsp_led.c” //led驅動文件
#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" //主函數文件
#include "stm32f10x.h"
#include "bsp_led.h"
void delay_ms(uint16_t nms) //延時函數,ms級別
{
uint16_t i , j;
for(i=0;i< 1000;i++)
{ for(j=0 ; i< 1000 ; j++) }
}
int main(void) //led循環亮滅各0.5秒
{
LED_GPIO_Config();
while(1)
{
LED_ON;
delay_ms(500); //延時500ms
LED_OFF;
delay_ms(500); //延時500ms
}
}