STM32CubeIDE基础学习-LED闪烁实验

news2024/11/15 11:57:26

STM32CubeIDE基础学习-LED闪烁实验


文章目录

  • STM32CubeIDE基础学习-LED闪烁实验
  • 前言
  • 第1章 硬件介绍
  • 第2章 新建工程
    • 2.1 基础工程配置部分
    • 2.2 工程外设配置部分
    • 2.3 生成工程代码部分
    • 2.4 输出HEX文件、编译下载
  • 第3章 代码编写
    • 3.1 方式1:IO翻转
    • 3.2 方式2:调用函数
    • 3.3 方式3:宏定义
  • 第4章 实验现象
  • 总结


前言

前面的文章已经介绍过STM32CubeIDE软件的基础功能使用以及新建工程的基本步骤流程了,本文章将重新从头演示一遍新建项目的整个过程步骤,从新建到实现LED的闪烁功能。

后面的文章将不会再新建工程了,后面的工程会直接用前面的工程作为模板进行添加使用。

STM32CubeIDE软件基础知识学习回顾

实验目的:
学习配置GPIO作为输出功能使用,从而实现控制LED每隔500ms交替闪烁功能。


第1章 硬件介绍

本实验使用的开发板是STM32F103C8T6主控芯片,核心原理图如下:

在这里插入图片描述

时钟来源使用的是外部高速8M晶振作为高速时钟。

LED灯的连接原理图如下图所示:

在这里插入图片描述

由上图硬件连接原理图可知,LED的阴极接到主控芯片的PA8引脚上,根据二极管的导通原理可知,只要端口输出低电平就可以驱动LED发光。

本实验只使用到LED实现闪烁的功能,配置GPIO为输出即可。

第2章 新建工程

2.1 基础工程配置部分

第一步:双击打开软件,进入主界面后点击Strat new STM32 project新建工程文件如下图所示:

在这里插入图片描述

或者按照下图的步骤点击新建工程:

在这里插入图片描述

第二步:接着会进入下图的芯片选择界面,这个实验使用的是STM32F103C8T6芯片,按照标号步骤进行选择即可,前面也介绍过这个芯片收藏的技巧了,现在直接点击左上角的星星,选择STM32F103C8T6芯片完成后点击Next:

在这里插入图片描述

第三步:点击Next后,进入下面的界面进行设置工程名称和路径,注意名字和路径都不能存在中文字符,如下图所示:

在这里插入图片描述

设置好后点击Next进入选择固件版本界面,默认是最新版本的,需要根据自己安装的固件包版本进行选择对应版本的芯片固件包,如果选择的和下载的不是相同的版本,则后面使用可能会存在问题的。选择完成然后点击Finish完成,如下图所示:

在这里插入图片描述

接着就可以进入外设功能配置界面了,如下图所示:

在这里插入图片描述

到此,前面部分的基础工程创建步骤就完成了,接下来就可以进行配置相关外设功能了。

2.2 工程外设配置部分

第一步:配置GPIO。
跟着标号顺序依次选择,如果找不到芯片需要的引脚,可以在右下角④处输入引脚名称进行搜索,可以看到上面芯片对应的引脚会出现黑色在闪烁的,然后点击该引脚进行选择需要配置的功能即可。

在这里插入图片描述

鼠标左键点击该引脚,选择对应需要配置的功能,这个LED闪烁实验使用的是选择输出功能就行。

在这里插入图片描述

当选择了这个芯片引脚的功能时,后面发现选错了,不需要它了而需要取消选择,那么可以再次点击该芯片所选择的功能,这样就可以取消选择了。

选择完成后提示如下图所示:

在这里插入图片描述

接着配置GPIO引脚工作模式,根据查看LED的硬件连接原理图可知,LED的正电极是接到3.3V的,另外一个负电极是接到芯片引脚上的,根据发光二极管的导通原理,则该芯片引脚给低电平就可以点亮LED了,如果上电不要点亮LED,则需要把该引脚状态初始化为高电平,配置如下图所示:

在这里插入图片描述

端口功能配置如下:
1、由于初始上电要LED熄灭,则需要配置初始化状态为高电平状态。
2、模式配置为推挽输出。
3、输出保持设置不用上下拉即可,也可以设置输出上拉,这里输出设置这个上下拉作用不是很大。
4、输出速度选择中速或低速都行,对于这个LED闪烁要求不是很大。
5、User Label建议定义一个自己喜欢见名知意的名字,方便写后续程序时查看和方便使用。

第二步:配置RCC时钟。

开发板使用的是外部高速时钟晶振的输入方式,如下图所示:

在这里插入图片描述

接着配置时钟树如下图,外部8M时钟输入,可以根据时钟的倍频因子和分频因子进行配置,如果觉得麻烦,可以直接在HCLK处输入需要的系统最高主频72M,直接点击键盘回车就行,软件就会自动进行配置的了。

按回车键后可以看到提示整个配置过程的提示进度条,耐心等待完成即可。

在这里插入图片描述

完成后具体时钟配置路线如下图所示:

在这里插入图片描述

如果是自己手动配置的,若出现红色的提示,则说明这个时钟不在规定范围内而警告的,则需要检查具体参数配置是否存在设置错了导致的。

第三步:配置调试接口。
Debug处选择Serial Wire,用的是串行两线SWD模式而不是JTAG模式,选择SWD模式可以节省IO的资源占用。如下图所示:

在这里插入图片描述

第四步:配置输出文件。
建议勾选工程生成输出独立的.c / .h文件,方便管理代码。如下图④处所示:

在这里插入图片描述

最后,主控芯片被配置的引脚功能如下图所示:

在这里插入图片描述

到此,整个工程需要配置的外设功能就全部配置完成了,接下来就可以生成代码工程进行代码编写了。

2.3 生成工程代码部分

可以按快捷键ALT+K,或者点击下面这个图标按钮生成代码工程,如下图所示:

在这里插入图片描述

点击后会提示下面图片提示信息,这个是需要打开整个视图显示的,显示左边的工程栏,如果需要显示,则选择Yes。

在这里插入图片描述

打开代码工程后最终会显示下图这样的代码:

在这里插入图片描述

接着就可以在上面添加自己需要实现的LED闪烁的功能代码了。

2.4 输出HEX文件、编译下载

进入代码工程后,先不要急着编写功能代码,可以先点击编译一下整个工程,查看工程代码是否会报错,如果没有报错就说明该工程是没有问题的,则可以进行代码编写了。不然如果在一开始的工程都有问题报错的话,后面写了比较多的代码就很难定位找问题了。

正常编译后,可以发现这个软件新建工程默认是没有输出HEX烧写文件的,那么就需要设置一下生成输出才行。操作步骤如下图所示:

在这里插入图片描述

按照标号步骤依次点击选择勾选生成HEX即可,如下图所示:

在这里插入图片描述

完成后点击Apply和Apply and Close,再一次编译就可以看见输出该HEX文件了。

工程文件夹输出后路径如下图所示:

在这里插入图片描述

工程输出后如下图所示:

在这里插入图片描述

工程第一次点击下载代码时可能会提示需要确认配置工程名和下载器的,如下图所示:

在这里插入图片描述

这里默认选择ST-LINK GDB server即可,下面接口选择SWD接口。

完成点击Apply,最后点击OK即可看到程序开始下载了,右下角可以看到具体下载进度条。

第3章 代码编写

HAL库能让LED闪烁的方法有很多,下面将列举常见的三种方法进行演示。

当初始生成代码时可以看到mian文件里面有一个代码框架,去掉注释如下所示:

#include "main.h"
#include "gpio.h"

void SystemClock_Config(void);

int main(void)
{
	HAL_Init();
	SystemClock_Config();
	MX_GPIO_Init();
	while (1)
	{
	}
}

时钟系统配置和GPIO初始化都是前面在STM32CubeMX里面配置生成的,可以进入函数里面看具体的定义是否和前面配置的一致。

main.c文件里面的系统时钟初始化配置代码如下图所示:

在这里插入图片描述

main.h文件里面还定义了由用户标签相关命名的宏定义,如下图所示:

在这里插入图片描述

注意:本人一般习惯使用全部采用大写方式的宏定义,这里是代码自动生成的,后面的代码将不会使用这里的宏,而是自己重新定义的宏。具体根据个人喜欢情况来使用,可以选择使用这里的,就不用在自己定义这么麻烦了。

GPIO初始化配置如下图所示:

在这里插入图片描述

端口初始化输出高电平、推挽输出、无上下拉、中速、用户标签是LED。与STM32CubeMX的配置一一对应,如下图所示:

在这里插入图片描述

后面的外设初始化代码都会存放在 MX_GPIO_Init() 函数里面的,直接到这里就可以看到所以引脚定义了。

所有引脚的宏定义就对应在main.h文件里面了。

3.1 方式1:IO翻转

这个IO翻转的方式非常简单,直接调用HAL库提供的端口翻转函数即可,如下图所示:

在这里插入图片描述

代码片示例如下:

HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_8);      /* LED翻转 */
HAL_Delay(500);                             /* 延时500ms */

//前面生成代码时,是自动生成了一个用户标签的名字,可以直接使用,如下:

HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); /* LED翻转 */
HAL_Delay(500);                             /* 延时500ms */

//在这里就可以体现出前面设置的User Label用户标签的好处作用了。

HAL_Delay这个延时函数是HAL库提供写好的,不用自己写了,当然,写一个属于自己的延时函数也是可以的。

3.2 方式2:调用函数

调用写端口函数,使用GPIOx_BSRR寄存器来操作引脚。调用如下图所示:

在这里插入图片描述

代码片示例如下:

HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);    /* 设置端口输出高电平 */
HAL_Delay(500);                                             /* 延时500ms */
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);  /* 设置端口输出低电平 */
HAL_Delay(500);                                             /* 延时500ms */

3.3 方式3:宏定义

采用宏定义的方式可以让代码移植起来、修改起来更方便、可观性更强。

简单的宏定义方式如下图所示:

在这里插入图片描述

这种宏定义的方式也就是间接的调用了HAL_GPIO_WritePin函数,只是做了相应的处理而已。

直接在define处进行宏定义即可,下次直接调用LED()就可以了,而不需要再次写HAL_GPIO_WritePin()这么长的函数及里面的参数了,免去了每次都传入参数这么麻烦的步骤。

这样写,只要给LED()传入参数是0或1就可以对应操作该端口的低 / 高电平了,使用起来非常的方便。

这里主要操作的是C语言里面的三目运算符和do…while()语句,熟练掌握这些就自然明白该段程序的执行过程了。

main函数的调用如下图所示:

在这里插入图片描述

代码片示例如下:

LED(1);              /* 设置端口输出高电平,关闭LED */
HAL_Delay(500);      /* 延时500ms */
LED(0);              /* 设置端口输出高电平,打开LED */
HAL_Delay(500);      /* 延时500ms */

到此,采用宏定义的方式代码就完成了,下载之后就可以看到LED闪烁了。

附加部分:
简单的方式成功实现之后,为了更好的管理代码,可以单独创建LED文件来存放这些功能代码了,前面的文章介绍了创建文件的方法步骤,这里就快速创建了,创建完成后如下图所示:

在这里插入图片描述

头文件:
把宏定义都剪切到头文件这里来,如下图所示:

在这里插入图片描述

main文件while里面的内容还是一样,没有变化,不用处理,但要注意包含头文件路径。如下图所示:

在这里插入图片描述

led.c文件里面暂时可以没有内容。

此时发现led.h文件里面的宏定义看起来还不是特别好,代码移植或者修改起来还是比较麻烦,需要修改的地方比较多,那么还可以进一步优化,让需要修改的代码尽量减少,添加完宏定义代码如下图所示:

在这里插入图片描述

注意:这里宏定义的名字根据个人的习惯喜欢来写就行,没有规定写什么内容,可以自己定义,也可以直接使用main.h里面的宏定义,也是可以的,我是为了操作习惯而统一写成大写的方式。

为了方便测试LED的功能,此时我在led.c文件里面可以添加了一个函数内容,单独写一个测试LED闪烁的函数。如下图所示:

在这里插入图片描述
由于用到了这些库函数,所以需要在这里或者led.h文件中把main.h引入到文件中才行,不然编译会报错提示找不到路径。

main里面调用如下图所示:

在这里插入图片描述

下载代码后,可以看下LED的执行现象。

第4章 实验现象

下载代码后,就可以看到板子的LED每隔500毫秒在交替闪烁了。


总结

以上就是常见的让LED闪烁的功能代码编写方式了,刚开始学习一般都是用前两个方式实现,后面的宏定义方式就比较常用于项目了,操作起来非常的方便。

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

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

相关文章

“西安大重澳生物科技有限公司”——甄选优质企业品牌入围央媒

西安大重澳生物科技有限公司,一家专注于生物科技研发的企业,自2017年成立以来,致力于开发革命性的肤用肽制剂产品。近日,成功入围央视新媒体直播盛典。在持续的创新与努力下,畅夫泰R畅肤肽品牌已成为备受瞩目的名副其实…

园区配电监测信息系统

园区配电监测信息系统是一款集成了高科技、数据分析和管理的系统,旨在实时监测和控制园区内的电力供应,提高电力使用效率,减少能源浪费,确保电力安全。该系统通过现代通信技术、自动控制技术和计算机技术,实现对园区配…

码云简化版使用教程

码云简化版使用教程 ①创建本地项目 ②在本地项目根目录下创建git相关目录及文件 ③在码云上创建新的仓库 ④在本地项目中配置仓库地址,提交项目内容 下面直接从第二步开始讲解 在本地项目根目录下创建git相关目录及文件 1、打开项目根目录,进入cmd界…

Huggingface 笔记:大模型(Gemma2B,Gemma 7B)部署+基本使用

1 部署 1.1 申请权限 在huggingface的gemma界面,点击“term”以申请gemma访问权限 https://huggingface.co/google/gemma-7b 然后接受条款 1.2 添加hugging对应的token 如果直接用gemma提供的代码,会出现如下问题: from transformers i…

邮箱验证码api接口申请流程?有哪些条件?

邮箱验证码API服务如何选择?怎么正确设置邮箱验证码? 邮箱验证码API接口在保障用户账号安全、提高用户体验方面发挥着至关重要的作用。AokSend将详细介绍邮箱验证码API接口的申请流程,帮助您顺利集成这一功能,增强应用的安全性。…

【ADF4351】使用FPGA进行SPI寄存器配置、使用FPGA计算各个频率的频点,ADF4351配置程序

简介 特性 输出频率范围:35 MHz至4,400 MHz 小数N分频频率合成器和整数N分频频率合成器 具有低相位噪声的VCO 可编程的1/2/4/8/16/32/64分频输出 典型抖动:0.3 ps rms EVM(典型值,2.1 GHz): 0.4% 电源:3.0 V至3.6 V …

基于spring boot框架的发艺美发店管理系统

摘 要 系统根据现有的管理模块进行开发和扩展,采用面向对象的开发的思想和结构化的开发方法对发艺美发店管理的现状进行系统调查。采用结构化的分析设计,该方法要求结合一定的图表,在模块化的基础上进行系统的开发工作。在设计中采用“自下而…

算法详解——选择排序和冒泡排序

一、选择排序 选择排序算法的执行过程是这样的:首先,算法遍历整个列表以确定最小的元素,接着,这个最小的元素被置换到列表的开头,确保它被放置在其应有的有序位置上。接下来,从列表的第二个元素开始&#x…

Java进阶 Maven基础

资料格式 配置文件 com.itheima Java代码 Statement stat con.createStatement(); 示例 com.itheima 命令 mvn test - Maven简介 传统项目管理状态分析 Maven 是什么 Maven的本质是一个项目管理工具,将项目开发过程抽象成一个项目对象模型(POM&…

如何使用phpStudy在Windows系统部署静态站点并实现无公网IP远程访问

文章目录 使用工具1. 本地搭建web网站1.1 下载phpstudy后解压并安装1.2 打开默认站点,测试1.3 下载静态演示站点1.4 打开站点根目录1.5 复制演示站点到站网根目录1.6 在浏览器中,查看演示效果。 2. 将本地web网站发布到公网2.1 安装cpolar内网穿透2.2 映…

文献速递:深度学习乳腺癌诊断---使用深度学习改善乳腺癌组织学分级

Title 题目 Improved breast cancer histological grading using deep learning 使用深度学习改善乳腺癌组织学分级 01 文献速递介绍 乳腺癌组织学分级是乳腺癌中一个确立的临床变量,它包括来自三个方面的信息,即小管形成程度、核多态性和有丝分裂计…

java数据结构与算法刷题-----LeetCode1005. K 次取反后最大化的数组和(这就不是简单题)

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 卷来卷去,把简单题都卷成中等题了 文章目录 1. 排序后从小到大…

免费录屏软件无水印推荐,录制视频更轻松(3款)

随着互联网技术的快速发展,录制屏幕成为人们日常生活中日益重要的需求。无论是制作教学视频、直播分享,还是录制游戏过程,一款好用且免费的录屏软件都是不可或缺的。然而,许多录屏软件在录制过程中会添加水印,影响了录…

电脑如何直接压缩图片?这几个方法帮你解决

在许多社交媒体平台上,上传照片时经常需要进行大小调整,这是因为较大的照片文件可能会占用更多的存储空间,并且在传输过程中需要更长的时间。通过图片压缩可以减小文件大小,提高上传速度,并节省存储空间,那…

大学老师不会告诉你的网安证书?

前言 在大学中,有很多安全专业的师傅们,一直有问: “计算机xxx级有用吗?” “软考初级有用吗?” “xxx资格证有用吗?” 甚至有一些来讲这些整数的,以“我们这个专业以后就业需要的证书....…

SpringCloud-注册中心

一、注册中心简介 1、服务治理 服务治理中的三个角色: 服务提供者:负责提供服务的实现和运行。服务提供者将服务注册到服务注册中心,并根据需要处理来自消费者的请求。(暴露服务接口,供其他服务调用)。 …

【Python】flask框架请求体数据,文件上传,请求头信息获取方式案例汇总

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

新媒体代运营是什么意思?CloudNEO:新媒体代运营的领先之选

新媒体代运营是什么意思? 随着互联网的迅速发展和普及,新媒体已经成为了企业推广和营销的重要工具。在这个背景下,新媒体代运营应运而生,成为了企业实现品牌曝光、粉丝增长和内容传播的重要方式。那么,新媒体代运营到…

经纬恒润推出新一代快速控制原型产品 ControlBase_S

近年来,软件定义汽车的发展趋势在行业内已经达成共识,与此同时,产品越来越复杂,开发周期越来越短,给软件开发带来了极大的挑战。在软硬件解耦的背景下,如何提前进行软件架构、算法开发及验证,成…

LeetCode 热题 100 | 回溯(三)

目录 1 131. 分割回文串 2 51. N 皇后 菜鸟做题,语言是 C,感冒好了 ver. 1 131. 分割回文串 题眼:给你一个字符串 s,请你将 s 分割 成一些子串。 根据题眼可知,我们需要做的是将字符串 s 连续分割 为几段&#…