当前位置: 首页 > news >正文

[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总线上外设的时钟。RCCReset 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服…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂&#xff…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...

微信小程序云开发平台MySQL的连接方式

注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...