3.跑马灯

1.GPIO的输出模式:

  • 推挽模式输出:因为LED0和LED1阳极都是3.3V,需要将阴极设置为低电平才可以点亮LED;
  • 操作io口时,必须引入源文件和头文件;
  • 关于时钟的文件存放在rcc中;

2.GPIO库函数介绍:

(1).1个初始化函数:

  1. void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
  2. 作用:初始化一个或多个io口(同一组)的工作方式和速度,
  3. 该函数主要是操作GPIO_CRL(CRH)寄存器,在上拉或下拉的时候有设置BSRR或BRR寄存器;
  4. 主要包括设置指定初始化io口、设置工作模式(8种)、设置io口输出速度;
注意:
  • 外设(包括GPIO)在使用之前,几乎都要先使能对应的时钟;
  • 可以一次初始化一个io组下的多个io,前提是这些io口的设置方式一样;

(2).2个读取输入电平函数:

  1. uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
  2. 作用:读取某个GPIO的输入电平。实际操作GPIOx_IDR寄存器;
  3. uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
  4. 作用:读取某组GPIO的输入电平。实际也是操作GPIOx_IDR寄存器;

(3).2个读取输出电平函数:

  1. uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
  2. 作用:读取某个GPIO的输出电平。实际操作的是GPIOx_ODR寄存器;
  3. uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
  4. 作用:读取某组GPIO的输出电平。实际也是操作GPIOx_ODR寄存器;

(4).4个设置输出电平函数:

  1. void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
  2. 作用:设置某个io口输出为高电平(1)。实际操作BSRR寄存器;
  3. void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
  4. 作用:设置某个io口输出为低电平(0)。实际操作BRR寄存器;
  5. void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
  6. void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
  7. 以上两个函数不常用,也是用来设置io口输出电平;

3.相关引脚原理图:

3.跑马灯_第1张图片3.跑马灯_第2张图片 4.跑马灯实验步骤:

  1. 使能io口时钟,调用RCC_APB2PeriphClockCmd()函数实现;
  2. 初始化io口模式,调用GPIO_Init()函数实现;
  3. 操作io口,输出高低电平;GPIO_SetBits()和GPIO_ResetBits()函数实现;
 注意:

        在使能io口时钟时,不同的io组,调用的时钟使能函数不一样;

(1)主函数:

#include "led.h"
#include "delay.h"

int main(){
    
    LED_Init();     //LED初始化
    delay_init();   //延时初始化
    while(1){
        delay_ms(100);
        GPIO_ResetBits(GPIOB,GPIO_Pin_5);   //LED0亮
        GPIO_SetBits(GPIOE,GPIO_Pin_5);     //LED1不亮
        delay_ms(100);
        GPIO_SetBits(GPIOB,GPIO_Pin_5);   //LED0不亮
        GPIO_ResetBits(GPIOE,GPIO_Pin_5);   //LED1亮
        
    }

}

(2)LED头文件:

#ifndef __LED_H
#define __LED_H

void LED_Init();

#endif

(3)LED初始化功能函数:

#include "led.h"
#include "stm32f10x.h"

/*
    1.功能:LED的初始化
    2.返回参数:无
*/
void LED_Init(){
    GPIO_InitTypeDef GPIO_InitStruct;
    
    //1.初始化io时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE,ENABLE);
    
    //2.配置GPIO
    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_OD;  //推挽输出模式->既可以输出高电平也可以输出低电平
    GPIO_InitStruct.GPIO_Pin=GPIO_Pin_5;    //PB5
    GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;    //输出速率50MHz
    GPIO_Init(GPIOB,&GPIO_InitStruct);
    GPIO_SetBits(GPIOB,GPIO_Pin_5); //LED0灭->LED对应的引脚,高电平灭,低电平亮
    
    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_OD; //推挽输出模式
    GPIO_InitStruct.GPIO_Pin=GPIO_Pin_5;    //PE5
    GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOE,&GPIO_InitStruct);  
    GPIO_SetBits(GPIOE,GPIO_Pin_5); //LED1灭
    
}

你可能感兴趣的:(单片机,嵌入式硬件)