[STM32-1.点灯大师上线】
学习了江协科技的前4课,除了打开套件的第一秒是开心的,后面的时间都是在骂娘。因为51的基础已经几乎忘干净,c语言已经还给谭浩强,模电数电还有点底子,硬着头皮上吧。
本篇主要是讲述学习点灯的过程和疑惑解释。
1.工程文件的建立
首先是在keil中建立一个新的工程项目,一个完整的工程项目除了基础部分还包含“Library"、”Start"、“User"这三个部分,这三个文件夹是需要自己新建的。其中,Library是STM32的标准库文件的存放路径,初始的例子中,所有的官方库文件都会一股脑的复制进来(因为这会儿水平还太低,不知道如何精准地挑选手头项目需要的库文件,因此力大砖飞),在这个文件中有.c文件也有.h文件,前者是C源代码文件,具体用来实现程序的各种功能;后者是头文件,通常含有与.c文件相对应的函数声明、宏定义、类型定义、外部变量声明等。它的功能是高速编译器某个功能是存在的,但不提供具体细节。
例子: 假如你有一个用于管理LED灯的.c文件,比如led_control.c,它实现了点亮和熄灭LED灯的函数。你同时会有一个对应的led_control.h头文件,它声明了那些可以被其他.c文件调用的函数,比如turn_on_led()和turn_off_led()。这样,其他需要控制LED灯的.c文件只需包含led_control.h头文件,就可以调用这些函数,而无需知道它们的具体实现。
因此,.h文件要在段首声明,以便随时调用.c文件中编写的具体功能。
2.主函数的编写与理解

从教程给出的例子可以看出,这东西乍一接触让人非常想放弃,很头晕。接下来逐条解释上述代码。
2.1RCC_APB2PeriphClockCmd函数
首先是RCC_APB2PeriphClockCmd,是一个在STM32微控制器固件库中定义的函数,用于控制高速APB2总线上外设的时钟。RCC即Reset and Clock Control(时钟的控制与重置),是STM32的一个模块,用于控制系统的复位和时钟设置。它的完全形式如下:
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
//RCC_APB2Periph 参数是指定哪个APB2外设的时钟将被使能或者禁用。
//NewState 参数是一个枚举类型FunctionalState,它可以是ENABLE或DISABLE,用于指定时钟是否应该被使能。
调用的时候形式为:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
//RCC_APB2Periph_GPIOC:告诉库函数,我们想要操作的是GPIOC端口的时钟。
//ENABLE:一个宏,代表我们想要使能时钟。
因为我们要使用GPIO端口来点亮一个LED,所以要先使能GPIO的时钟。(我也试了不使能时钟,LED点不亮),现阶段先默认,不管用得到和用不到,都要使能时钟。GPIO端口位于APB2的范围内,因此这里使能的是RCC_APB2Periph,端口与模块的位置见系统结构图,红框部分。

2.2 GPIO_InitTypeDef GPIO_InitStructure
GPIO_InitTypeDef 是在STM32标准固件库中定义的一个结构体类型,它用于初始化GPIO(通用输入/输出)端口的配置。该结构体通常包括端口的模式(如输出模式、输入模式等)、速度、输出类型和上拉/下拉电阻配置等属性。
结构体在很多地方有用到,比如在MATLAB/SIMULINK中用S函数建立系统的仿真模型时,参数太多在程序内填写非常的复杂和困难,因此会使用parameters.m结构体保存模型参数。这里也可以相似的理解,粗暴且不严谨的理解为:结构体是为了保存参数。在使用结构体之前要先定义结构体:
GPIO_InitTypeDef GPIO_InitStructure;
//定义了一个名称为GPIO_InitStructure的结构体
注意:并不是结构体的名称只能是”GPIO_InitStructure",可以是你自己取名称。
前面说了,定义结构体主要是为了存参数,要成为一名“点灯大师”需要用到的参数/设置有:
1.GPIO端口的工作模式。有8种模式,端口输出4种,输入4种,点灯需要用GPIO端口输出高/低电平驱动LED,所以只用到了输出模式,可选的有:开漏、推挽、复用开漏、复用推挽。我们这里用不到复用,所以可以选择开漏或者推挽模式。
2.GPIO哪个引脚输出电平。GPIO引脚一共有32个,A区0-15,B区0-15.具体看LED管接在了哪个引脚,GPIO的基本结构见下图:

3. GPIO的输出速率。可选的有2MHZ,10MHZ,50MHZ
上述这3点,是我们定义结构体需要保存的参数/配置。接下来逐个讲解这三个结构体成员的定义:
2.2.1GPIO输出模式定义
本例中我们使用推挽输出的模式,因此定义为
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
结构体成员的定义方法是:结构体名.结构体成员=参数/设置
因此上述定义的意思是,GPIO_InitStructure这个结构体的成员GPIO_Mode(GPIO的输出模式)为GPIO_Mode_Out_PP(PP: PUSH-PULL OUTPUT推拉/推挽),综上,我们选择GPIO端口的工作模式为推挽。
2.2.2GPIO引脚定义
本例中LED接在了GPIOA_0号引脚,因此对应的结构体成员定义为:
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
意思是 GPIO_InitStructure这个结构体的成员GPIO_Pin(引脚)为0号引脚
2.2.3GPIO输出速率定义
本例中GPIO输出速率使用50MHZ,因此相应的结构体成员定义为:
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
2.3初始化
在编写完结构体成员后,调用初始化函数将结构体参数传入。
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_Init(GPIOA, &GPIO_InitStructure); 是一个用于初始化STM32微控制器中某个GPIO端口上一组引脚的函数调用。该函数采用两个参数:第一个参数指定了要初始化的GPIO端口(在此例中为GPIOA),第二个参数是一个指向GPIO_InitTypeDef结构体的指针,该结构体包含了要应用于指定端口上的引脚的配置信息。
2.4循环
在配置完上述参数后,用一个死循环来实现LED的点亮
while(1){GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);}
这里用到的是GPIO的读写函数,严格来说是位写函数,是一条用于STM32微控制器编程的指令,其功能是改变GPIOA端口上第0号引脚的状态。在这个特定的函数调用中,它将该引脚的状态设置为Bit_RESET,在STM32的库中,Bit_RESET通常定义为逻辑低电平,相当于0。
我们的二极管的接法是正极连接3.3V,负极连接GPIOA_0,因此这个引脚输出低电平,二极管导通点亮。
3.利用GPIO点亮流水灯
在成功点亮1个LED之后,程序微调就可以实现流水灯点亮。首先需要调整的是结构体中的引脚定义
int main(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;//这里的引脚定义改成了所有引脚GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);
具体来说是把要工作的引脚定义为GPIO_Pin_All。
然后利用死循环
while(1){GPIO_Write(GPIOA, ~0x0001);//0000 0000 0000 0001Delay_ms(500);GPIO_Write(GPIOA, ~0x0002);//0000 0000 0000 0010Delay_ms(500);GPIO_Write(GPIOA, ~0x0004);//0000 0000 0000 0100Delay_ms(500);GPIO_Write(GPIOA, ~0x0008);//0000 0000 0000 1000Delay_ms(500);GPIO_Write(GPIOA, ~0x0010);//0000 0000 0001 0000Delay_ms(500);GPIO_Write(GPIOA, ~0x0020);//0000 0000 0010 0000Delay_ms(500);GPIO_Write(GPIOA, ~0x0040);//0000 0000 0100 0000Delay_ms(500);GPIO_Write(GPIOA, ~0x0080);//0000 0000 1000 0000Delay_ms(500);}
这样就把8个GPIO的引脚都输出了低电平,中间调用Delay函数,延时500毫秒,就实现了流水灯功能。
相关文章:
[STM32-1.点灯大师上线】
学习了江协科技的前4课,除了打开套件的第一秒是开心的,后面的时间都是在骂娘。因为51的基础已经几乎忘干净,c语言已经还给谭浩强,模电数电还有点底子,硬着头皮上吧。 本篇主要是讲述学习点灯的过程和疑惑解释。 1.工…...
Web测试自动化工具Selenium的使用
Web测试自动化工具Selenium的使用 Selenium是一个Web应用测试的自动化工具,它通过模拟点击实现对Web应用的功能测试。测试时,除了Selenium,还需要对应的浏览器驱动,如在Chrome实现自动点击,则需要chromedriver。 Sel…...
VUE2+THREE.JS 按照行动轨迹移动人物模型并相机视角跟随人物
按照行动轨迹移动人物模型并相机视角跟随人物 1. 初始化加载模型2. 开始移动模型3. 人物模型启动4. 暂停模型移动5. 重置模型位置6. 切换区域动画7. 摄像机追踪模型8. 移动模型位置9.动画执行 人物按照上一篇博客所设定的关键点位置,匀速移动 1. 初始化加载模型 //…...
Hadoop YARN组件
1. 请解释Yarn的基本架构和工作原理。 YARN,也被称为"Yet Another Resource Negotiator",是Apache HadoopYARN,也被称为"Yet Another Resource Negotiator",是Apache Hadoop的一部分,它被设计为一…...
Java架构师技术架构路线
目录 1 概论2 如何规划短中长期的技术架构路线图3 如何规划面向未来的架构4 如何修订路线图执行过程中的偏差5 如何落地路线图-阿里系糙快猛之下的敏捷模式想学习架构师构建流程请跳转:Java架构师系统架构设计 1 概论 首先,规划一个短中长期的技术路线图是非常重要的。短中…...
guacamole docker一键部署脚本
前言 在我学习guacamole的过程中发现全网大致有两种方式安装guacamole的方式: 1. 直接安装(下载java环境/mysql/, 修改配置) 2. docker安装(和直接安装类似,需要下载相关环境,然后做配置) 然…...
蓝桥杯算法心得——想吃冰淇淋和蛋糕(dp)
大家好,我是晴天学长,dp题,怎么设计状态很重要,需要的小伙伴可以关注支持一下哦!后续会继续更新的。💪💪💪 1) .想吃冰淇淋和蛋糕 想吃冰淇淋与蛋糕 输入格式 第一行输入一个整数n。…...
LLM之RAG实战(二):使用LlamaIndex + Metaphor实现知识工作自动化
最先进的大型语言模型(LLM),如ChatGPT、GPT-4、Claude 2,具有令人难以置信的推理能力,可以解锁各种用例——从洞察力提取到问答,再到通用工作流自动化。然而,他们检索上下文相关信息的能力有限。…...
【容器】Docker打包Linux操作系统迁移
0x0 场景 因老服务器操作系统文centos6.5,现要迁移至uos v20 1050a(底层centos8),其中需要迁移的应用组件有: mysql 、tomcat、apachehttpd,因版本跨越太大,导致centos8直接安装无法完全恢复原…...
redis基本数据结构
Redis入门:五大数据类型 文章目录 Redis入门:五大数据类型一.概述二.Redis的基本了解三.Redis五大数据类型1.String (字符串)2.List(列表)3.Set集合(元素唯一不重复)4.Hash集合5.zSet(有序集合) 一.概述 什么是Redis Redis(Remote Dictiona…...
Learning Normal Dynamics in Videos with Meta Prototype Network 论文阅读
文章信息:发表在cvpr2021 原文链接: Learning Normal Dynamics in Videos with Meta Prototype Network 摘要1.介绍2.相关工作3.方法3.1. Dynamic Prototype Unit3.2. 视频异常检测的目标函数3.3. 少样本视频异常检测中的元学习 4.实验5.总结代码复现&a…...
Unity 关于SpriteRenderer 和正交相机缩放
float oldWidth 750f;float oldHeight 1334f;float newWidth Screen.width;float newHeight Screen.height;float oldAspect oldWidth / oldHeight;float newAspect newWidth / newHeight;//水平方向缩放float horizontalCompressionRatio newAspect / oldAspect;//垂直…...
HarmonyOS应用开发者基础认证考试(98分答案)
基于最近大家都在考这个应用开发者基础认证考试,因此出了一期,一样复制word里面搜索做,很快,当然good luck 判断题 Ability是系统调度应用的最小单元,是能够完成一个独立功能的组件。一个应用可以包含一个或多个Ability。 正确(Tr…...
Ubuntu20.04 Kimera Semantic运行记录
Ubuntu20.04 Kimera Semantic 官方bag运行记录 以下基本为官方教程,有部分修改 依赖 sudo apt-get install python3-wstool python3-catkin-tools protobuf-compiler autoconf sudo apt-get install ros-noetic-cmake-modulessudo apt-get install ros-noetic-i…...
服务器RAID系统的常见故障,结合应用场景谈谈常规的维修处理流程
常见的服务器RAID系统故障包括硬盘故障、控制器故障、电源故障、写入错误和热插拔错误。下面结合这些故障的应用场景和常规维修处理流程来详细讨论: 硬盘故障: 应用场景:在服务器RAID系统中,硬盘故障是最常见的问题之一。硬盘可能…...
计算机网络——数据链路层-封装成帧(帧定界、透明传输-字节填充,比特填充、MTU)
目录 介绍 帧定界 PPP帧 以太网帧 透明传输 字节填充(字符填充) 比特填充 比特填充习题 MTU 介绍 所谓封装成帧,就是指数据链路层给上层交付下来的协议数据单元添加帧头和帧尾,使之成为帧。 例如下图所示: …...
MySQL笔记-第03章_基本的SELECT语句
视频链接:【MySQL数据库入门到大牛,mysql安装到优化,百科全书级,全网天花板】 文章目录 第03章_基本的SELECT语句1. SQL概述1.1 SQL背景知识1.2 SQL语言排行榜1.3 SQL 分类 2. SQL语言的规则与规范2.1 基本规则2.2 SQL大小写规范 …...
FTP服务文件上传失败,错误码553的排故过程
本文主要记录文件上传失败,错误码553的排故过程。 1 背景 树莓派通过FTP给嵌入式板卡传输文件,好几套设备,发现有的能传输成功,有的传输不成功。树莓派和嵌入式板卡都一样的,出现问题时感觉很懵。 2 逐项对比 2.1 自…...
音频录制软件哪个好?帮助你找到最合适的一款
音频录制软件是日常工作、学习和创作中不可或缺的一部分。选择一个适合自己需求的录音软件对于确保音频质量和提高工作效率至关重要。可是您知道音频录制软件哪个好吗?本文将深入探讨两种常见的音频录制软件,通过详细的步骤指南,帮助您了解它…...
9.Unity搭建HTTP服务器
搭建HTTP服务器的几种方式 //1.使用别人做好的HTTP服务器软件,一般作为资源服务器时使用该方式(学习阶段建议使用) //2.自己编写HTTP服务器应用程序,一般作为Web服务器 或者 短链接游戏服务器时 使用该方式 使用别人做好的HTTP服…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
