【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;
		}
		
  }

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

轻松上手Flowise:本地部署与最佳实践

&#x1f9d9;‍♂️ 诸位好&#xff0c;吾乃斜杠君&#xff0c;编程界之翘楚&#xff0c;代码之大师。算法如流水&#xff0c;逻辑如棋局。 &#x1f4dc; 吾之笔记&#xff0c;内含诸般技术之秘诀。吾欲以此笔记&#xff0c;传授编程之道&#xff0c;助汝解技术难题。 &#…

Sigmoid激活函数

Sigmoid函数是一种常用的激活函数&#xff0c;其数学公式为&#xff1a; σ ( x ) 1 1 e − x \sigma(x) \frac{1}{1 e^{-x}} σ(x)1e−x1​ 其中&#xff0c; x x x 是函数的输入&#xff0c; σ ( x ) \sigma(x) σ(x) 是函数的输出。 sigmoid函数在神经网络中常被用于…

32.5k star!发现一个新的 API 调试工具!postman 要被替换了【文末有项目源码】

在软件开发过程中&#xff0c;API&#xff08;应用程序接口&#xff09;扮演着至关重要的角色。为了确保 API 的可靠性和性能&#xff0c;开发人员需要一种高效的方式来测试和调试它们。这方面的工具&#xff0c;大家经常用到的应该就是 postman 了。不过&#xff0c;今天想要给…

算法与数学

学过数据结构的对这个应该都不会感到陌生&#xff0c;但是乍一看原来是数学&#xff0c;然而事实就是如此。二分法的数学源头就是这个。 还有前缀和的 我们这里所说的前缀和其实就是我们在高中学的数列中的Sn(前n项和)&#xff0c;只是我们这里需要将S1 , S2 , S3 , S4 …… S…

用户与组管理

一、用户分类 管理员用户&#xff1a;root 程序用户 普通用户 二、用户列表文件 查看用户列表文件 cat /etc/passwd 注&#xff1a;etc/passwd内容总共分为7个区域&#xff0c;每个区域用“&#xff1a;”分隔开 第一列&#xff1a;用户名。区分大小写&#xff1b;用户名可以使…

多轴机械臂/正逆解/轨迹规划/机器人运动学/Matlab/DH法 学习记录03——机械臂运动学逆解

系列文章目录 本科毕设正在做多轴机械臂相关的内容&#xff0c;这里是一个学习机械臂运动学课程的相关记录。 如有任何问题&#xff0c;可发邮件至layraliufoxmail.com问询。 1. 数学基础 2. 机械臂几何法与DH表示法 3. 机械臂运动学逆解 文章目录 系列文章目录一、引言1.手臂…

Impala Daemon无法启动问题记录(UNIX 域套接字路径不存在)

前言&#xff1a;集群扩节点&#xff0c;新加节点的Impala Daemon起不起来了 去后台查看报错日志 上午11点19:08.002分 ERROR cc:288 Invalid short-circuit reads configuration:Impala cannot read or execute the parent directory of dfs.domain.socket.path 上午11点19:…

【SAP NWDI】服务开启:SLD,CM,CMS(二)

一、启用System Landscape Directory 二、启用 NWDI using CMS

pycharm 更换Eclipse 的按键模式 keymap

流程 整体来说比较简单&#xff0c;其实只要下载一个eclipse keymap插件就可以完成 首先 ctrl alt s 打开设置页面&#xff0c;找到 plugin 安装完成后还是在 settings 下切换到 keymap即可以看到eclipse 的按键设置出现了&#xff0c;应用后ok 即可完成 再去试试&#x…

考研数学|「基础」和「强化」阶段分别怎么做?

从目前考研数学的趋势来看&#xff0c;更加注重数学基础的理解和计算量。也就是基础知识和计算&#xff0c;如何锻炼这两种能力就显得尤为重要。希望我的复习经验可以给到读者一些启发。 数学规划 从备考过程来看&#xff0c;数学的复习可以分为三个阶段&#xff1a;1、基础阶…

深入理解GCC/G++在CentOS上的应用

文章目录 深入理解GCC/G在CentOS上的应用编译C和C源文件C语言编译C语言编译 编译过程的详解预处理编译汇编链接 链接动态库和静态库静态库和动态库安装静态库 结论 深入理解GCC/G在CentOS上的应用 在前文的基础上&#xff0c;我们已经了解了CentOS的基本特性和如何在其上安装及…

每日一VUE——响应性原理(重要的一批!!!)

文章目录 响应性原理setup副作用函数Proxy响应式数据 响应式APIreactive和reftoRef和toRefscomputedwatchprovide和inject 响应性原理 响应性本质是监听数据变化&#xff0c;并做出相应的处理 setup setup函数就是生命周期函数&#xff0c;它替代了beforeCreate和created函数…

C语言—深度剖析函数指针,函数指针数组

我们先来看一段代码 #include <stdio.h> void test() {printf("hehe\n"); } int main() {printf("%p\n", test);printf("%p\n", &test);return 0; }输出的是两个地址&#xff0c;这两个地址是 test 函数的地址。 那我们的函数的地址…

WebGl/Three 粒子系统 人物破碎及还原运动

粒子 首先&#xff0c;加载模型&#xff0c;这是万千粒子的前身&#xff0c;模型对象由很多面构成&#xff0c;这些面又是由各个点构成的&#xff0c;所以可以将模型的几何体对象geometry赋给粒子对象&#xff0c;粒子物体用Points方式渲染 bloader.load("obj/female02/Fe…

多线程同步:使用 std::mutex 和 std::unique_lock 保护共享资源

在当今的软件开发中&#xff0c;多线程编程是一项至关重要的技术&#xff0c;它允许程序同时执行多个任务&#xff0c;从而提高应用程序的效率和响应速度。然而&#xff0c;多线程环境也带来了数据安全和一致性的挑战。在多个线程需要访问和修改同一数据资源的情况下&#xff0…

STM32学习和实践笔记(14):按键控制实验

消除抖动有软件和硬件两种方法 软件方法就是在首次检测到低电平时加延时&#xff0c;通常延时5-10ms&#xff0c;让抖动先过去&#xff0c;然后再来检测是否仍为低电平&#xff0c;如果仍然是&#xff0c;说明确实按下。 硬件方法就是加RC滤波电路&#xff0c;硬件方法会增加…

亚马逊---设计弹性架构

一个好的架构师可以做到以下几点&#xff1a; 根据需求设计事件驱动型架构、微服务架构和/或多层架构 确定架构设计中使用的组件的扩展策略 根据要求确定实现松耦合所需的AWS服务 确定何时使用容器 确定何时使用无服务器技术和模式 根据要求推荐合适的计算、存储、联网和数据库…

HarmonyOS NEXT 网格元素交换案例

网格元素交换案例 介绍 直接进行交换和删除元素会给用户带来不好的体验效果&#xff0c;因此需要在此过程中注入一些特色的动画来提升体验效果&#xff0c;本案例通过Grid组件、attributeModifier、以 及animateTo函数实现了拖拽动画和删除动画。 效果图预览 使用说明&#…

【网络】Burpsuite学习笔记

文章目录 1.介绍1.1 正常客户端与服务端通信&BurpSuite代理后1.2 下载激活参考地址1.3 代理设置1.4 Proxy SwitchyOmega 使用1.4.1 新建情景模式1.4.2 设置代理1.4.2 应用选项 1.5 FoxyProxy 使用1.6 安装证书1.6.1 方式一1.6.2 方式二1.6.3 浏览器安装证书1.6.4 或者直接双…

基于改进遗传算法的配电网故障定位(matlab代码)

1 主要内容 该程序复现文章《基于改进遗传算法的配电网故障定位》&#xff0c;将改进的遗传算法应用于配电网故障定位中, 并引入分级处理思想, 利用配电网呈辐射状的特点, 首先把整个配电网划分为主干支路和若干独立区域, 再利用该算法分别对各独立区域进行故障定位, 然后进行…