基于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.rhkb.cn/news/452045.html

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

相关文章

Spring Boot视频网站:安全与可扩展性设计

4 系统设计 4.1系统概要设计 视频网站系统并没有使用C/S结构&#xff0c;而是基于网络浏览器的方式去访问服务器&#xff0c;进而获取需要的数据信息&#xff0c;这种依靠浏览器进行数据访问的模式就是现在用得比较广泛的适用于广域网并且没有网速限制要求的B/S结构&#xff0c…

SpringDataRedis快速入门

SpringDataRedis 什么是SpringDataRedis SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做SpringDataRedis SpringDataRedis中提供了RedsiTemplate工具类,其中封装了各种对Redis的操作。并且将不同数据类型的操作API封装到了不同的类…

Atlas800昇腾服务器(型号:3000)—YOLO全系列NPU推理【检测】(五)

服务器配置如下&#xff1a; CPU/NPU&#xff1a;鲲鹏 CPU&#xff08;ARM64&#xff09;A300I pro推理卡 系统&#xff1a;Kylin V10 SP1【下载链接】【安装链接】 驱动与固件版本版本&#xff1a; Ascend-hdk-310p-npu-driver_23.0.1_linux-aarch64.run【下载链接】 Ascend-…

YOLOv11模型改进-注意力机制-引入自适应稀疏自注意力ASSA

随着目标检测领域的快速发展&#xff0c;YOLO系列模型凭借其端到端、高效的检测性能逐渐成为工业界和学术界的标杆。然而&#xff0c;如何进一步优化YOLOv11的特征提取能力&#xff0c;减少冗余信息并提升模型对复杂场景的适应性&#xff0c;仍是一个值得深入探讨的问题。为此&…

Atlas800昇腾服务器(型号:3000)—驱动与固件安装(一)

服务器配置如下&#xff1a; CPU/NPU&#xff1a;鲲鹏 CPU&#xff08;ARM64&#xff09;A300I pro推理卡 系统&#xff1a;Kylin V10 SP1【下载链接】【安装链接】 驱动与固件版本版本&#xff1a; Ascend-hdk-310p-npu-driver_23.0.1_linux-aarch64.run【下载链接】 Ascend-…

scrapy 爬虫学习之【中医药材】爬虫

本项目纯学习使用。 1 scrapy 代码 爬取逻辑非常简单&#xff0c;根据url来处理翻页&#xff0c;然后获取到详情页面的链接&#xff0c;再去爬取详情页面的内容即可&#xff0c;最终数据落地到excel中。 经测试&#xff0c;总计获取 11299条中医药材数据。 import pandas as…

特斯拉Robotaxi发布会2024:自动驾驶未来的开端

引言 2024年10月&#xff0c;特斯拉在洛杉矶举行了一场引发全球科技界高度关注的发布会&#xff0c;主题为“We Robot”。这场发布会展示了特斯拉的最新自动驾驶技术&#xff0c;包括无人驾驶出租车Cybercab和无人驾驶厢式货车Robovan&#xff0c;并且还展示了人形机器人Optim…

Java项目-基于springboot框架的社区疫情防控平台系统项目实战(附源码+文档)

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 开发运行环境 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/…

精选的四款强大视频压缩工具的整理:

大家好&#xff01;今天我来跟大家分享一下我使用过的几款视频压缩软件的体验感受&#xff0c;以及它们各自的好用之处&#xff1b;在这个信息爆炸的时代&#xff0c;视频文件越来越大&#xff0c;如何快速有效地压缩视频&#xff0c;同时还能保持较好的画质&#xff0c;是很多…

大模型~合集14

我自己的原文哦~ https://blog.51cto.com/whaosoft/12286799 # Attention as an RNN Bengio等人新作&#xff1a;注意力可被视为RNN&#xff0c;新模型媲美Transformer&#xff0c;但超级省内 , 既能像 Transformer 一样并行训练&#xff0c;推理时内存需求又不随 token 数线性…

基于DNA算法的遥感图像加解密matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 通过DNA算法对遥感图像进行加密和解密&#xff0c;分析加解密处理后图像的直方图&#xff0c;相关性&#xff0c;熵&#xff0c;解密后图像质量等。 2.测试软件版…

MongoDB安装配置及配置和启动服务

MongoDB 安装配置 附&#xff1a;MongoDB官网下载地址&#xff1a; https://www.mongodb.com/download-center/community 注&#xff1a; 官网可以下载最新版的MongoDB安装包&#xff0c;有MSI安装版和ZIP安装版。我们课堂上使用4.4.4的ZIP安装版。安装版参考博客&#xff1…

jmeter中对于有中文内容的csv文件怎么保存

jmeter的功能很强大&#xff0c;但是细节处没把握好就得不到预期的结果。今天来讲讲有中文内容的csv文件的参数化使用中需要注意的事项。 对于有中文内容&#xff0c;涉及到编码格式&#xff0c;为了让jmeter能正确地读取csv文件中的中文&#xff0c;需要把文件转码为UTF-8BOM…

【服务器部署】Docker部署小程序

一、下载Docker 安装之前&#xff0c;一定查看是否安装docker&#xff0c;如果有&#xff0c;卸载老版本 我是虚拟机装的Centos7&#xff0c;linux 3.10 内核&#xff0c;docker官方说至少3.8以上&#xff0c;建议3.10以上&#xff08;ubuntu下要linux内核3.8以上&#xff0c…

(JAVA)贪心算法、加权有向图与求得最短路径的基本论述与实现

1. 贪心算法 1.1 贪心算法的概述&#xff1a; 贪心算法是一种对某些求最优解问题的更简单、更迅速的设计技术。 贪心算法的特点是一步一步地进行&#xff0c;常以当前情况为基础根据某个优化测度作最优选择&#xff0c;而不考虑各种可能的整体情况&#xff0c;省去了为找最优…

LeetCode-3192 使二进制数组全部等于1的最少操作次数Ⅱ

今天的每日一题就是昨天的延伸&#xff0c;预判成功。 LeetCode-3191 使二进制数组全部等于1的最少操作次数-CSDN博客文章浏览阅读115次。如果数组第一个元素就是0&#xff0c;那么第一个元素是肯定要翻转的&#xff0c;而我们只有从索引0的位置开始翻转才可以翻转到第一个元素…

生成模型初认识

生成模型初认识 参考学习资料&#xff1a;李宏毅-机器学习 以下为课程过程中的简易笔记 生成模型 为什么要用生成模型&#xff1f;——创造力&#xff1a;同一个输入&#xff0c;产生不同的输出&#xff08;distribution&#xff09;&#xff0c;有一定概率发生某种随机事件…

【天池比赛】【零基础入门金融风控 Task2赛题理解】【2.3.6】

【天池比赛】【零基础入门金融风控 Task2赛题理解】【2.3.1-2.3.5】 2.3.6 变量分布可视化 2.3.6.1 单一变量分布可视化 对于 pandas.core.series.Series 类型的变量&#xff1a; index&#xff1a;含义&#xff1a;它表示 Series 对象的索引&#xff0c;也就是每个数据点对…

MySQL-15.DQL-排序查询

一.DQL-排序查询 -- 排序查询 -- 1.根据入职时间&#xff0c;对员工进行升序排序 select * from tb_emp order by entrydate asc ;-- 2.根据入职时间&#xff0c;对员工进行降序排序 select * from tb_emp order by entrydate desc ;-- 3.根据 入职时间 对公司员工进行 升序排序…

人工神经网络(Artificial Neural Networks,简称ANNs)-激活函数-5

建议在阅读本文之前先了解神经网络。 在构建神经网络的过程中,您需要做出的选择之一是在隐藏层和网络的输出层使用什么是激活函数。本文讨论了神经网络中的激活函数。 目录 ​​​​​​​ 什么是激活函数?神经网络的元素为什么我们需要非线性激活函数?激活函数的变体 …