美文网首页
STM32学习:使用库函数点亮一个LED

STM32学习:使用库函数点亮一个LED

作者: 虞锦雯 | 来源:发表于2019-08-13 22:25 被阅读0次

    一、LED模块硬件电路

    LED灯模块 单片机部分.png LED灯模块 LED部分.png

    二、GPIO库函数介绍

    (一)GPIO外设的库文件

    stm32f10x_gpio.c stm32f10x_gpio.h
    

    (二)GPIO常用库函数

    初始化函数

    void GPIO_Init(GPIO_TypeDef* GPIOx,GPIO_InitTypeDef* GPIO_InitStruct)
    

    功能:初始化一个或多个IO口(同一组端口)的工作模式、输出速度即GPIO的2个配置寄存器。

    初始化范例:

    GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量 
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0; //选择你要设置的IO口 
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//设置推挽输出模式
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //设置传输速率 
    GPIO_Init(GPIOC,&GPIO_InitStructure);/* 初始化GPIO */
    

    可以一次对多个管脚进行初始化,前提必须是它们的配置模式需一样。比如:

    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;
    

    设置管脚输出电平函数

    void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
    

    功能:设置某个IO口为高电平(可同时设置同一端口的多个IO)。底层是通过配置BSRR寄存器。

    void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
    

    功能:设置某个IO口为低电平(可同时设置同一端口的多个IO)。底层是通过配置BSRR寄存器。

    void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal); 
    void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
    

    功能:设置端口管脚输出电平,很少使用。

    读取管脚输入电平函数

    uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
    

    功能:读取端口中的某个管脚输入电平。底层是通过读取IDR寄存器。

    uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
    

    功能:读取某组端口的输入电平。底层是通过读取IDR寄存器。

    读取管脚输出电平函数

    uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
    

    功能:读取端口中的某个管脚输出电平。底层是通过读取ODR寄存器。

    uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
    

    功能:读取某组端口的输出电平。底层是通过读取ODR寄存器

    (三)使能GPIO时钟函数

    void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
    

    不同的外设调用的时钟使能函数可能不一样

    使能GPIOC端口时钟:

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
    

    三、GPIO初始化步骤

    1. 使能对应的GPIO端口时钟
    2. 初始化GPIO

    四、使用库函数编写跑马灯程序

    程序框架如下:

    1. LED初始化
    2. 跑马灯

    led.h

    #ifndef _led_H 
    #define _led_H 
    #include "stm32f10x_gpio.h"
    #define LED_PORT GPIOC 
    #define LED_PIN (GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7) 
    #define LED_1 GPIO_Pin_0 
    #define LED_2 GPIO_Pin_1 
    #define LED_3 GPIO_Pin_2 
    #define LED_4 GPIO_Pin_3 
    #define LED_5 GPIO_Pin_4 
    #define LED_6 GPIO_Pin_5 
    #define LED_7 GPIO_Pin_6 
    #define LED_8 GPIO_Pin_7 
    #define LED_PORT_RCC RCC_APB2Periph_GPIOC 
    
    void LED_Init(void); 
    void LED_Test(void); 
    void delay(u32 i); 
    
    #endif
    

    led.c

    #include "led.h" 
    
    void LED_Init() 
    {
     GPIO_InitTypeDef GPIO_InitStructure;
     RCC_APB2PeriphClockCmd(LED_PORT_RCC,ENABLE); 
     GPIO_InitStructure.GPIO_Pin=LED_PIN; 
     GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; 
     GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
     GPIO_Init(LED_PORT,&GPIO_InitStructure); 
     GPIO_SetBits(LED_PORT,LED_PIN); 
    } 
    
    void LED_Test(void) 
    {
     int i=8; 
     LED_Init();
     while(1)
     {
      switch(i)
      {
      case 1: GPIO_ResetBits(LED_PORT,LED_1); break;
      case 2: GPIO_ResetBits(LED_PORT,LED_2); break;
      case 3: GPIO_ResetBits(LED_PORT,LED_3); break;
      case 4: GPIO_ResetBits(LED_PORT,LED_4); break;
      case 5: GPIO_ResetBits(LED_PORT,LED_5); break;
      case 6: GPIO_ResetBits(LED_PORT,LED_6); break;
      case 7: GPIO_ResetBits(LED_PORT,LED_7); break;
      case 8: GPIO_ResetBits(LED_PORT,LED_8); break;
      default: GPIO_SetBits(LED_PORT,LED_PIN); i=9; break; 
      }
      delay(1000000);
      i--;
     }
    }
    
    void delay(u32 i) 
    {
     while(i--); 
    }
    

    main.c

    #include "stm32f10x.h" 
    #include "led.h" 
    
    int main() 
    {
     while(1)
     {
      LED_Init();
      LED_Test();
     }
    }
    

    相关文章

      网友评论

          本文标题:STM32学习:使用库函数点亮一个LED

          本文链接:https://www.haomeiwen.com/subject/sxpijctx.html