概述
我们在编写跑马灯实验时点亮一个小灯需要四步:
1.声明GPIO_InitTypeDef结构体
2.使能 APB2 总线上的 GPIOC时钟
3.赋值GPIO_InitTypeDef结构体的三个成员,通过GPIO_Init函数初始化GPIO的某一个端口
4.GPIO_SetBits和GPIO_ResetBits两个函数拉高或者拉低I/O口实现小灯的亮灭
1.I/O时钟的调用
首先,我们在编写跑马灯例程时,要在新建的工程文件中找到FWLIB(有的也简称为LIB)中找到gpio.c这个文件,这里需要注意的是gpio.c必须要和miss.c和rcc.c一起共存,我们从其中找到RCC_APB2Periph_GPIOX,我们要通过不同的IO组调用时钟使能函数不同来实现相应的功能
2.初始化IO口模式,调用函数
我们要通过LED.h编写GPIO_Init()来初始化IO口模式`
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
3.操作IO口,输出高低电平
我这里以STM32F103ZET6来说明,在操作IO口时首先要根据原理图的引脚之间的名称进行的定义,我的两个LED灯分别连接着MCU的B5与E5.
在多数情况下,我们都是采用这两个函数来设置 GPIO 端口的输入和输出状态。比如我们要设
置 GPIOB.5 输出 1,那么方法为:
GPIO_SetBits(GPIOB, GPIO_Pin_5);
反之如果要设置 GPIOB.5 输出位 0,方法为:
GPIO_ResetBits (GPIOB, GPIO_Pin_5);
主函数编写
#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
int main(void)
{
LED_Init();
delay_init();
while(1)
{
GPIO_SetBits(GPIOB,GPIO_Pin_5);
GPIO_SetBits(GPIOE,GPIO_Pin_5);
delay_ms(500);
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
GPIO_ResetBits(GPIOE,GPIO_Pin_5);
delay_ms(500);
}
}
led.h文件
#ifndef __LED_H
#define __LED_H
void LED_Init(void);
#endif
led.c
#include "led.h"
#include "stm32f10x.h"
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_5);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOE,&GPIO_InitStructure);
GPIO_SetBits(GPIOE,GPIO_Pin_5);
}
通过编译以上操作。我们就可以在FLYMCU中通过串口或者下载器实现相应功能了。