Bootstrap

[STM32][基础]GPIO流水灯

注:文章内使用的MCU是STM32F107,原理图在这里
本文的程序使用的是库函数开发

一、流水灯实验原理

先看一下LED灯模块的原理图:
LED灯模块原理图
从原理图中可以很清楚地看出来,只有把左边引脚设成低电平,LED灯就会被点亮,否则,LED灯处于熄灭状态。
因此,STM32的作用就是按一定规律把GPIOD的2、3、4、7引脚拉低拉高。

流程图

根据实验的原理及设想,可以得到主程序的流程图。

Created with Raphaël 2.1.0 开始 熄灭所有LED灯 点亮LED1,延时,熄灭LED1 点亮LED2,延时,熄灭LED2 点亮LED3,延时,熄灭LED3 点亮LED4,延时,熄灭LED4 (此处实现无限循环) 结束 yes no

二、管脚配置

STM32的管脚和51MCU相比,功能更加丰富。STM32的管脚可以设置成不同的功能,成为”分时复用”,具体请移步ST提供的DataSheet参考手册
同时,不同于51MCU的流水灯程序(以AT89S52为例):

#include <reg52.h>
#include <intrins.h>
void delay(unsigned int nCount);
void main(void){
    P1 = 0xfe;
    while(1){
        P1 = _crol_ (P1,1);       //循环左移函数,在intrins.h中定义
        delay(5000);
    }
}
void delay(unsigned int nCount){
    for(; nCount != 0; nCount--);
}

将STM32的管脚拉低拉高需要配置STM32管脚的输入输出模式,详见下表:

模式名称库函数标识
浮空输入GPIO_Mode_IN_FLOATING
带上拉输入GPIO_Mode_IPU
带下拉输入GPIO_Mode_IPD
模拟输入GPIO_Mode_AIN
开漏输出GPIO_Mode_OUT_OD
推挽输出GPIO_Mode_OUT_PP
复用功能推挽输出GPIO_Mode_AF_PP
复用功能开漏输出GPIO_Mode_AF_OD

注:另外,还要提一点,关于STM32的所有外设(包括管脚)的使用流程:

Created with Raphaël 2.1.0 初始化(Initialization) 配置(Configuation) 调用(Call)

三、CODE

下面就贴一下代码。
关于STM32项目的建立,可参考STM32F1开发指南-库函数版本_V3.1 .pdf第三章。

//LED.h
#ifndef __LED_H
#define __LED_H

#include "stm32f10x.h"

void LED_Init(void);

#endif
//LED.c
#include "led.h"

void LED_Init(void)
{
    GPIO_InitTypeDef    GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);       //使能对应GPIO的Clock时钟

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 |
    GPIO_Pin_4 | GPIO_Pin_7;                                    //设置端口

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;            //设置端口模式    推挽输出(Push-Pull)

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;           //最大输出速度50MHz

    GPIO_Init(GPIOD, &GPIO_InitStructure);                      //调用GPIO初始化函数
}
//main.c
#include "led.h"

void delay(uint32_t);

int main(void)
{
    LED_Init();
    while(1)
    {
        GPIO_ResetBits(GPIOD, GPIO_Pin_2);          //将GPIOD的Pin2拉低
        delay(1600000);
        GPIO_SetBits(GPIOD, GPIO_Pin_2);            //将GPIOD的Pin2拉高
        delay(1600000);

        GPIO_ResetBits(GPIOD, GPIO_Pin_3);
        delay(800000);
        GPIO_SetBits(GPIOD, GPIO_Pin_3);
        delay(800000);

        GPIO_ResetBits(GPIOD, GPIO_Pin_4);
        delay(400000);
        GPIO_SetBits(GPIOD, GPIO_Pin_4);
        delay(400000);

        GPIO_ResetBits(GPIOD, GPIO_Pin_7);
        delay(200000);
        GPIO_SetBits(GPIOD, GPIO_Pin_7);
        delay(20000);
    }
}

void delay(__IO uint32_t nCount)
{
    for(; nCount != 0; nCount--);
}

总结

GPIO管脚配置+软件延时实现流水灯是学习STM32过程中最基础外设,也是最重要的资源之一,需要深入的了解。本文趋向实用性,对于GPIO管脚的复用和寄存器配置未进行详细说明,请移步相关文档继续研究。

;