STM32-点灯-初学者

一、点亮一盏灯基本的步骤

1、看电路板

(1)电路板实图:找丝印R35 、R36、 R37、 R38。
在这里插入图片描述

2、看原理图文档(电路图)

(1)电路板上的丝印(R35) -->(2)原理图文档(搜索R35)–>(3)电路图(红色字体: LED0)
在这里插入图片描述

3、看原理图文档(GPIO组、引脚)

(1)原理图文档 -->(2)搜索(LED0)–> (3)找到该led灯的引脚是多少(PF9 : PF组、第9号引脚)
在这里插入图片描述

4、.h文档(部分解析)

在这里插入图片描述

5、led.c文档(部分解析)

(1)
在这里插入图片描述
(2)
在这里插入图片描述

二、点亮一盏灯

led.h 文件
#ifndef __LED_H
#define __LED_H

#include "stm32f4xx.h"

#define RCC_AHB1ENR      (*((volatile unsigned int *)(0x40023800+0x30)))    //值强制转换为地址  通过地址解引用访问地址空间

#define GPIOF_MODER      (*((volatile unsigned int *)(0x40021400+0x00)))    //值强制转换为地址  通过地址解引用访问地址空间
#define GPIOF_OTYPER     (*((volatile unsigned int *)(0x40021400+0x04)))    //值强制转换为地址  通过地址解引用访问地址空间
#define GPIOF_OSPEEDR    (*((volatile unsigned int *)(0x40021400+0x08)))    //值强制转换为地址  通过地址解引用访问地址空间
#define GPIOF_PUPDR      (*((volatile unsigned int *)(0x40021400+0x0C)))    //值强制转换为地址  通过地址解引用访问地址空间
#define GPIOF_ODR        (*((volatile unsigned int *)(0x40021400+0x14)))    //值强制转换为地址  通过地址解引用访问地址空间

void Led_Init(void);

#endif

led.c文件
#include "led.h"

/*******************************
引脚说明

LED0连接在PF9
PF9输出低电平(0),灯亮;PF9输出高电平(1),灯灭;

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

void Led_Init(void)
{
    // 打开GPIOF组时钟(PF9属于GPIOF组时钟)         RCC_AHB1ENR:外设时钟使能寄存器
    RCC_AHB1ENR |= (0x01<<5);        //第5位置1
    
    // 01:通用输出模式             GPIO 端口模式寄存器
    GPIOF_MODER &= ~(0x01<<19);    //第19位清0
    GPIOF_MODER |= (0x01<<18);        //第18位置1
    
    // 0:输出推挽(复位状态)    GPIO 端口输出类型寄存器 
    GPIOF_OTYPER &= ~(0x02<<9);    //第9位清0
    
    // 01:25 MHz(中速)        GPIO 端口输出速度寄存器
    GPIOF_OSPEEDR &= ~(0x01<<19);    //第19位清0
    GPIOF_OSPEEDR |= (0x01<<18);    //第18位置1
    
    // 01:上拉                        GPIO 端口上拉/下拉寄存器 
    GPIOF_PUPDR &= ~(0x01<<19);    //第19位清0
    GPIOF_PUPDR |= (0x01<<18);        //第18位置1    
}

main.c文件
#include "stm32f4xx.h"
#include "led.h"

//粗延时
void delay(int n)
{
    int i, j;
    
    for(i=0; i<n; i++)
    {
        for(j=0; j<30000; j++)
        {
        }
    }            
}


int main(void)
{
    Led_Init();
    
    //灯亮
    GPIOF_ODR &= ~(0x01<<9);    //第9位清0    
    
    
    return 0;
}

三、一盏灯,灯亮灯灭(一亮一灭)

main.c文件 (前面的led.h文档和led.c文档不变)
#include "stm32f4xx.h"
#include "led.h"

//粗延时
void delay(int n)
{
    int i, j;
    
    for(i=0; i<n; i++)
    {
        for(j=0; j<30000; j++)
        {
        }
    }            
}


int main(void)
{
    Led_Init();
    
    while(1)
    {
        //灯灭    GPIO 端口输出数据寄存器
        GPIOF_ODR |= (0x01<<9);    // 第9位置1
        
        delay(500);
        
        //灯亮
        GPIOF_ODR &= ~(0x01<<9);    // 第9位清0        
        
        delay(500);
    }
    return 0;
}

四、同时点亮四盏灯(同时闪烁)

led.h 文件
#ifndef __LED_H
#define __LED_H

#include "stm32f4xx.h"

#define RCC_AHB1ENR      (*((volatile unsigned int *)(0x40023800+0x30)))    //值强制转换为地址  通过地址解引用访问地址空间

#define GPIOF_MODER      (*((volatile unsigned int *)(0x40021400+0x00)))    //值强制转换为地址  通过地址解引用访问地址空间
#define GPIOF_OTYPER     (*((volatile unsigned int *)(0x40021400+0x04)))    //值强制转换为地址  通过地址解引用访问地址空间
#define GPIOF_OSPEEDR    (*((volatile unsigned int *)(0x40021400+0x08)))    //值强制转换为地址  通过地址解引用访问地址空间
#define GPIOF_PUPDR      (*((volatile unsigned int *)(0x40021400+0x0C)))    //值强制转换为地址  通过地址解引用访问地址空间
#define GPIOF_ODR        (*((volatile unsigned int *)(0x40021400+0x14)))    //值强制转换为地址  通过地址解引用访问地址空间

#define GPIOE_MODER      (*((volatile unsigned int *)(0x40021000+0x00)))    //值强制转换为地址  通过地址解引用访问地址空间
#define GPIOE_OTYPER     (*((volatile unsigned int *)(0x40021000+0x04)))    //值强制转换为地址  通过地址解引用访问地址空间
#define GPIOE_OSPEEDR    (*((volatile unsigned int *)(0x40021000+0x08)))    //值强制转换为地址  通过地址解引用访问地址空间
#define GPIOE_PUPDR      (*((volatile unsigned int *)(0x40021000+0x0C)))    //值强制转换为地址  通过地址解引用访问地址空间
#define GPIOE_ODR        (*((volatile unsigned int *)(0x40021000+0x14)))    //值强制转换为地址  通过地址解引用访问地址空间

void Led_Init(void);

#endif

led.c文件
#include "led.h"

/*******************************
引脚说明

LED0连接在PF9
PF9输出低电平(0),灯亮;PF9输出高电平(1),灯灭;

LED1 连接在 PF10

FSMC_D10 连接在 PE13

FSMC_D11 连接在 PE14

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

void Led_Init(void)
{
    //
    // LED0连接在PF9 
    // 
    
    // 打开GPIOF组时钟(PF9属于GPIOF组时钟)         RCC_AHB1ENR:外设时钟使能寄存器
    RCC_AHB1ENR |= (0x01<<5);        //第5位置1
    
    // 01:通用输出模式             GPIO 端口模式寄存器
    GPIOF_MODER &= ~(0x01<<19);    //第19位清0
    GPIOF_MODER |= (0x01<<18);        //第18位置1
    
    // 0:输出推挽(复位状态)    GPIO 端口输出类型寄存器 
    GPIOF_OTYPER &= ~(0x02<<9);    //第9位清0
    
    // 01:25 MHz(中速)        GPIO 端口输出速度寄存器
    GPIOF_OSPEEDR &= ~(0x01<<19);    //第19位清0
    GPIOF_OSPEEDR |= (0x01<<18);    //第18位置1
    
    // 01:上拉                        GPIO 端口上拉/下拉寄存器 
    GPIOF_PUPDR &= ~(0x01<<19);    //第19位清0
    GPIOF_PUPDR |= (0x01<<18);        //第18位置1
    
    
    
    
    // 
    // LED1 连接在 PF10 
    // 
    
    // 1.GPIO 端口模式寄存器(01:通用输出模式 )
    GPIOF_MODER &= ~(0x001<<21);     // 第21位清0
    GPIOF_MODER |= (0x001<<20);     // 第20位置1
    
    // 2.GPIO 端口输出类型寄存器(0:输出推挽(复位状态))
    GPIOF_OTYPER &= ~(0x01<<10);    // 第10位清0
    
    // 3.GPIO 端口输出速度寄存器(01:25 MHz(中速))
    GPIOF_OSPEEDR &= ~(0x01<<21);    // 第21位清0
    GPIOF_OSPEEDR |= (0x01<<20);    // 第20位置1
    
    // 4.GPIO 端口上拉/下拉寄存器(01:上拉)
    GPIOF_PUPDR &= ~(0x01<<21);    // 第21位清0
    GPIOF_PUPDR |= (0x01<<20);        // 第20位置1
    
    
    
    
    // 
    // FSMC_D10 连接在 PE13
    //
    
    // 1.打开 GPIOE 组时钟(PE13属于GPIOE组时钟)         RCC_AHB1ENR:外设时钟使能寄存器
    RCC_AHB1ENR |= (0x01<<4);        //第4位置1
    
    // 2.GPIO 端口模式寄存器(01:通用输出模式 )
    GPIOE_MODER &= ~(0x001<<27);     // 第27位清0
    GPIOE_MODER |= (0x001<<26);     // 第26位置1
    
    // 3.GPIO 端口输出类型寄存器(0:输出推挽(复位状态))
    GPIOE_OTYPER &= ~(0x01<<13);    // 第13位清0
    
    // 4.GPIO 端口输出速度寄存器(01:25 MHz(中速))
    GPIOE_OSPEEDR &= ~(0x01<<27);    // 第27位清0
    GPIOE_OSPEEDR |= (0x01<<26);    // 第26位置1
    
    // 5.GPIO 端口上拉/下拉寄存器(01:上拉)
    GPIOE_PUPDR &= ~(0x01<<27);    // 第27位清0
    GPIOE_PUPDR |= (0x01<<26);        // 第26位置1
    
    
    
    // 
    // FSMC_D11 连接在 PE14
    // 
    
    // 1.GPIO 端口模式寄存器(01:通用输出模式 )
    GPIOE_MODER &= ~(0x001<<29);     // 第29位清0
    GPIOE_MODER |= (0x001<<28);     // 第28位置1
    
    // 2.GPIO 端口输出类型寄存器(0:输出推挽(复位状态))
    GPIOE_OTYPER &= ~(0x01<<14);    // 第14位清0
    
    // 3.GPIO 端口输出速度寄存器(01:25 MHz(中速))
    GPIOE_OSPEEDR &= ~(0x01<<29);    // 第29位清0
    GPIOE_OSPEEDR |= (0x01<<28);    // 第28位置1
    
    // 4.GPIO 端口上拉/下拉寄存器(01:上拉)
    GPIOE_PUPDR &= ~(0x01<<29);    // 第29位清0
    GPIOE_PUPDR |= (0x01<<28);        // 第28位置1
}

main.c文件
#include "stm32f4xx.h"
#include "led.h"

//粗延时
void delay(int n)
{
    int i, j;
    
    for(i=0; i<n; i++)
    {
        for(j=0; j<30000; j++)
        {
        }
    }            
}

int main(void)
{
    Led_Init();
    
    while(1)
    {
        //灯灭    GPIO 端口输出数据寄存器
        GPIOF_ODR |= (0x01<<9);            // LED0 第9位置1
        GPIOF_ODR |= (0x01<<10);            // LED1 第10位置1
        GPIOE_ODR |= (0x01<<13);            // FSMC_D10 第13位置1
        GPIOE_ODR |= (0x01<<14);            // FSMC_D11 第14位置1
        delay(500);
        
        //灯亮
        GPIOF_ODR &= ~(0x01<<9);            // LED0 第9位清0        
        GPIOF_ODR &= ~(0x01<<10);            // LED1 第10位清0    
        GPIOE_ODR &= ~(0x01<<13);            // FSMC_D10 第13位清0    
        GPIOE_ODR &= ~(0x01<<14);            // FSMC_D11 第14位清0
        delay(500);
    }
    
    return 0;
}

效果动图(略)

五、流水灯

led.h 文件
#ifndef __LED_H
#define __LED_H

#include "stm32f4xx.h"

#define RCC_AHB1ENR      (*((volatile unsigned int *)(0x40023800+0x30)))    //值强制转换为地址  通过地址解引用访问地址空间

#define GPIOF_MODER      (*((volatile unsigned int *)(0x40021400+0x00)))    //值强制转换为地址  通过地址解引用访问地址空间
#define GPIOF_OTYPER     (*((volatile unsigned int *)(0x40021400+0x04)))    //值强制转换为地址  通过地址解引用访问地址空间
#define GPIOF_OSPEEDR    (*((volatile unsigned int *)(0x40021400+0x08)))    //值强制转换为地址  通过地址解引用访问地址空间
#define GPIOF_PUPDR      (*((volatile unsigned int *)(0x40021400+0x0C)))    //值强制转换为地址  通过地址解引用访问地址空间
#define GPIOF_ODR        (*((volatile unsigned int *)(0x40021400+0x14)))    //值强制转换为地址  通过地址解引用访问地址空间

#define GPIOE_MODER      (*((volatile unsigned int *)(0x40021000+0x00)))    //值强制转换为地址  通过地址解引用访问地址空间
#define GPIOE_OTYPER     (*((volatile unsigned int *)(0x40021000+0x04)))    //值强制转换为地址  通过地址解引用访问地址空间
#define GPIOE_OSPEEDR    (*((volatile unsigned int *)(0x40021000+0x08)))    //值强制转换为地址  通过地址解引用访问地址空间
#define GPIOE_PUPDR      (*((volatile unsigned int *)(0x40021000+0x0C)))    //值强制转换为地址  通过地址解引用访问地址空间
#define GPIOE_ODR        (*((volatile unsigned int *)(0x40021000+0x14)))    //值强制转换为地址  通过地址解引用访问地址空间

void Led_Init(void);

#endif

led.c文件
#include "led.h"

/*******************************
引脚说明

LED0连接在PF9
PF9输出低电平(0),灯亮;PF9输出高电平(1),灯灭;

LED1 连接在 PF10

FSMC_D10 连接在 PE13

FSMC_D11 连接在 PE14

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

void Led_Init(void)
{
    // 打开GPIOF组时钟(PF9属于GPIOF组时钟)         RCC_AHB1ENR:外设时钟使能寄存器
    RCC_AHB1ENR |= (0x01<<5);        //第5位置1
    // 打开 GPIOE 组时钟(PE13属于GPIOE组时钟)         RCC_AHB1ENR:外设时钟使能寄存器
    RCC_AHB1ENR |= (0x01<<4);        //第4位置1

    // 1.GPIO 端口模式寄存器(01:通用输出模式 )
    GPIOF_MODER &= ~(0x01<<19);    // 第19位清0
    GPIOF_MODER |= (0x01<<18);        // 第18位置1
    GPIOF_MODER &= ~(0x01<<21);     // 第21位清0
    GPIOF_MODER |= (0x01<<20);     // 第20位置1
    
    GPIOE_MODER &= ~(0x01<<27);     // 第27位清0
    GPIOE_MODER |= (0x01<<26);     // 第26位置1
    GPIOE_MODER &= ~(0x01<<29);     // 第29位清0
    GPIOE_MODER |= (0x01<<28);     // 第28位置1
    
    // 2.GPIO 端口输出类型寄存器(0:输出推挽(复位状态))
    GPIOF_OTYPER &= ~(0x02<<9);    //第9位清0
    GPIOF_OTYPER &= ~(0x01<<10);    // 第10位清0

    GPIOE_OTYPER &= ~(0x01<<13);    // 第13位清0
    GPIOE_OTYPER &= ~(0x01<<14);    // 第14位清0

    // 3.GPIO 端口输出速度寄存器(01:25 MHz(中速))
    GPIOF_OSPEEDR &= ~(0x01<<19);    //第19位清0
    GPIOF_OSPEEDR |= (0x01<<18);    //第18位置1
    GPIOF_OSPEEDR &= ~(0x01<<21);    // 第21位清0
    GPIOF_OSPEEDR |= (0x01<<20);    // 第20位置1
    
    GPIOE_OSPEEDR &= ~(0x01<<27);    // 第27位清0
    GPIOE_OSPEEDR |= (0x01<<26);    // 第26位置1
    GPIOE_OSPEEDR &= ~(0x01<<29);    // 第29位清0
    GPIOE_OSPEEDR |= (0x01<<28);    // 第28位置1
    
    // 4.GPIO 端口上拉/下拉寄存器(01:上拉)
    GPIOF_PUPDR &= ~(0x01<<19);    //第19位清0
    GPIOF_PUPDR |= (0x01<<18);        //第18位置1    
    GPIOF_PUPDR &= ~(0x01<<21);    // 第21位清0
    GPIOF_PUPDR |= (0x01<<20);        // 第20位置1
    
    GPIOE_PUPDR &= ~(0x01<<27);    // 第27位清0
    GPIOE_PUPDR |= (0x01<<26);        // 第26位置1        
    GPIOE_PUPDR &= ~(0x01<<29);    // 第29位清0
    GPIOE_PUPDR |= (0x01<<28);        // 第28位置1
}

main.c文件
#include "stm32f4xx.h"
#include "led.h"

/*
    流水灯:led0、led1、led2、led3
    led0 灭 led1 亮 + 延时
    led1 灭 led2 亮 + 延时
    led2 灭 led3 亮 + 延时
    led3 灭 led0 亮 + 延时
    循环
*/

//粗延时
void delay(int n)
{
    int i, j;
    
    for(i=0; i<n; i++)
    {
        for(j=0; j<30000; j++)
        {}
    }            
}

int main(void)
{
    Led_Init();
    
    while(1)
    {
        delay(500);
        
        //灯灭    GPIO 端口输出数据寄存器
        GPIOF_ODR |= (0x01<<9);            // LED0 第9位置1
        //灯亮
        GPIOF_ODR &= ~(0x01<<10);        // LED1 第10位清0
        
        delay(500);
        GPIOF_ODR |= (0x01<<10);        // LED1 第10位置1
        GPIOE_ODR &= ~(0x01<<13);        // FSMC_D10 第13位清0
        
        delay(500);
        GPIOE_ODR |= (0x01<<13);        // FSMC_D10 第13位置1
        GPIOE_ODR &= ~(0x01<<14);        // FSMC_D11 第14位清0
        
        delay(500);
        GPIOE_ODR |= (0x01<<14);        // FSMC_D11 第14位置1
        GPIOE_ODR &= ~(0x01<<13);        // FSMC_D10 第13位清0
        
        delay(500);
        GPIOE_ODR |= (0x01<<13);        // FSMC_D10 第13位置1
        GPIOF_ODR &= ~(0x01<<10);        // LED1 第10位清0
        
        delay(500);
        GPIOF_ODR |= (0x01<<10);        // LED1 第10位置1
        GPIOF_ODR &= ~(0x01<<9);        // LED0 第9位清0
    }
    return 0;
}


效果动图(略)。

  • 15
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值