文章目录

  • GPIO实战
    • 点LED灯
      • 寄存器配置
      • 固件库函数配置
    • 按键点灯

GPIO实战

GPIO 简介
每个通用 I/O 端口包括 4 个 32 位配置寄存器( GPIOx_MODER、 GPIOx_OTYPER、
GPIOx_OSPEEDR 和 GPIOx_PUPDR)、 2 个 32 位数据寄存器(GPIOx_IDR 和
GPIOx_ODR)、 1 个 32 位置位/复位寄存器 (GPIOx_BSRR)、 1 个 32 位锁定寄存器
(GPIOx_LCKR) 和 2 个 32 位复用功能选择寄存器( GPIOx_AFRH 和 GPIOx_AFRL)。
GPIO 主要特性
● 受控 I/O 多达 16 个
● 输出状态:推挽或开漏 + 上拉/下拉
● 从输出数据寄存器 (GPIOx_ODR) 或外设(复用功能输出)输出数据
● 可为每个 I/O 选择不同的速度
● 输入状态:浮空、上拉/下拉、模拟
● 将数据输入到输入数据寄存器 (GPIOx_IDR) 或外设(复用功能输入)
● 置位和复位寄存器 (GPIOx_BSRR),对 GPIOx_ODR 具有按位写权限
● 锁定机制 (GPIOx_LCKR),可冻结 I/O 配置
● 模拟功能
● 复用功能输入/输出选择寄存器(一个 I/O 最多可具有 16 个复用功能)
● 快速翻转,每次翻转最快只需要两个时钟周期
● 引脚复用非常灵活,允许将 I/O 引脚用作 GPIO 或多种外设功能中的一种

点LED灯

新建led.c和led.h两个文件分别存放在user中的src和inc

led.h为了防止重复定义,就要写上
#ifndef 也就是if not define
然后包含进stm32f4xx.h这个固件库

最后要加上#endif才算完成

#ifndef _LED_H
#define _LED_H
#include "stm32f4xx.h"#endif

接下来是led.c
我的小灯是在PB8和PB9两个口,接下来我以这两个口为例子

其中有两种方式配置gpio口
一种是寄存器配置
一种是直接使用st公司给的固件库函数配置

我们一一介绍

寄存器配置

首先我们GPIO的时钟是在AHB1上
所以我们要使用这个GPIO口,必须先打开他的时钟才可以使用

由图,我们可以看到,我们要用的pb口在1位,也就是需要在0位上左移一位。所以

RCC->AHB1ENR |= 1 << 1;//打开gpioB的时钟

我们需要让RCC时钟中的AHB1ENR的1号位使能,|=1在这里的意思暂时可以先简单理解为,把二进制的1填入,因为我们要让他的时钟打开,所以要填入一个1让他的时钟使能。

那么,代码后面的<<1是什么意思呢,是左移1位的意思,因为初始位是0,也就是PA口的位置,如果不左移,那么我们打开的时钟就是PA口的了。
同理,左移两位可以打开PC口的时钟。

时钟打开了,那么我们接下来就是要配置gpio口了

接下来是gpio的寄存器配置。

 GPIOB->MODER &=~ (3<<16);//GPIOB->MODER |= (1<<16);//

根据stm32f4xx的中文参考手册

我们可以看到,我们需要控制的PB8口,处于寄存器中的16,17位,那么 我们此时为了点灯,需要打开通用输出模式,所以需要给16,17位的寄存器填入二进制数01,转化成十进制就是1,所以

GPIOB->MODER |= (1<<16);

,但是,在此之前,寄存器的状态是不确定的,我们需要先清零,再填入01,所以,

GPIOB->MODER &=~ (3<<16);//

这一句出现了新的运算,&=~ 的意思可以简单理解为为了清零而使用的位与,因为这些设置模式的寄存器占2位,所以二进制的11转化为十进制就是3,我们需要清零的寄存器占几位,就填入那个位数的最大值,然后左移16位到达pb8的模式寄存器,将他清零。
这里的**&=~**大家可能不太理解,可以百度搜索 位与和位或 ,方便大家理解为什么他可以把寄存器清零。
好了,清零之后,填入一个1,我们就把他的寄存器模式设置为了通用输出模式。

接下来是输出类型寄存器

GPIOB->OTYPER &=~ (1<<8);

因为0是推挽模式,1是开漏模式,我们需要的是0的推挽模式,所以我们直接把寄存器清零就行了。

这一段是输出速度寄存器

GPIOB->OSPEEDR |= (2<<16);

十进制的2 转化为二进制中的01,然后填入这个寄存器,这个模式的复位值影响不到我们的PB8,所以不用清零。

GPIOB->PUPDR &=~ (3<<16);//

我们需要的是浮空模式,浮空模式是00,我们直接清零就好了

GPIOB->ODR |= 1 << 8;

pb8置位为1,置位为1时输出高电平,则灯灭。
反之,则灯亮。

最后理解完,你就可以在
led.c中写一个led灯的配置函数

void Led_Config(void)
{RCC->AHB1ENR |= 1 << 1;//打开GPIOB的时钟//PB8初始化GPIOB->MODER &=~ (3 << 2 * 8);//清零GPIOB->MODER |= (1 << 2 * 8);//通用输出模式GPIOB->OTYPER &=~ (1 << 8);//推挽功能GPIOB->OSPEEDR |= 2 << 2 * 8;//速度50MhzGPIOB->PUPDR &=~ (3 << 2 * 8);//无上下拉GPIOB->ODR |= 1 << 8;//默认灭}

led.h中,声明这个led的配置函数,这样当其他.c文件包含了led.h这个头文件,这个函数就可以直接拿出来使用。

#ifndef _LED_H
#define _LED_H#include "stm32f4xx.h"void Led_Config(void);
#endif

在main.h中加入 #include “led.h” 包含led.c头文件

在main.c中的while(1)中加入

 GPIOB->ODR &=~ (1 << 8);

让输出数据寄存器ODR清零,灯亮。

固件库函数配置

st公司的固件库把我们需要的函数给我们写好了,我们直接拿来用就是了。

void LED_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);//打开gpioB的时钟GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;//gpio模式设置为输出GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;//设置为推挽模式GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;//配置pin8与pin9GPIO_InitStruct.GPIO_Speed = GPIO_Medium_Speed;//传输速度设置为中等速度GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;//浮空输出,无上下拉。GPIO_Init(GPIOB,&GPIO_InitStruct);//配置完以后,gpio初始化GPIO_SetBits(GPIOB,GPIO_Pin_8);//默认设置pin8为高电平,此时灯灭GPIO_SetBits(GPIOB,GPIO_Pin_9);//默认设置pin9为高电平,此时灯灭}

按键点灯

#define KEY2 GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13)

在key.h中写入这一句定义,将KEY2定义为函数读取pc13的状态。

void key_init(void)
{GPIO_InitTypeDef GPIO_InitStruct;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);//打开pc口时钟GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;//设置模式为输入GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;//推挽模式GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;//pin13GPIO_InitStruct.GPIO_Speed = GPIO_High_Speed;//高速GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;//浮空GPIO_Init(GPIOC,&GPIO_InitStruct);//初始化}void KEY2_LED2(void){if(KEY2==Bit_RESET){   //如果读取到低电平,也就是按下按钮Delay_ms(20);//延时20mswhile(KEY2==Bit_RESET){}//这里比较难理解,作用是如果不松开按钮,就会一直卡在这个死循环,这里相当于锁存的作用GPIO_ToggleBits(GPIOB, GPIO_Pin_9);                //反转电平  Delay_ms(20);}
}

到此,使用库函数确实相当方便,但是应该理解寄存器是怎样运行的。

【STM32f401学习之路-01】GPIO实战—点灯、检测按键相关推荐

  1. C语言-学习之路-01

    C语言学习之路-01 目录 关键字 数据类型 常量 变量 声明和定义 进制 sizeof关键字 整型:int short.int.long.long long 字符型:char ASCII对照表 转义 ...

  2. Linux学习之路01

    决心开始学习自学Linux,以前混迹贴吧,现在觉得自己开始写一下博客,记录一下自己的学习之路,同时也是希望自己算是自己自学动手练习的记录吧. -- 题序 登录SSH服务 新建一个hello.c文件 # ...

  3. python 零基础学习之路-01 计算机硬件

    一套完整的计算机系统分为:计算机硬件,操作系统,应用软件,如下图.因而我们的python编程之路分为计算机硬件基础,操作系统基础,和python编程三部分,而我们便是最先从计算机硬件开始学习的. 一 ...

  4. Java学习之路01——2021年职业规划

    目录 前言 1.职业规划 2.2020年12月--->2021年12月学习计划 2.1.java技术栈 2.2.学习要求 2.3.学习时间 2.4.学习方式 2.5.最终达到的水平 总结 前言 ...

  5. 我的HTML学习之路01

    写在前面: 此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) HTML学习 HTML HTML基础 实例 HTML标题 H ...

  6. KDL学习之路01:KDL(Kinematics and Dynamics Library)入门学习

    前言:搞工业机器人研究的,很少有不知道KDL的吧,机器人的正.逆运动学求解是一个非常重要的内容. KDL源码编译安装 首先在github上下载KDL的最新源码,接着通过手动编译安装. cd oroco ...

  7. Axure学习之路01——元件介绍

    本系列博客的目的是记录Auxure软件使用的一些要点. 学习课程来自:Axure 9从入门到精通. 目录 一些设计资源 基本元件 图片 占位符 图像热区 动态面板 内联框架 中继器 表单元件 文本框 ...

  8. libGDX学习之路01(续):把libGDX项目部署到iOS

    前言 libGDX是一个非常强大的框架,我在写下libGDX入门那篇文章的时候,没能成功解决把libGDX项目部署到iOS设备上并运行,在我查了很多资料和反复实验中,我总结了一些经验,希望能帮到大家. ...

  9. EF Core的学习之路01

    本文章是我听B站杨中科的所做的笔记 杨中科B站视频链接:.NET 6教程,.Net Core 2022视频教程,杨中科主讲_哔哩哔哩_bilibili 什么时ORM 1.说明:本课程需要你有数据库.S ...

  10. 【三维重建学习之路01】点云ply文件的读写、修改

    文章目录 1.前言 2.PLY文件格式 3.读文件 变量.库 查看头文件.vertex信息 数据类型 读文件函数 按行阅读检查 4.写文件 参考: 1.前言 关于使用python读写ply的比较清楚的 ...

最新文章

  1. 帝国cms7.5多终端刷新单条内容信息时不起作用的解决方法
  2. python将字符转换为字典
  3. redis哨兵集群的搭建
  4. ubuntu18.04安装python3.7并将python3指向python3.7
  5. 项目-团队-技术-个人 (团队建设篇)
  6. WinDBg定位asp.net mvc项目异常崩溃源码位置
  7. 获取当地天气_Mac 天气预报动态壁纸工具Living Weather HD 4.4.4
  8. python 持续集成方案_Jenkins+Python+GitLab持续集成
  9. HashMap底层分析_put添加元素
  10. 音视频技术傻瓜版解析:带你解锁RTMP
  11. 喜马拉雅下载文件名批量修改
  12. python支持arcpy的版本_ArcPy开发IDE
  13. opengl交叉编译
  14. TeeChart Pro ActiveX教程(十九):TeeChart工具集(六)
  15. win10 office提示‘VBE6EXT.OLB不能被加载‘怎么办
  16. 双11有哪些好用的降噪蓝牙耳机值得推荐?降噪蓝牙耳机性价比排行
  17. 兔子数列规律怎么讲_神奇兔子数列
  18. 理解posixpath.py in Python
  19. stm32f407固件库移植ucosii_v2.92.07
  20. 迁移学习概述(Transfer Learning)

热门文章

  1. python开发语音录入_用Excel及Python实现数据录入语音校对功能
  2. exls表格搜索快捷键_excel表格快速查找快捷键
  3. ArcMap进行标记符号制作
  4. 体验一命通关 - Java技能树测评
  5. VINS-Mono代码解读——视觉跟踪 feature_trackers
  6. 简单三步搭建电影网站 :安装MacCMS10 1-3
  7. 微信小程序对接微信支付详细教程
  8. 1 k 1 k2c语言,一张图告诉你斐讯路由器K1S、K2,K2C的区别
  9. 坚果pro2官方rom_锤子坚果Pro2刷机包_原版升级包 锤子坚果Pro2线刷包_官方固件rom包下载...
  10. 王珞丹用手写传递情感 字体入库笔尖上的中国