[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毫秒,就实现了流水灯功能。 

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

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

相关文章

【3】密评-物理和环境安全测评

0x01 依据 GB/T 39786 -2021《信息安全技术 信息系统密码应用基本要求》针对等保三级系统要求: 物理和环境层面: a)宜采用密码技术进行物理访问身份鉴别,保证重要区域进入人员身份的真实性; b)宜采用密码技术保证电子门…

[HTML]Web前端开发技术7(HTML5、CSS3、JavaScript )CSS的定位机制——喵喵画网页

希望你开心,希望你健康,希望你幸福,希望你点赞! 最后的最后,关注喵,关注喵,关注喵,佬佬会看到更多有趣的博客哦!!! 喵喵喵,你对我真的…

电音制作入门软件FL Studio21.2.0最新永久免费版

FL Studio是一款出色的编曲软件,最新版本的FL Studio21新增了四款全新的插件,覆盖了音频设计、延迟、相位器等等。通过软件的不断更新,我们可以享受到更加智能的电子音乐创作工具,目前,FL Studio的正式版已经推出了超过…

内核启动时间信息打印

文章目录 一 串口打印1 借助串口助手2 dmesg自带时间3 内核显示时间信息4 借助initcall_debug二 图形花显示1 bootgraph工具使用2 Bootchart工具使用3 Grabserial工具使用一 串口打印 1 借助串口助手 2 dmesg自带时间 root@xboard:~# dmesg [ 0.000000] Booting Linux on …

操作系统概论:揭秘计算机背后的神秘力量

操作系统概论 & 功能 概述定义操作系统功能作为系统资源的管理者向上层提供方便易用的服务作为最接近硬件的层次 主页传送门:📀 传送 概述 概念: 定义 控制和管理计算机硬件和软件资源的程序一种系统软件为上层用户、应用程序提供简单易…

uniapp开发小程序经验记录

uniapp开发小程序的过程中会遇到很多问题,这里记录一下相关工具优化,便于后来者参考。 每次保存代码后,小程序都跳回首页 针对这个问题,常规的做法就是修改pages配置文件,但是这种方式不便于路由参数的设置&#xff…

某60区块链安全之JOP实战一学习记录

区块链安全 文章目录 区块链安全Jump Oriented Programming实战一实验目的实验环境实验工具实验原理实验内容Jump Oriented Programming实战一 实验步骤分析合约源代码漏洞Jump Oriented Programming实战一 实验目的 学会使用python3的web3模块 学会分析以太坊智能合约中中Ju…

CPP-SCNUOJ-Problem P24. [算法课贪心] 跳跃游戏

Problem P24. [算法课贪心] 跳跃游戏 给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。 数组中的每个元素代表你在该位置可以跳跃的最大长度 判断你是否能够到达最后一个下标。 输入 输入一行数组nums 输出 输出true/fasle 样例 标准输入 2 3 1 …

【Wireshark工具使用】Wireshark无法抓取TwinCAT的EtherCAT包(已解决)

写在前面 因项目需要,近期在在深入研究EtherCAT协议,之后会将协议做一个系统的总结,分享在这个分栏。在研究EtherCAT协议帧时,使用了一个网络数据分析工具Wireshark,本文是关于EtherCAT数据帧分析工具使用中遇到的一个…

【设计模式】策略模式设计-电影票打折功能

任务二:使用策略模式设计电影票打折功能 某电影院售标系统为不同类型的用户提供了不同的打折方式(Discount),学生凭学生证可享受8折优惠**(StudentDiscount),儿童可享受减免10元的优惠&#xf…

「Verilog学习笔记」时钟分频(偶数)

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网 timescale 1ns/1nsmodule even_div(input wire rst ,input wire clk_in,output wire clk_out2,output wire clk_out4,output wire clk_out8); //********…

新华三数字大赛复赛知识点 VLAN基本技术

VLAN IEEE 802.1Q 交换机端口类型 MVRP协议 VLAN Virtual LAN虚拟局域网。LAN可以是由几台少数家用计算机构成的网络,也可以是数以百计的计算机构成的企业网络。VLAN所指的LAN特指使用路由器分割的网络–也就是广播域。将一个物理的局域网在逻辑上划分成多个广播域…

苹果IOS在Safari浏览器中将网页添加到主屏幕做伪Web App,自定义图标,启动动画,自定义名称,全屏应用pwa

在ios中我们可以使用Safari浏览自带的将网页添加到主屏幕上,让我们的web页面看起来像一个本地应用程序一样,通过桌面APP图标一打开,直接全屏展示,就像在APP中效果一样,完全体会不到你是在浏览器中。 1.网站添加样式 在…

时间复杂度为 O(n^2) 的排序算法 | 京东物流技术团队

对于小规模数据,我们可以选用时间复杂度为 O(n2) 的排序算法。因为时间复杂度并不代表实际代码的执行时间,它省去了低阶、系数和常数,仅代表的增长趋势,所以在小规模数据情况下, O(n2) 的排序算法可能会比 O(nlogn) 的…

Stable Diffusion教程:4000字说清楚图生图

原文:Stable Diffusion教程:4000字说清楚图生图 - 知乎 目录 收起 基本使用 涂鸦绘制 局部绘制 局部绘制(涂鸦蒙版) 局部绘制(上传蒙版) 批量处理 总结 资源下载 “图生图”是 Stable Diffusion…

【Android知识笔记】架构专题(三)

如何用工程手段,提高写代码的生产力?(元编程) 即如何写同样多的代码,花费更少的时间?如何自动生成代码,哪种代码可以被自动生成?哪些环节能够作为自动生成代码的切入点? 代码自动生成技术 代码自动生成,指的并不是让计算机凭自己的意愿生成代码。而是让预先实现好…

windows运行orb-slam3遇到的问题

windows版代码地址:https://github.com/melhashash/orbslam3-windows 编译完成,出现初始化不成功的现象。 问题一: 相机参数中没有相机类型,导致畸变参数初始化失败。 GrabImageRGBD中frame对象实例化时,缺少相机参数…

【Windows】永久屏蔽系统更新

永久关闭电脑更新服务 操作思路: 第一步 winR 输入 services.msc 回车 进入服务管理窗口第二步 进入窗口后 找到 w 开头的文件夹 并找到Windows Update 双击打开 Windows Update 将启动类型(E) 改为禁用 上方的 “常规” “登录” “恢…

SNP推出新Glue软件Saas版本,助力云数据集成

最新Glue版本可作为软件即服务(SaaS)应用程序使用SAP数据和非SAP数据源之间的云原生集成大大简化了客户的企业数据集成SNP Glue通过应对AI和大数据计划中的关键挑战来增强云数据集成的价值 德国,海德堡 —— 2023年11月29日,作为SAP环境中数字化转型、自…

Vue学习笔记-<router-link>的replace的属性

router-link的replace属性 作用:控制路由跳转时操作浏览器历史记录的模式 浏览器的历史记录有两种写入方式:push和replace,其中push是追加历史记录(将浏览的url请求入栈),replace则是替换当前记录。路由跳…