GPIO的使用----LED灯的驱动

STM32F103RCT6:


    1》GPIO----通用输入输出端口(引脚)
        数字电路中的三种状态:高(3.3V)    低(0V)     高阻
        作用:
            1,输出
                高电平(3.3V)    低电平(0V)
            2,输入
                高电平(3.3V)    低电平(0V)
    2》在STM32上GPIO按组划分,分为GPIOA,GPIOB。。。。GPIOG
                    每组最多16个引脚  GPIOA0.。。。。。GPIOA15
                    
    3》MCU片上外设控制手册《STM32F10xxx参考手册中文版.pdf》
    
    4》八种输入输出模式
        施密特触发器:纠正电平
        上拉电阻:电阻一端接电源,另一端接信号线
        下拉电阻:电阻一端接地,另一端接信号线
        
        1,输入浮空:没有上拉电阻,也没有下拉电阻,输入0,输入数据寄存器读到0,输入1,输入数据寄存器读到1,没有输入,读到上一次的状态
        
        2,输入上拉:有上拉电阻,没有下拉电阻,输入0,输入数据寄存器读到0,输入1,输入数据寄存器读到1,没有输入,读到高电平(1)
        
        3,输入下拉:有下拉电阻,没有上拉电阻,输入0,输入数据寄存器读到0,输入1,输入数据寄存器读到1,没有输入,读到低电平(0)
        
        4,模拟输入:没有上拉电阻,也没有下拉电阻,并且不经过施密特触发器直接进入芯片内部的片上外设
        
        5,开漏输出:没有P-mos,不能输出高电平,当输出数据寄存器写1时,输出为高阻
        
        6,推挽输出:通过输出数据寄存器,写入0和1,控制引脚上面的低电平和高电平输出
             (通用:GPIO受内核控制的输出数据寄存器控制)
            (复用:GPIO受片上外设控制)
        7,开漏复用输出:没有P-mos,不能输出高电平
        8,推挽复用输出:能够输出高电平和低电平
            
       
    5》标准外设库驱动LED
    《STM32固件库使用手册_v3.5版本.pdf》---介绍标准外设库中函数的手册   

-------------------------------------------------------------------------------------------------------------------------

//dri_led.c   ----------------------------------------------------------------------------------------------------------

#include "dri_led.h"

//粗延时函数,微秒

void delay(void)

{    
    uint32_t i,j;
    for (i=0; i<10000; i++)
    {
        for (j=0; j<100; j++)
            ;
   }

}

void ledb_close(void)
{
    GPIO_InitTypeDef GPIO_InitStruct6;

 
    // 0.打开GPIOC的时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

    
    // 1.将GPIOC6、7、8设置成通用推挽输出,输出速度2MHZ
    GPIO_InitStruct6.GPIO_Pin    =GPIO_Pin_6;
    GPIO_InitStruct6.GPIO_Speed    =GPIO_Speed_2MHz;
    GPIO_InitStruct6.GPIO_Mode    =GPIO_Mode_Out_PP;
    GPIO_Init(GPIOC, &GPIO_InitStruct6);

    // 2.关灯
    GPIO_SetBits(GPIOC, GPIO_Pin_6);
}

void ledg_close(void)
{
    GPIO_InitTypeDef GPIO_InitStruct7;
    
    // 0.打开GPIOC的时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

    
    // 1.将GPIOC6、7、8设置成通用推挽输出,输出速度2MHZ
    GPIO_InitStruct7.GPIO_Pin    =GPIO_Pin_7;
    GPIO_InitStruct7.GPIO_Speed    =GPIO_Speed_2MHz;
    GPIO_InitStruct7.GPIO_Mode    =GPIO_Mode_Out_PP;
    GPIO_Init(GPIOC, &GPIO_InitStruct7);
    
    // 2.关灯
    GPIO_SetBits(GPIOC, GPIO_Pin_7);
}


void ledr_close(void)
{
    GPIO_InitTypeDef GPIO_InitStruct8;
    
    // 0.打开GPIOC的时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

    
    // 1.将GPIOC6、7、8设置成通用推挽输出,输出速度2MHZ
    GPIO_InitStruct8.GPIO_Pin    =GPIO_Pin_8;
    GPIO_InitStruct8.GPIO_Speed    =GPIO_Speed_2MHz;
    GPIO_InitStruct8.GPIO_Mode    =GPIO_Mode_Out_PP;
    GPIO_Init(GPIOC, &GPIO_InitStruct8);
    
    // 2.关灯
    GPIO_SetBits(GPIOC, GPIO_Pin_8);
}

//开灯

void ledb_open(void)
{
    GPIO_ResetBits(GPIOC, GPIO_Pin_6);
}

void ledg_open(void)
{
    GPIO_ResetBits(GPIOC, GPIO_Pin_7);
}

void ledr_open(void)
{
    GPIO_ResetBits(GPIOC, GPIO_Pin_8);

}

//控制灯的开关
void led_ctrl(int LED, int OPCL)
{
    if (OPCL==open)
        {
            switch (LED)
            {
                case blue:
                    {
                        ledb_open();
                        delay();
                        break;
                    }
                case green:
                    {
                        ledg_open();
                        delay();
                        break;
                    }
                case red:
                    {
                        ledr_open();
                        delay();
                        break;
                    }
                case yellow:
                    {
                        ledg_open();
                        ledr_open();
                        delay();
                        break;
                    }
                case cyan:
                    {
                        ledb_open();
                        ledg_open();
                        delay();
                        break;
                    }
                case purple:
                    {
                        ledb_open();
                        ledr_open();    
                        delay();
                        break;
                    }
                case white:
                    {
                        ledb_open();
                        ledg_open();
                        ledr_open();    
                        delay();
                        break;
                    }
                }
        }
    else if (OPCL==close)
        {
            switch (LED)
            {
                case blue:
                    {
                        GPIO_SetBits(GPIOC, GPIO_Pin_6);
                        delay();
                        break;
                    }
                case green:
                    {
                        GPIO_SetBits(GPIOC, GPIO_Pin_7);
                        delay();
                        break;
                    }
                case red:
                    {
                        GPIO_SetBits(GPIOC, GPIO_Pin_8);
                        delay();
                        break;
                    }
                case yellow:
                    {
                        GPIO_SetBits(GPIOC, GPIO_Pin_7);
                        GPIO_SetBits(GPIOC, GPIO_Pin_8);
                        delay();
                        break;
                    }
                case cyan:
                    {
                        GPIO_SetBits(GPIOC, GPIO_Pin_6);
                        GPIO_SetBits(GPIOC, GPIO_Pin_7);
                        delay();
                        break;
                    }
                case purple:
                    {
                        GPIO_SetBits(GPIOC, GPIO_Pin_6);
                        GPIO_SetBits(GPIOC, GPIO_Pin_8);    
                        delay();
                        break;
                    }
                case white:
                    {
                        GPIO_SetBits(GPIOC, GPIO_Pin_6);
                        GPIO_SetBits(GPIOC, GPIO_Pin_7);
                        GPIO_SetBits(GPIOC, GPIO_Pin_8);    
                        delay();
                        break;
                    }
                }
        }

}

-------------------------------------------------------------------------------------------------------------------------

//dri_led.h   ----------------------------------------------------------------------------------------------------------

#ifndef _DRI_LED_H
#define _DRI_LED_H

#include "stm32f10x.h"

enum led_color {blue=0, green, red, yellow, cyan, purple, white};
enum openclose {close=0, open};

void delay_us(u16 time);
void ledb_close(void);
void ledg_close(void);
void ledr_close(void);
void ledb_open(void);
void ledg_open(void);
void ledr_open(void);
void led_ctrl(int LED, int OPCL);

#endif // _DRI_LED_H

-------------------------------------------------------------------------------------------------------------------------

//main.c   ------------------------------------------------------------------------------------------------------------

#include "dri_led.h"

int main (void)
{
    int i,ix,j,jx;
    ledb_close();
    ledg_close();
    ledr_close();
    while (1)
    {    for (i=0; i<7; i++)
        {
            for (j=1; j>=0; j--)
                {
                    ix=i%7;
                    jx=j%2;
                    led_ctrl(ix, jx);
                }

        }
    }
}

-------------------------------------------------------------------------------------------------------------------------

结果:七种颜色的灯轮流闪烁。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值