野火霸天虎 STM32F407 学习笔记_5 按键输入;位带操作介绍

news2024/11/24 11:29:29

输入——按键点灯

开发板按键电路如下:

image-20231109191525189

按键未按下接地,按下后为高电平。电容起到消抖作用,软件处理就不需要手动延时消抖了。

编程没啥难度,就是改了一下输入模式。使用 ReadInputDataBits 读取。

//bsp_button.c
#include "bsp_button.h"

void Button_GPIO_Config(void){
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
    {
        GPIO_InitTypeDef GPIOInitStruct;
        GPIOInitStruct.GPIO_Mode=GPIO_Mode_IN;
        GPIOInitStruct.GPIO_Pin=GPIO_Pin_0;
        GPIOInitStruct.GPIO_OType=GPIO_OType_PP;
        GPIOInitStruct.GPIO_Speed=GPIO_Speed_50MHz;
        GPIOInitStruct.GPIO_PuPd=GPIO_PuPd_NOPULL;
        
        GPIO_Init(GPIOA,&GPIOInitStruct);
    }
}

//main.c
#include "stm32f4xx.h"

#include "bsp_led.h"
#include "bsp_button.h"

int main()
{
    //RCC
    LED_GPIO_Config();
    Button_GPIO_Config();
    while (1)
    {
        if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0))GPIO_SetBits(GPIOF, GPIO_Pin_6);
        else GPIO_ResetBits(GPIOF, GPIO_Pin_6);
    }
}

实现按键按下后翻转:

int main()
{
    //RCC
    LED_GPIO_Config();
    Button_GPIO_Config();
    while (1)
    {
        if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==Bit_SET){
            while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==Bit_SET);
            GPIO_ToggleBits(GPIOF, GPIO_Pin_6);
        }
    }
}

要等到按键松开的时候再翻转,轮询直到松开。

位带操作

之前51单片机常见位定义。比如 PA 引脚有8个 IO 口,我们可以定义 sbit LED1=PA^0 这样单独操作某一位。

stm32 里没有直接的位定义方式。一种解决办法是我们利用与或操作不影响其他位的同时操作特定位;另一种就是位带操作。

stm32 里有一部分别名区域,用于映射外设、SRAM 中特定的位带区,我们操作这一部分别名区域时就可以实现对外设、SRAM 位带区与的位操作。

片上外设位带区:0X4000 0000~0X400F 0000,别名区:0X4200 0000~0X43FF FFFF,包含 APB12,AHB1 外设。

SRAM 位带区:0X2000 0000~0X200F 0000,别名区:0X2200 0000~0X23FF FFFF

image-20231109220918350

外设地址 A 别名地址为:AliasAddr= =0x42000000+ (A-0x40000000)84 +n*4 (n是位序号)

SRAM 地址 A 别名地址为:AliasAddr= =0x22000000+ (A-0x20000000)84 +n*4

扩大了32倍,可以对32位寄存器中的每一位进行操作。

统一公式:\#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x02000000+((addr & 0x000FFFFF)<<5)+(bitnum<<2))

使用:比如我们操作一个 GPIO 的位操作。

#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x02000000+((addr & 0x000FFFFF)<<5)+(bitnum<<2))
// 把一个地址转换成一个指针
#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
// 把位带别名区地址转换成指针
#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))

// GPIO ODR 和 IDR 寄存器地址映射
#define GPIOF_ODR_Addr (GPIOF_BASE+20)
#define GPIOF_IDR_Addr (GPIOF_BASE+16)

// 单独操作 GPIO 的某一个 IO 口,n(0,1,2...15),
// n 表示具体是哪一个 IO 口
#define PFout(n) BIT_ADDR(GPIOF_ODR_Addr,n) //输出
#define PFin(n) BIT_ADDR(GPIOF_IDR_Addr,n) //输入

//使用示例
PFout(6)= 0;

这个概念学学就好,好像实际应用没啥意义。我们微处理器考试也考过hh。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1190072.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

golang 2018,go 1.19安装Gin

GOPROXYhttps://mirrors.aliyun.com/goproxy/ 一致提示URL不能有点&#xff0c;给我整郁闷了&#xff0c;换了这个地址好了 但是一致提示zip的包问题&#xff0c;最后还是不行又换回七牛 NEWBEE&#xff01; [GIN-debug] Environment variable PORT is undefined. Using por…

SAE 2.0,让容器化应用开发更简单

云原生容器化应用托管模式的演变 云原生这个概念从提出&#xff0c;到壮大&#xff0c;再到今天的极大普及&#xff0c;始终处于一个不断演进和革新的过程中。云原生体系下应用的托管形态是随着企业应用架构在不断演进的。最早的应用大多是集中式、单体式的&#xff0c;应用通…

多元高斯分布

下面我们来看一下多元高斯分布&#xff0c;叫做 multivariative 高斯分布&#xff0c;也就是目前的情况是向量的形式&#xff0c;也就是说我的 x 它是一个向量&#xff0c;那这个情况下我们的高斯分布应该怎么去表示&#xff1f;我们这里面重点还是来看一下它的一个表示的方法&…

【Linux系统编程十五】:(基础IO2)--重定向实现原理 “Linux下一切皆文件“

【Linux系统编程十五】&#xff1a;重定向原理 与 "Linux下一切皆文件" 一.重定向1.实现原理2.输出重定向3.输入重定向4.补充&#xff1a;简易shell中实现重定向 二."Linux下一切皆文件"1.虚拟文件系统(VFS) 一.重定向 我们首先关闭2号文件描述符&#xff…

HTTP协议 和 HTTPS协议

一、HTTP协议&#xff1a; HTTP协议是超文本传输协议的缩写&#xff0c;英文是Hyper Text Transfer Protocol。它是从WEB服务器传输超文本标记语言(HTML)到本地浏览器的传送协议。 设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。HTPP有多个版本&#xff0c;目前…

Read Completion Boundary (RCB)切分规则

Read Completion Boundary(RCB) 切分规则 Read Completion Boundary(RCB) 简介 当Read Completion 包含multi-completions时&#xff0c;RCB 规定了多个Completions地址的align规则。Spec中规定RCB可以是64 Byte或者128 Byte&#xff0c;该值可以在link_control register中得…

什么是观察者模式?用 Python 如何实现 Observer(观察者或发布订阅)对象行为型模式?

什么是观察者模式&#xff1f; 观察者模式&#xff08;Observer pattern&#xff09;是一种行为型设计模式&#xff0c;它允许对象之间建立一种一对多的依赖关系&#xff0c;当一个对象的状态发生变化时&#xff0c;其相关依赖对象都会得到通知并自动更新。 在观察者模式中&am…

Leo赠书活动-06期 【强化学习:原理与Python实战】文末送书

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 赠书活动专栏 ✨特色专栏&#xff1a;…

CVE-2023-0179-Nftables整型溢出

前言 Netfilter是一个用于Linux操作系统的网络数据包过滤框架&#xff0c;它提供了一种灵活的方式来管理网络数据包的流动。Netfilter允许系统管理员和开发人员控制数据包在Linux内核中的处理方式&#xff0c;以实现网络安全、网络地址转换&#xff08;Network Address Transl…

MySQL 数据库表格创建、数据插入及获取插入的 ID:Python 教程

创建表格 要在MySQL中创建表格&#xff0c;请使用"CREATE TABLE"语句。 确保在创建连接时定义了数据库的名称。 示例创建一个名为 “customers” 的表格&#xff1a; import mysql.connectormydb mysql.connector.connect(host"localhost",user"…

图文解析 Nacos 配置中心的实现

目录 一、什么是 Nacos 二、配置中心的架构 三、Nacos 使用示例 &#xff08;一&#xff09;官方代码示例 &#xff08;二&#xff09;Properties 解读 &#xff08;三&#xff09;配置项的层级设计 &#xff08;四&#xff09;获取配置 &#xff08;五&#xff09;注册…

nfs配置

1.NFS介绍 NFS就是Network File System的缩写&#xff0c;它最大的功能就是可以通过网络&#xff0c;让不同的机器、不同的操 作系统可以共享彼此的文件。 NFS服务器可以让PC将网络中的NFS服务器共享的目录挂载到本地端的文 件系统中&#xff0c;而在本地端的系统中来看&#…

【gltf-pipeline】安装gltf-pipeline 进行文件格式转换

问题 想使用gltf-pipeline进行gltf和glb格式转换。简单记录一下安装过程。 解决 1、安装Node.js Node.js下载路径&#xff1a;https://nodejs.org/en 建议默认设置安装。 添加系统环境变量&#xff1a; 测试安装是否成功&#xff1a; 在cmd.exe中运行&#xff1a; no…

基于SSM的建筑装修图纸管理平台

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

基于ssm的校园办公室报修管理系统

基于ssm的校园办公室报修管理系统 摘要 基于SSM的校园办公室报修管理系统是一个现代化的、高效的报修平台&#xff0c;它能够帮助校园内的教职工和学生更方便、更快捷地提交和处理报修请求。该系统基于Spring、SpringMVC和MyBatis&#xff08;简称SSM&#xff09;开发&#xff…

【MySQL】一文学会所有MySQL基础知识以及基本面试题

文章目录 前言 目录 文章目录 前言 一、主流数据库以及如何登陆数据库 二、常用命令使用 三、SQL分类 3.1 存储引擎 四、创建数据库如何设置编码等问题 4.1操纵数据库 4.2操纵表 五、数据类型 六、表的约束 七、基本查询 八、函数 九、复合查询 十、表的内连和外连 十一、索引…

第十八章Swing程序设计总结

例题18.1&#xff1a;第一个窗体程序 例题18.2&#xff1a;在窗体中弹出对话框 例题18.3&#xff1a;弹出会话框&#xff0c;问用户准备好了吗&#xff1f; 例题18.4&#xff1a;弹出会话框&#xff0c;询问用户是否离开 例题18.5&#xff1a;弹出会话框&#xff0c;让用户输入…

特殊矩阵的压缩存储(对称矩阵,三角矩阵,三对角矩阵,稀疏矩阵)

目录 1.数组的存储结构1.—维数组2.二维数组1.行优先存储2.列优先存储 2.特殊矩阵1.对称矩阵1.行优先存储 2.三角矩阵1.上三角矩阵2.下三角矩阵 3.三对角矩阵&#xff08;带状矩阵&#xff09;4.稀疏矩阵 1.数组的存储结构 1.—维数组 各数组元素大小相同&#xff0c;且物理上…

vue-router路由守卫进阶

vue-router路由守卫进阶 路由守卫&#xff0c;可以想象为古代御前侍卫&#xff0c;路由守卫&#xff0c;则是对路由进行权限控制 分类&#xff1a;全局守卫、独享守卫、组件内守卫 全局前置-路由守卫 作用&#xff1a;主要用来鉴权 用户点击导航区&#xff0c;随后引起路径的…

Android平台上执行C/C++可执行程序,linux系统编程开发,NDK开发前奏。

Android平台上执行C/C可执行程序&#xff0c;linux系统编程开发&#xff0c;NDK开发前奏准备。 1.下载NDK&#xff0c;搭建NDK开发环境 下载地址 https://developer.android.com/ndk/downloads 下载过程中点击下面箭头的地方&#xff0c;点击鼠标右键&#xff0c;复制好下载…