基于STM32F407VGT6芯片----跑马灯实验

一、在STM32F407VGT6芯片中配置GPIO环境

  • 对于一个跑马灯实验,首先,要了解的就是,芯片是如何构造出来的,设计GPIO引脚:根据原理图, PC4,PC5,PC6,PC7 为 LED 输出控制管脚,PE0 为蜂鸣器输出控制管脚, 配置为 GPIO_Output 输出模式, PA0,PE2,PE3,PE4 为按键输入管脚,配置为 GPIO_Input 输 入模式。

  • 外射配置:

                        以 LED1 配置为例,点击 PC4,选择模式为 GPIO_Output 模式,LED1 的负极接 PC4 引 脚,所以,PC4 为高电平时 LED 熄灭,这里 PC4 的 output level 选择高电平,即上电复位 后 PC4 位高电平,默认为熄灭,把 User Label 标记为 LED1,同理 PC5、PA6、PA7 做同样 的选择和配置。 蜂鸣器引脚为 PE0,根据原理图高电平时蜂鸣器有电,低电平时蜂鸣器截止,因此 output level 配置为 low 低电平,上电保持截止,user label 标记为 BUZ。

  • 工程配置:

                          设置一个文件夹,生成代码。

二、在keil中配置代码的生成环境

  • 然后,就来到了Keil配置环境中:

设置跑马灯的代码,设置四个文件:<led.h>,<led.c>,<key.h>,<key.c>

代码实现为:

  • 接下来在 led.c 文件中添加 LED1-LED4 的管脚的数组变量和三个函数代码:

//接下来在 led.c 文件中添加 LED1-LED4 的管脚的数组变量和三个函数代码GPIO_TypeDef* GPIO_PORT[] = {LED1_GPIO_Port, LED2_GPIO_Port, LED3_GPIO_Port, LED4_GPIO_Port}; const uint16_t GPIO_PIN[] = {LED1_Pin, LED2_Pin, LED3_Pin, LED4_Pin}; 
uint16_t buzDs = 0; 
void LED_On(Led_TypeDef Led) { HAL_GPIO_WritePin(GPIO_PORT[Led], GPIO_PIN[Led], 
GPIO_PIN_RESET); } void LED_Off(Led_TypeDef Led) { HAL_GPIO_WritePin(GPIO_PORT[Led], GPIO_PIN[Led], 
GPIO_PIN_SET); } void LED_Toggle(Led_TypeDef Led) { HAL_GPIO_TogglePin(GPIO_PORT[Led], GPIO_PIN[Led]); }
void BUZ_On(void) { HAL_GPIO_WritePin(BUZ_GPIO_Port, BUZ_Pin, GPIO_PIN_SET); } void BUZ_Off(void) { HAL_GPIO_WritePin(BUZ_GPIO_Port, BUZ_Pin, GPIO_PIN_RESET); } 
void BUZ_Prc(void) { if(buzDs) { BUZ_On(); buzDs--; } else BUZ_Off(); }  
  • 在 led.h 前面添加 Led_TypeDef 枚举类型。声明刚才添加的 2 个函数、会在 mian.c 中调用:在 key.c 中编写按键扫描和按键处理的代码

//在 led.h 前面添加 Led_TypeDef 枚举类型。声明刚才添加的 2 个函数、会在 mian.c 中调用 
#ifndef __LED_H__ 
#define __LED_H__ 
#include "main.h" 
/************************************************************* 用户自定义数据类型 
**************************************************************/ 
typedef enum { LED1 = 0, LED2 = 1, LED3 = 2, LED4 = 3, LED_NO = 4 }Led_TypeDef; extern uint16_t Select_DelayT ; extern uint16_t Select_Dir ; 
/******************************* 
本模块提供给外部调用的函数 
*********************************/ 
void LED_Prc(void); 
void BUZ_Prc(void); 
#endif 
  • 在 key.h 中,定义几个宏定义:

//在 key.h 中,定义几个宏定义
#ifndef __KEY_H__ 定义指示灯序号的数据类型,使用枚举类型 
实现,包括 LED1——LED4 四个枚举常量,用来 
表示四个 LED 灯 避免头文件的重复包含 提供给外部使用的函数声明 
蜂鸣器控制函数 
存放的都是 LED 灯 
控制引脚  
#define __KEY_H__ 
#include "main.h" typedef enum { KEY1 = 0, KEY2 = 1, KEY3 = 2, KEY4 = 3 }Key_TypeDef; 
extern uint16_t buzDs ;#define READ_KEY1 (HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin)) 
#define READ_KEY2 (!HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin)) 
#define READ_KEY3 (!HAL_GPIO_ReadPin(KEY3_GPIO_Port, KEY3_Pin)) 
#define READ_KEY4 (!HAL_GPIO_ReadPin(KEY4_GPIO_Port, KEY4_Pin)) 
void KEY_Prc(void); 
#endif 
  • 在 key.c 中编写按键扫描和按键处理的代码

//在 key.c 中编写按键扫描和按键处理的代码 
uint8_t keyScan(void) { static uint8_t pressed =0; static uint8_t keyCnt = 0; uint8_t key_num = 0; if(( READ_KEY1 || READ_KEY2 || READ_KEY3 || READ_KEY4) && (pressed ==1)) { if(keyCnt < 5) keyCnt++; else { if(READ_KEY1) { pressed =0; key_num = 1; } else if(READ_KEY2) 
{ pressed =0; key_num = 2; } else if(READ_KEY3) { pressed =0; key_num = 3; } else if(READ_KEY4) { pressed =0; key_num = 4; } } } if( !READ_KEY1 && !READ_KEY2 && !READ_KEY3 && !READ_KEY4 &&(pressed == 0)) { pressed =1; keyCnt = 0; } return key_num; } 
void KEY_Prc(void) { uint8_t key_val = 0; key_val = keyScan(); if(key_val != 0) buzDs = 10; switch(key_val) { case 1: Select_Dir ^= 1; break; case 2:
Select_DelayT = 10; break; case 3: Select_DelayT = 50; break; 
case 4: Select_DelayT = 100; default: break; } } 
  • 值得注意的是:必须在.c文件中加入对应的.h文件。

  • 最后,在<main.c>中加入

uint32_t startTimeTick = 0; uint32_t endTimeTick = 0;
  • 至此,在keil中的代码文件都相继完成了。

三、在Proteus中配置模拟环境

  • 接下来,就需要配置模拟环境了。这里就需要用到:

  • 其对应的图片是:

  • 最后就能跑起来了。纵观整个过程,其最难的部分就是keil写代码的部分了。

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

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

相关文章

机器学习面试笔试知识点-线性回归、逻辑回归(Logistics Regression)和支持向量机(SVM)

机器学习面试笔试知识点-线性回归、逻辑回归Logistics Regression和支持向量机SVM 一、线性回归1.线性回归的假设函数2.线性回归的损失函数(Loss Function)两者区别3.简述岭回归与Lasso回归以及使用场景4.什么场景下用L1、L2正则化5.什么是ElasticNet回归6.ElasticNet回归的使…

嵌套div导致子区域margin失效问题解决

嵌套div导致子区域margin失效问题解决 现象原因解决方法 现象 <div class"prev"></div> <div class"parent"><div class"child"></div><div class"child"></div> </div> <div cl…

cisco网络安全技术第3章测试及考试

测试 使用本地数据库保护设备访问&#xff08;通过使用 AAA 中央服务器来解决&#xff09;有什么缺点&#xff1f; 试题 1选择一项&#xff1a; 必须在每个设备上本地配置用户帐户&#xff0c;是一种不可扩展的身份验证解决方案。 请参见图示。AAA 状态消息的哪一部分可帮助…

低代码可视化-uniapp海报可视化设计-代码生成

在uni-app中&#xff0c;海报生成器通常是通过集成特定的插件或组件来实现的&#xff0c;这些插件或组件提供了生成海报所需的功能和灵活性。我们采用了lime-painter海报组件。lime-painter是一款canvas海报组件&#xff0c;可以更轻松地生成海报。它支持通过JSON及Template的方…

企业网站设计之网站版式设计

一个成功的企业网站不仅仅需要强大的技术支持&#xff0c;更需要合理而吸引人的版式设计。版式设计在网站建设中扮演着关键角色&#xff0c;直接影响用户体验和品牌形象。本文将探讨主题企业网站版式设计的关键要素。 一、清晰的信息结构&#xff1a; 一个主题企业网站应该具有…

STM32学习笔记---独立看门狗

目录 一、什么是独立看门狗 1、什么是看门狗 2、看门狗的原理 3、看门狗的作用 4、看门狗的分类 二、如何配置独立看门狗 1、独立看门狗框图 2、独立看门狗的相关寄存器 2.1 关键字寄存器 2.2 分频寄存器 2.3 重载值寄存器 2.4 状态寄存器 3、程序设计 4、独立看门…

零基础入门人工智能,如何利用AI工具提升你的学习效率?

在这个信息爆炸的时代&#xff0c;人工智能&#xff08;AI&#xff09;不仅是技术行业的热词&#xff0c;更是我们日常生活中不可或缺的部分。你是否也想过&#xff0c;如何更有效地学习和利用这些强大的AI工具来提升自己的学习效率&#xff1f;今天&#xff0c;我们将介绍六款…

【WRF工具】QGis插件GIS4WRF:根据嵌套网格生成namelist.wps文件

【WRF工具】QGis插件GIS4WRF:根据嵌套网格生成namelist.wps文件 准备:WRF嵌套网格QGis根据嵌套网格生成namelist.wps文件检查:根据namelist.wps绘制模拟区域ArcGIS Pro中绘制嵌套网络投影变换参考GIS4WRF 是一个免费且开源的 QGIS 插件,旨在帮助研究人员和从业者进行高级研…

【Hive】8-Hive性能优化及Hive3新特性

Hive性能优化及Hive3新特性 Hive表设计优化 Hive查询基本原理 Hive的设计思想是通过元数据解析描述将HDFS上的文件映射成表 基本的查询原理是当用户通过HQL语句对Hive中的表进行复杂数据处理和计算时&#xff0c;默认将其转换为分布式计算 MapReduce程序对HDFS中的数据进行…

玫瑰花HTML源码

HTML源码 <pre id"tiresult" style"font-size: 9px; background-color: #000000; font-weight: bold; padding: 4px 5px; --fs: 9px;"><b style"color:#000000">0010000100000111101110110111100010000100000100001010111111100110…

buuctf[湖南省赛2019]Findme1

解压得5个图片&#xff0c;其中图片1&#xff0c;高度不正常&#xff0c;使用下面脚本破解真实高度和宽度 import os import binascii import structcrcbp open("1.png", "rb").read() for i in range(1024):for j in range(1024):data crcbp[12:16] st…

维修数据屏:重塑热力公司运维管理新格局

在热力公司的运维管理中&#xff0c;高效的报修和维修流程是确保系统稳定运行的关键。随着科技的发展&#xff0c;维修数据屏的出现为热力公司的运维工作带来了重大变革。 一、传统热力运维面临的挑战 过去&#xff0c;热力公司在报修和维修方面存在诸多问题&#xff0c;给运维…

SpringCloud学习:Seata总结与回顾

SpringCloud学习&#xff1a;Seata总结与回顾 文章目录 SpringCloud学习&#xff1a;Seata总结与回顾1. Seata实战&#xff1a;测试2. Seate原理总结和面试题3. Seata总结与回顾4. 易混点 1. Seata实战&#xff1a;测试 测试问题 未启用分布式事务 若不使用分布式事务&#xf…

Greenhills学习总结

学习背景&#xff1a;近期参与xx项目过程中&#xff0c;遇到较多的关于代码集成编译的知识盲区&#xff0c;因此需要进行相关知识的学习和扫盲。 参考资料&#xff1a;GreenHills2017.7编译手册:本手册是GreenHills 2017.7.14版编译器的软件使用手册。该手册详细介绍了GreenHi…

Docker consul注册中心

一、consul 1.1、什么是服务注册与发现 服务注册与发现是微服务架构中不可或缺的重要组件。 起初服务都是单节点的&#xff0c;不保障高可用性&#xff0c;也不考虑服务的压力承载&#xff0c;服务之间调用单纯的通过接口访问。 直到后来出现了多个节点的分布式架构&#x…

React(五) 受控组件和非受控组件; 获取表单元素的值。高阶组件(重点),Portals; Fragment组件;严格模式StrictMode

文章目录 一、受控组件1. 什么是受控组件2. 收集input框内容3. 收集checkBox的值4. 下拉框select总结 二、非受控组件三、高阶组件1. 高阶组件的概念 (回顾高阶函数)2. 高阶组件应用&#xff1a;注入props(1) 高阶组件给---函数式组件注入props(2) 高阶组件给---类组件注入prop…

前100+大型语言模型(LLMs)面试问题和路线图

介绍 获取前 100 个精选的 LLM 面试问题&#xff0c;了解如何准备生成式 AI 或 LLM 面试准备和大型语言模型 &#xff08;LLM&#xff09; 面试准备的学习路径。 This article explains learning path for large language models (LLMs) interview preparation. You will fin…

陪诊小程序之uniapp(从入门到精通)

1.uniapp如何使用vue3编写页面 <template><view class"content"><navbar name"navbar组件"></navbar><image class"logo" src"/static/logo.png"></image><view class"text-area"&…

C++进阶:AVL树实现

目录 一.AVL的概念 二.AVL的实现 2.1AVL树的结构 2.2AVL树的插入 2.2.1AVL树插入一个值的大概过程 2.2.2平衡因子更新 2.2.3插入节点及更新平衡因子的实现 2.3旋转 2.3.1旋转的原则 2.3.2右单旋 2.3.3右单旋的代码实现 2.3.4左单旋 2.3.5左单旋的代码实现 2.3.6…

vue综合指南(二)

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Vue篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来Vuet篇专栏内容:vue综合指南(二) 目录 21、介绍虚拟DOM 22、vue生命周期的理解 23、vue父组件向子组件传递数据…