基于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回归的使…

navicat 3730错误

Navicat 3730 错误通常是由于在执行 SQL 语句时出现了语法错误或者其他问题导致的。具体来说&#xff0c;这个错误通常出现在 Navicat 尝试解析 SQL 语句时发现无法识别的语法或结构错误。 解决步骤 检查 SQL 语句的语法&#xff1a; 确保 SQL 语句语法正确无误。逐条执行 SQL…

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

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

浅谈C++的future

std::future 是 C 标准库中的一个模板类&#xff0c;提供了一种机制来管理和获取异步任务的结果。它常与异步操作相关&#xff0c;允许你在不同线程中执行任务&#xff0c;并在将来&#xff08;即“未来”&#xff09;某个时刻获取这些任务的结果。std::future 通常和 std::asy…

如何处理mysql主从延迟

处理 MySQL 主从延迟的问题&#xff0c;可以考虑以下几个方面&#xff1a; 监控延迟&#xff1a; 使用 SHOW SLAVE STATUS 命令查看从库的状态&#xff0c;重点关注 Seconds_Behind_Master 字段&#xff0c;这个值表示从库落后主库的秒数。 优化 SQL 查询&#xff1a; 检查并优…

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

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

c++应用网络编程之十二Linux下的epoll模式分析

一、epoll的原理 在上一篇文章基本明白了epoll的入门知识&#xff0c;本篇开始分析一下其内在的原理&#xff0c;让大家对epoll的运行机制有一个真正的了解。其实分析epoll的原理就必须先说明一下epoll在整个网络通信过程中的位置或者说环节&#xff0c;这样才能从整体上对其有…

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

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

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

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

【rCore OS 开源操作系统】Rust 类型转换

读了一些参考资料&#xff0c;可以知道有这么些个转化方式&#xff1a; 知识点 在 Rust 中&#xff0c;提供了多种方式进行类型转换。以下是总结的主要类型转换方式&#xff1a; 1. 类型强转 (as) 这是最简单的类型转换方式&#xff0c;使用 as 关键字来进行显式的类型转换…

Linux-网络命令

Ping 命令 $ ping www.qq.com$ ping -c 5 www.qq.com netstat netstat 是一个用来查看网络状态的重要工具。 语法&#xff1a;netstat【选项】 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#xff0c;能显示数字的全部转化成数字l 仅列出有在 Li…

uniapp做的app实现首页左滑退出应用

正常来说使用onBackPress方法就可以了 onBackPress() {uni.showModal({title: 提示,content: 您确定要退出应用吗&#xff1f;,success: function (res) {if (res.confirm) {plus.runtime.quit();} }}); },但是因为uniapp里面引用了uni-simple-router插件&#xff0c;导致首页…

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 插件,旨在帮助研究人员和从业者进行高级研…

WPF中Grid、StackPanel、Canvas、WrapPanel的区别

WPF 中的 Grid、StackPanel、Canvas 和 WrapPanel 都是布局控件&#xff0c;用于在用户界面中组织和排列元素&#xff0c;但它们各自有不同的布局行为和用途。以下是它们的主要区别&#xff1a; Grid&#xff1a; Grid 是最灵活的布局控件&#xff0c;类似于 HTML 中的表格&…

Android——FileProvider

概述 继承于ContentProvider&#xff0c;对第三方应用暴露文件&#xff0c;并授予文件读写操作的权限 <!--兼容Android7.0&#xff0c;把访问文件的Uri方式改为FileProvider--><!--android:grantUriPermissions 必须设置为true --><providerandroid:name"…

LeetCode题练习与总结:摆动排序 Ⅱ--324

一、题目描述 给你一个整数数组 nums&#xff0c;将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]... 的顺序。 你可以假设所有输入数组都可以得到满足题目要求的结果。 示例 1&#xff1a; 输入&#xff1a;nums [1,5,1,1,6,4] 输出&#xff1a;[1,6,1,5,…

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

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

TensorRT推理端到端

TensorRT推理端到端 1.参考链接2.宿主机上安装CUDA 12.4.13.安装nvidia-container-toolkit4.创建ghcr.io/intel/llvm/ubuntu2204_base容器5.容器内安装CUDA 12.4.1 + TensorRT10.1.06.安装依赖7.准备resnet50模型8.准备bert模型9.准备yolov5m模型10.编译TensorRT推理程序11.onn…