【STM32】嵌入式实验二 GPIO 实验 (前三个设计)

1. 按键亮灯

设计 GPIO 实验项目 1,功能:当按键 KB1 按下时,实验板上全彩发光二极管周边 的发光二极管全亮,当按键 KB2 按下时跑马灯 D0 闪亮。

实验要求基于寄存器的GPIO配置,所以需要手动操作寄存器来配置时钟和输入输出模式(如果不要求,在cubemx里可以直接配置)。

跑马灯和按键KB1,KB2的端口模式为推挽输出和输入,因此需要编程将它们设置为对应的模式:

 参考下面的端口位配置表,

一个端口占用配置寄存器的四位来设置工作模式,可以知道CRL(0-7(低八位)的引脚对应CRL配置寄存器)里输出跑马灯和输入按键KB1,KB2的每个端口应配置为:0011(16进制0x3)和0100(16进制0x4)

 那么,使用 CubeMX 创建工程,只设置芯片选型、 系统时钟、调试端口; GPIO 配置在程序中通过寄存器配置完成。

按键按下为低电平,所以检测 数据输入寄存器(GPIOx_IDR)与(&)上对应位为1的数的 结果,比如PE0就是与 0x01。

if((GPIOE->IDR&0X01)==0){flag=1;}else if((GPIOE->IDR&0X02)==0){flag=2;}

功能是 当按键 KB1 按下时,实验板上全彩发光二极管周边 的发光二极管全亮,当按键 KB2 按下时跑马灯 D0 闪亮,因为跑马灯是高电平点亮,就是数据输出寄存器 GPIOF_ODR 对应位 置为1,D0闪亮的话就是对这一位不断取反,这一位异或1其他位异或0即可。

if(flag==1){GPIOF->ODR|=0XFF;}else if(flag==2){GPIOF->ODR^=0X01;HAL_Delay(50);}

主要代码如下:

#flag设为全局变量,方便调试查看
int flag=0;
int main(void)
{HAL_Init();/* Configure the system clock */SystemClock_Config();/* Initialize all configured peripherals */MX_GPIO_Init();RCC->APB2ENR|=1<<7;//使能PORTF时钟GPIOF->CRL&=0X00000000;GPIOF->CRL|=0X33333333;//PF.0-PF.7推挽输出GPIOF->ODR=0X00;//清除显示RCC->APB2ENR|=1<<6;//使能PORTE时钟GPIOE->CRL&=0X00;GPIOE->CRL|=0X44;//PE.0-PE.1开漏输入while (1){if((GPIOE->IDR&0X01)==0){flag=1;}else if((GPIOE->IDR&0X02)==0){flag=2;}else flag=0;if(flag==1){GPIOF->ODR|=0XFF;}else if(flag==2){GPIOF->ODR^=0X01;HAL_Delay(50);}else{GPIOF->ODR=0X00;}}
}

2.顺时针方向旋转的跑马灯

实现顺时针方向旋转的跑马灯,跑马灯延时 0.2 秒。按照灯的顺序,将GPIOF_ODR 对应位 置为1。

基于寄存器:

RCC->APB2ENR|=1<<6;GPIOE->CRL&=0X00000000;GPIOE->CRL|=0X44;//while里for(int i=0;i<8;i++){GPIOF->ODR=0X01<<i;
//这里的延时不是0.2s,自行调整for(int k=0;k<100000;k++);}

HAL库:

uint16_t x=0x0001;
for(int i=0;i<8;i++){//GPIOF->ODR=0X01<<i;//for(int k=0;k<100000;k++);HAL_GPIO_WritePin(GPIOF,x<<i,1);HAL_Delay(200);HAL_GPIO_WritePin(GPIOF,x<<i,0);}

 3.按键控制跑马灯方向

编写程序,当按键 KB1 按下时,跑马灯按顺时针方向旋转,按下 KB2 时,跑马灯 按逆时针方向旋转。

结合前两者代码,为了方便,逆时针用新的变量y=0x0080 右移 来选择八个灯的引脚。

RCC->APB2ENR|=1<<6;GPIOE->CRL&=0X00000000;GPIOE->CRL|=0X44;uint16_t x=0x0001;uint16_t y=0x0080;while (1){if((GPIOE->IDR&0X01)==0){flag=1;}else if((GPIOE->IDR&0X02)==0){flag=2;}else if(HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_6)==0){flag=3;}//else flag=0;if(flag==1){for(int i=0;i<8;i++){HAL_GPIO_WritePin(GPIOF,x<<i,1);HAL_Delay(200);HAL_GPIO_WritePin(GPIOF,x<<i,0);}}else if(flag==2){for(int i=0;i<8;i++){HAL_GPIO_WritePin(GPIOF,y>>i,1);HAL_Delay(200);HAL_GPIO_WritePin(GPIOF,y>>i,0);}}else if(flag==3){}else{GPIOF->ODR=0X00;}}}

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

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

相关文章

联想小新Air14-2019锐龙版更换硬盘

首先打下D面所有螺丝&#xff08;内六角螺丝&#xff0c;需要准备螺丝刀&#xff09;&#xff0c;然后从下方翘起整个D面打开如下图 原装为2280长度的海力士硬盘&#xff0c;有空余的2242长度硬盘位 更换前断电&#xff0c;建议拆下电池&#xff08;扣下电池排线后不好安装&am…

每日OJ题_完全背包④_力扣279. 完全平方数(一维和二维)

目录 力扣279. 完全平方数 问题解析 解析代码 优化代码&#xff08;相同子问题分析和滚动数组&#xff09; 力扣279. 完全平方数 279. 完全平方数 难度 中等 给你一个整数 n &#xff0c;返回 和为 n 的完全平方数的最少数量 。 完全平方数 是一个整数&#xff0c;其值…

百科不全书之 docker记录

docker记录 1 参考文件2. Docker简介与虚拟机的区别 1 参考文件 参考视频&#xff1a;B站【GeekHour】30分钟Docker入门教程: link 2. Docker简介 Docker是一个用于构建运行 传送 应用程序的平台。 与虚拟机的区别 虚拟机使用了一种叫做虚拟化的技术。每台虚拟机需要占…

固定测斜仪:工程观测的精密利器

在工程观测测量领域&#xff0c;固定测斜仪扮演着至关重要的角色。固定测斜仪&#xff0c;凭借其耐冲击型倾斜传感器、出色的可靠性、快速稳定的特点&#xff0c;以及简洁的安装和智能识别功能&#xff0c;已成为行业内重要工具。其输出信号为RS485数字量&#xff0c;可直接显示…

使用electron打包vuecli创建的项目

下面是我打包的时候才过的所有的坑&#x1f4a3;&#xff1a; 首先创建一个vue2的空项目&#xff0c;如果全局安装的vue-cli版本太低&#xff0c;低于3就无法使用vue create命令&#xff0c;必须使用uninstall将之前的卸载掉&#xff0c;在重现安装&#xff0c;之后的就是最近…

握手问题(蓝桥杯)

文章目录 握手问题【问题描述】答案&#xff1a;1204解题思路模拟 握手问题 【问题描述】 小蓝组织了一场算法交流会议&#xff0c;总共有 50 人参加了本次会议。在会议上&#xff0c;大家进行了握手交流。按照惯例他们每个人都要与除自己以外的其他所有人进行一次握手&#…

Scrapy框架内存泄漏问题及解决

说明&#xff1a;仅供学习使用&#xff0c;请勿用于非法用途&#xff0c;若有侵权&#xff0c;请联系博主删除 作者&#xff1a;zhu6201976 一、问题背景及原因 官方文档&#xff1a;Debugging memory leaks — Scrapy 2.11.1 documentation Scrapy是一款功能强大的网络爬虫框…

SpringMVC 常用注解介绍

Spring MVC 常用注解介绍 文章目录 Spring MVC 常用注解介绍准备1. RequestMapping1.1 介绍2.2 注解使用 2. 请求参数2.1 传递单个参数2.2 传递多个参数2.3 传递对象2.4 传递数组 3. RequestParam3.1 注解使用3.2 传入集合 4. RequestBody5. PathVariable6. RequestPart7. Rest…

k8s使用harbor私有仓库镜像 —— 筑梦之路

官方文档: Secret | Kubernetes ImagePullSecrets的设置是kubernetes机制的另一亮点&#xff0c;习惯于直接使用Docker Pull来拉取公共镜像&#xff0c;但非所有容器镜像都是公开的。此外&#xff0c;并不是所有的镜像仓库都允许匿名拉取&#xff0c;也就是说需要身份认证&…

23 种设计模式

设计模式 1、工厂方法 消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如何创建及如何向客户端提供。 2、建造者模式 建造模式:将产品的内部表象和产品的生成过程分割开来,从而使一…

【electron3】electron将数据写入本地数据库

安装 yarn add sqlite3 --save连接并调用数据库&#xff0c;创建表 createDB.ts文件内容 const sqlite3 require(sqlite3) const NODE_ENV process.env.NODE_ENV const path require(path) const { app } require(electron) let DB_PATH path.join(app.getAppPath(), /…

【Linux学习】Linux指令(四)

文章标题 &#x1f680;zip/unzip指令&#xff1a;&#x1f680;tar指令&#xff08;重要&#xff09;&#xff1a;&#x1f680;uname –r指令&#xff1a;&#x1f680;关机指令&#x1f680;几个常用操作 &#x1f680;zip/unzip指令&#xff1a; zip 与 unzip的安装 yum i…

Spring-dataSource事务案例分析-使用事务嵌套时,一个我们容易忽略的地方

场景如下&#xff1a; A_Bean 中的方法a()中调用B_Bean的b();方法都开启了事务&#xff0c;使用的默认的事务传递机制&#xff08;即&#xff1a;属于同一事务&#xff09;&#xff1b; 如下两种场景会存在较大的差异&#xff1a; 在b()方法中出现了异常&#xff0c;在b()中进…

数据库主从备份

1、简介 数据库运⾏时&#xff0c;⼀些因素可能会导致服务运⾏不正常&#xff0c;⽤户访问数据受阻。对于互联⽹公 司&#xff0c;尤其是购物⽹站⽽⾔&#xff0c;这种情况造成的损失是⽆法估量的。因此&#xff0c;对数据库进⾏“备份” 也是必不可少的操作。当主要的数据库死…

MediaStream使用webRtc多窗口传递

最近在做音视频通话&#xff0c;有个需求是把当前会话弄到另一个窗口单独展示&#xff0c;但是会话是属于主窗口的&#xff0c;多窗口通信目前不能直接传递对象&#xff0c;所以想着使用webRtc在主窗口和兄弟窗口建立连接&#xff0c;把主窗口建立会话得到的MediaStream传递给兄…

Unity之XR Interaction Toolkit如何在VR中实现渐变黑屏效果

前言 做VR的时候,有时会有跳转场景,切换位置,切换环境,切换进度等等需求,此时相机的画面如果不切换个黑屏,总会感觉很突兀。刚好Unity的XR Interaction Toolkit插件在2.5.x版本,出了一个TunnelingVignette的效果,我们今天就来分析一下他是如何使用的,然后我们自己再来…

MAC电脑M1安装OpenCV

最近在学习研究OpenCV&#xff0c;奈何只有mac电脑。安装OpenCV感觉还是挺麻烦的&#xff0c;所以记录一下&#xff0c;难免以后会忘记。 安装OpenCV我参考的帖子 https://www.bilibili.com/read/cv23613225/ 一、首先安装Anaconda 目前已安装不做赘述 二、启动命令窗口 方…

ArcGIS无法链接在线地图或错误: 代理服务器从远程服务器收到了错误地址(验证服务器是否正在运行)。

这几天我们分享了&#xff01; 谷歌卫星影像图归来&#xff01;ArcGIS直连&#xff01;快来获取_谷歌影像lyr-CSDN博客文章浏览阅读666次&#xff0c;点赞11次&#xff0c;收藏9次。大概。_谷歌影像lyrhttps://blog.csdn.net/kinghxj/article/details/137521877一套图源搞定&a…

【办公类-22-04】20240418 UIBOT模拟上传每天两篇,获取流量券,并删除内容

背景需求&#xff1a; 前文制作了用UIBOT获取CSCN的3天、5天、7天、12天奖励流量券&#xff0c; 【办公类-22-03】20240417 UIBOT模拟上传获取流量券&#xff0c;并删除内容-CSDN博客文章浏览阅读253次&#xff0c;点赞6次&#xff0c;收藏3次。【办公类-22-03】20240417 UIB…

详解运算符重载,赋值运算符重载,++运算符重载

目录 前言 运算符重载 概念 目的 写法 调用 注意事项 详解注意事项 运算符重载成全局性的弊端 类中隐含的this指针 赋值运算符重载 赋值运算符重载格式 注意点 明晰赋值运算符重载函数的调用 连续赋值 传引用与传值返回 默认赋值运算符重载 前置和后置重载 前…