本文由正點原子STM32F407探索者開發板的led和beep實驗,總結了gpio編程的套路。
下文中以hardware 來稱呼可能的硬件外設,如led或beep等。
新建項目后主要用到三個文件:hardware.c ,hardware.h, main.c
hardware.h
#ifndef __HARDWARE_H
#define __HARDWARE_H
#include "sys.h"
void HARDWARE_Init(void);
#endif
hardware.c
#include "hardware.h"
//初始化該硬件外設與mcu相連的引腳為輸出口
void HARDWARE_Init(void)
{
//0.定義結構體
GPIO_InitTypeDef GPIO_InitStructure;
//1.使能與外設連接的端口的時鍾(看原理圖,可以知道哪些端口與所需外設相連,多個端口可以用或”|“)
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//使能GPIOF時鍾(以gpiof為例,實際要看那個端口與外設相連)
//2.初始化外設對應引腳(以GPIOF8為例)
/*(Pin, 幾號引腳,看原理圖
Mode輸入還是輸出 ,
OType推挽還是別的,
Speed ,
PuPd上拉還是下拉,即默認為高電平還是低電平 共五個)*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通輸出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;//下拉
GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化GPIO
//3.輸出高低電平: GPIO_ResetBits or GPIO_SetBits
GPIO_ResetBits(GPIOF,GPIO_Pin_8); //蜂鳴器對應引腳GPIOF8拉低,
}
main.c
調用HARDWARE_Init可以接着用GPIO_ResetBits和GPIO_SetBits 函數來輸出高低電平。可以配合delay函數進行一些操作。例如:
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "beep.h"
int main(void)
{
delay_init(168); //初始化延時函數
LED_Init(); //初始化LED端口
BEEP_Init(); //初始化蜂鳴器端口
while(1)
{
GPIO_ResetBits(GPIOF,GPIO_Pin_9); // DS0拉低,亮 等同LED0=0;
GPIO_ResetBits(GPIOF,GPIO_Pin_8); //BEEP引腳拉低, 等同BEEP=0;
delay_ms(300); //延時300ms
GPIO_SetBits(GPIOF,GPIO_Pin_9); // DS0拉高,滅 等同LED0=1;
GPIO_SetBits(GPIOF,GPIO_Pin_8); //BEEP引腳拉高, 等同BEEP=1;
delay_ms(300); //延時300ms
}
}
