STM32F4学习笔记—GPIO_点亮LED(基于寄存器)

一、资料准备

1.写在前面

本教程属于个人开发学习过程,内容尽量做到通俗易懂,直入主题,主打的就是一个话少活多,通过例程让新手玩家快速上手,主要参考资料为STM32F4中文参考手册,开发板为STM32F407ZGT6,开发工具为VS Code+CubeMX。话不多说直接开码。

二、硬件原理

LED硬件连接

2.1原理图分析

通过上面的原理图,可以很清楚的知道,PF9输出高电平DS0熄灭,输出低电平DS0点亮;同理可知:PF10输出高电平DS1熄灭,输出低电平DS1点亮。这样我们就有了一个基本的代码思路了,这在以后的学习中也是非常重要的,如何把我们的想法编程代码?

2.2思路分析

2.2.1使能GPIOF的时钟

在这里插入图片描述

位 5 GPIOFEN: IO 端口 F 时钟使能 (IO port F clock enable)
由软件置 1 和清零。
0:禁止 IO 端口 F 时钟
1:使能 IO 端口 F 时钟

在手册中可以看到,往这个寄存器写1就是使能,代码就这么写:

//1.使能GPIOF时钟
    RCC->AHB1ENR |= 1<<5;

2.2.2初始化GPIOF

在这个环节里主要注意这几个参数就可以了

1.端口模式寄存器

在这里插入图片描述

2.端口输出类型寄存器

在这里插入图片描述
在这里插入图片描述

3.端口输出速度寄存器

在这里插入图片描述
代码如下:

//2.初始化GPIO引脚
    //2.1端口模式
    GPIOF->MODER |= 1<<18;//通用输出模式(2y~2y+1)->PF9
    GPIOF->MODER |= 1<<20;//通用输出模式(2y~2y+1)->PF20
    //2.2端口输出类型
    GPIOF->OTYPER &= ~(1<<9);//推挽输出(0~15)->PF9
    GPIOF->OTYPER &= ~(1<<10);//推挽输出(0~15)->PF10
    //2.3输出速度
    GPIOF->OSPEEDR |= 1<<19;//快速(2y~2y+1)->PF9
    GPIOF->OSPEEDR |= 1<<21;//快速(2y~2y+1)->PF10 

2.2.3控制端口输出数据(0:1)

这里的话,中文手册GPIO寄存器继续往下看,我们就可以看到这个寄存器:
在这里插入图片描述
同上,可知代码如下:

//2.1端口输出高电平
        GPIOF->ODR |= 1<<9;//高电平(0~15)->PF9
        HAL_Delay(50);//延时500毫秒
        //2.2端口输出低电平数据
        GPIOF->ODR &= ~(1<<9);//低电平(0~15)->PF9
        HAL_Delay(50);

这样就可以,简单实现DS0闪烁的现象。

三、 软件设计

3.1LED.c

#include "led.h"

void gpio_init(void)
{
    //1.使能GPIOF时钟
    RCC->AHB1ENR |= 1<<5;
    //2.初始化GPIO引脚
    //2.1端口模式
    GPIOF->MODER |= 1<<18;//通用输出模式(2y~2y+1)->PF9
    GPIOF->MODER |= 1<<20;//通用输出模式(2y~2y+1)->PF20
    //2.2端口输出类型
    GPIOF->OTYPER &= ~(1<<9);//推挽输出(0~15)->PF9
    GPIOF->OTYPER &= ~(1<<10);//推挽输出(0~15)->PF10
    //2.3输出速度
    GPIOF->OSPEEDR |= 1<<19;//快速(2y~2y+1)->PF9
    GPIOF->OSPEEDR |= 1<<21;//快速(2y~2y+1)->PF10  
}
void led_test(void)
{
    //1.初始化GPIO 
    gpio_init();
    //2.测试
    while(1)
    {
        //2.1端口输出高电平
        GPIOF->ODR |= 1<<9;//高电平(0~15)->PF9
        HAL_Delay(50);//延时50毫秒
        //2.2端口输出低电平数据
        GPIOF->ODR &= ~(1<<9);//低电平(0~15)->PF9
        HAL_Delay(50);

        GPIOF->ODR |= 1<<10;//高电平(0~15)->PF10
        HAL_Delay(100);//延时500毫秒
        //2.2端口输出低电平数据
        GPIOF->ODR &= ~(1<<10);//低电平(0~15)->PF10
        HAL_Delay(100);
    }
}

3.2LED.h

#ifndef __LED_H
#define __LED_H

#include "main.h"

void led_test(void);

#endif

3.3main.c

#include "main.h"
#include "led.h"
/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  HAL_Init();
  SystemClock_Config();
  led_test();//DS0闪烁
  while (1)
  {
    
  }

}

四、下载验证

代码正常运行的话,现象如下:DS0每隔50ms闪烁,DS1每隔100ms闪烁
在这里插入图片描述

五、写在后面

1.为什么学习寄存器版本

因为标准库以及hal库开发,就像是做阅读理解一样;而寄存器开发则更像是做完形填空一样,更有利于提升实力,在接触未知的开发板的时候也可以轻松应对。多看数据手册也有利于增加分析时序图以及编程思想的能力

2.代码优化

本章介绍的代码写法,其实并不利于移植,很多地方可以采用宏的方式使得代码更加精简,便于移植。后续我会将优化代码链接发出来。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值