STM32第一篇点灯

一:点灯初始化用到的库函数

1.     /*开启LED相关的GPIO外设时钟*/   

void RCC_APB2PeriphClockCmd(uint32_t   RCC_APB2Periph, FunctionalState    NewState)

参数 1   RCC_APB2Periph                /* GPIO端口时钟 */
参数2   NewState                            /* ENABLE:1 时钟端口使能     DISENABLE:0 时钟端口不使能 */

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);  // GPIOE时钟使能

RCC_APB2Periph_GPIOE         /*GPIO端口时钟*/

ENABLE               /*端口时钟使能 1*/

2.  /*调用库函数,初始化GPIO*/

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct) //

参数1    “GPIOx”      //GPIO管脚 例如 GPIOE 

参数2     GPIO_InitStruct     //  自定义 GPIO_InitTypeDef 类型结构体

/*定义一个GPIO_InitTypeDef类型的结构体*/

GPIO_InitTypeDef  GPIO_InitStructure;

GPIO_InitTypeDef 结构体

typedef struct
{
  uint16_t GPIO_Pin;      //GPIO位置管脚  例如GPIO_Pin_0       /*!< Specifies the GPIO pins to be configured.      
                                      This parameter can be any value of @ref GPIO_pins_define */

  GPIOSpeed_TypeDef GPIO_Speed;        // I/O速度有2M  10M  50M   /*!< Specifies the speed for the selected pins.
                                      This parameter can be a value of @ref GPIOSpeed_TypeDef */

  GPIOMode_TypeDef GPIO_Mode;     //   I/O模式类型八种  /*!< Specifies the operating mode for the selected pins.
                                      This parameter can be a value of @ref GPIOMode_TypeDef */
}GPIO_InitTypeDef;

  /*选择要控制的GPIO引脚*/
  GPIO_InitStructure.GPIO_Pin  =  GPIO_Pin_0;    

/*设置引脚模式为通用推挽输出*/
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   

/*设置引脚速率为50MHz */   
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 

三种速度的枚举类型

typedef enum

  GPIO_Speed_10MHz = 1,
  GPIO_Speed_2MHz, 
  GPIO_Speed_50MHz
}GPIOSpeed_TypeDef;

八种模式,具体什么时候用不太清楚以后懂了补上。点灯用的推挽输出。

不过这个博主写的挺好的推荐一下   https://blog.csdn.net/it1988888/article/details/7944314

typedef enum
{ GPIO_Mode_AIN = 0x0, //模拟输入
  GPIO_Mode_IN_FLOATING = 0x04,//浮空输入
  GPIO_Mode_IPD = 0x28,//下拉输入
  GPIO_Mode_IPU = 0x48,//上拉输入
  GPIO_Mode_Out_OD = 0x14,//开漏输出
  GPIO_Mode_Out_PP = 0x10,//推挽输出
  GPIO_Mode_AF_OD = 0x1C, //复用开漏输入
  GPIO_Mode_AF_PP = 0x18  //复用推挽输入
}GPIOMode_TypeDef;

二. 点亮LED灯的函数

1. 调用库函数点亮

GPIO_ResetBits(GPIOE , GPIO_Pin_0);  //拉低GPIOE.0    I/O

GPIO_SetBits(GPIOE , GPIO_Pin_0);      //拉高 GPIOE.0   I/O

参数1 “GPIOE”    GPIO管脚

参数2  ”GPIO_Pin_0“   LED灯的管脚在对应GPIO上的位置

2. PEout(n);  (不太清楚什么原理)(IO映射 )

#include "sys.h"             //在这个头文件里面

#define LED0 PEout(0)    // PE0
#define LED1 PEout(1)    // PE1      

// GPIOE_ODR_Addr  是地址   n  是GPIO位置例如 PE5    GPIOE_ODR_Addr == PE       n == 5

#define PEout(n)   BIT_ADDR(GPIOE_ODR_Addr,n)  // 输出                                                                                 
#define PEin(n)     BIT_ADDR(GPIOE_IDR_Addr,n)  //输入

GPIOA_ODR_Addr  在下面

//IO口地址映射
#define GPIOA_ODR_Addr    (GPIOA_BASE+12) //0x4001080C 

3. 直接寄存器操作

    GPIOE->BRR=GPIO_Pin_0;        //拉低GPIOE电平
    GPIOE->BSRR=GPIO_Pin_1;      //拉高GPIOE电平
    和第一个差不多,就是把第一个库函数里面的对 I/O 的操作提取出来
 

三.  主要代码

1    LED.c

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

void led_init()
{
    /*定义一个 GPIO_InitTypeDef 类型结构体*/
     GPIO_InitTypeDef  GPIO_InitStructure;
    
    /*对应GPIO时钟使能*/
    RCC_APB2PeriphClockCmd(LED1_GPIO_CLK|LED2_GPIO_CLK|LED3_GPIO_CLK|LED4_GPIO_CLK,ENABLE);
    
    GPIO_InitStructure.GPIO_Pin    = GPIO_Pin_0;       // LED1-->PE.0 端口配置
    GPIO_InitStructure.GPIO_Mode   = GPIO_Mode_Out_PP; // 设置推挽输出
    GPIO_InitStructure.GPIO_Speed  = GPIO_Speed_50MHz; //I/O口速度设置为50MHZ
    GPIO_Init(LED1_GPIO_PORT,&GPIO_InitStructure);    //按照参数设置初始化时钟
    
    GPIO_InitStructure.GPIO_Pin    = GPIO_Pin_1;       // LED2-->PE.1 端口配置
    GPIO_Init(LED2_GPIO_PORT,&GPIO_InitStructure);    //按照参数设置初始化时钟
    
    GPIO_InitStructure.GPIO_Pin    = GPIO_Pin_2;       // LED2-->PE.2 端口配置
    GPIO_Init(LED3_GPIO_PORT,&GPIO_InitStructure);    //按照参数设置初始化时钟
   
    GPIO_InitStructure.GPIO_Pin    = GPIO_Pin_3;       // LED2-->PE.2 端口配置
    GPIO_Init(LED4_GPIO_PORT,&GPIO_InitStructure);    //按照参数设置初始化时钟

            /* 关闭所有led灯    */
        GPIO_ResetBits(LED1_GPIO_PORT, LED1_GPIO_PIN);
        
        /* 关闭所有led灯    */
        GPIO_ResetBits(LED2_GPIO_PORT, LED2_GPIO_PIN);     
    
    /* 关闭所有led灯    */
        GPIO_ResetBits(LED3_GPIO_PORT, LED3_GPIO_PIN);
        
        /* 关闭所有led灯    */
        GPIO_ResetBits(LED4_GPIO_PORT, LED4_GPIO_PIN);
}
 

2. led.h

#ifndef __LED_H
#define __LED_H     
#include "sys.h"          //PEout需要的


#define LED1 PEout(0)  // PE0
#define LED2 PEout(1)  // PE1

#define LED3 PEout(2)  // PE2
#define LED4 PEout(3)  // PE3        

void led_init(void);//初始化
#endif
 

3. main.h

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"


 int main(void)
 {    
    delay_init();        //延时函数初始化      
    LED_Init();              //初始化与LED连接的硬件接口
    while(1)
    {
        LED0=0;
        LED1=1;               
        delay_ms(300);     //延时300ms
        LED0=1;
        LED1=0;
        delay_ms(300);    //延时300ms
    }
 }


 /**
 *****************下面注视的代码是通过调用库函数来实现IO控制的方法*****************************************
int main(void)

 
    delay_init();          //初始化延时函数
    LED_Init();                //初始化LED端口
    while(1)
    {
            GPIO_ResetBits(GPIOB,GPIO_Pin_5);  //LED0对应引脚GPIOB.5拉低,亮  等同LED0=0;
            GPIO_SetBits(GPIOE,GPIO_Pin_5);   //LED1对应引脚GPIOE.5拉高,灭 等同LED1=1;
            delay_ms(300);             //延时300ms
            GPIO_SetBits(GPIOB,GPIO_Pin_5);       //LED0对应引脚GPIOB.5拉高,灭  等同LED0=1;
            GPIO_ResetBits(GPIOE,GPIO_Pin_5); //LED1对应引脚GPIOE.5拉低,亮 等同LED1=0;
            delay_ms(300);                     //延时300ms
    }

 
 ****************************************************************************************************
 ***/
 

    
/**
*******************下面注释掉的代码是通过 直接操作寄存器 方式实现IO口控制**************************************
int main(void)

 
    delay_init();          //初始化延时函数
    LED_Init();                //初始化LED端口
    while(1)
    {
     GPIOB->BRR=GPIO_Pin_5;//LED0亮
       GPIOE->BSRR=GPIO_Pin_5;//LED1灭
         delay_ms(300);
       GPIOB->BSRR=GPIO_Pin_5;//LED0灭
       GPIOE->BRR=GPIO_Pin_5;//LED1亮
         delay_ms(300);

     }
 }
 

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值