一. GPIO初始化
STM32單片機(jī)和51單片機(jī)不同,51單片機(jī)只需與引腳相連后就可以使用引腳發(fā)出高低電平信號(hào)控制外部器件,而STM32單片機(jī)需要先對(duì)引腳進(jìn)行配置(初始化),如果使用引腳用作I2C、SPI、USART等通訊接口時(shí),就是所謂的復(fù)用功能時(shí),就需要再配置外設(shè)的工作參數(shù)。
RCC_APBxPeriphClockCmd(RCC_APBxPeriph_GPIOy , ENANLE/DISABLE);
函數(shù)表示使能或者不使能APBx(Advanced Peripheral Bus)的外設(shè)時(shí)鐘,APBx表示時(shí)鐘總線APB1或APB2,APB1為低速的外設(shè)時(shí)鐘(最大為36MHz),APB2為高速的外設(shè)時(shí)鐘(最大為72MHz)。GPIOy表示GPIO的端口(A.B.C...)。兩個(gè)時(shí)鐘總線上都掛載著不同的引腳端口和外設(shè),使用時(shí)需要注意,APB1的使能函數(shù)不能使能掛載在APB2總線上的引腳端口和外設(shè)。
2.初始化GPIO目標(biāo)引腳的工作模式
因?yàn)楣俜綆?kù)函數(shù)已經(jīng)將初始化GPIO的所需要的功能進(jìn)行了封裝,成為一個(gè)結(jié)構(gòu)體,所以需要先定義一個(gè)GPIO_InitTypeDef類型的結(jié)構(gòu)體。注意:定義結(jié)構(gòu)體要放在GPIO配置函數(shù)內(nèi)的第一行。
GPIO_InitTypeDef GPIO_InitStructure;
然后選擇需要控制的引腳,x表示所控制端口的第幾個(gè)引腳。
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)用庫(kù)函數(shù),初始化GPIO端口
GPIOx為需要使用端口,在前面已經(jīng)使能其的時(shí)鐘;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)的引腳拉低;
二. 示例程序:通過(guò)控制引腳PB5輸出高低電平實(shí)現(xiàn)led燈的亮滅。
“bsp_led.c” //led驅(qū)動(dòng)文件
#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í)函數(shù),ms級(jí)別
{
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); //延時(shí)500ms
LED_OFF;
delay_ms(500); //延時(shí)500ms
}
}