STM32F4 | 跑马灯实验

news2024/12/25 12:28:46

文章目录

    • 一、 STM32F4 IO 口简介
    • 二、硬件设计
    • 三、软件设计
      • 1.位带操作(F7除外)
    • 四、实验现象
    • 五、STM32CubeMX 配置 IO 口输入

  在本章中,我们将通过代码控制 ALIENTEK 阿波罗 STM32 开发板上的两个 LEDDS0DS1 交替闪烁,实现类似跑马灯的效果。

一、 STM32F4 IO 口简介

  这部分内容可参考STM32F4 | GPIO工作原理和配置。

二、硬件设计

  本章用到的硬件只有 LEDDS0DS1)。其电路在 ALIENTEK 阿波罗 STM32 开发板上默认是已经连接好了的。DS0PB1DS1PB0。所以在硬件上不需要动任何东西。其连接原理图如下:
在这里插入图片描述

三、软件设计

  我们直接复制前面创建好的工程模板——库函数版本,将复制过来的模板文件夹重新命名为“1-跑马灯实验”。在模板里面的 HALLIB 分组下面,我们引入了所有的 HAL 库源文件和对应的头文件,如下图所示:
在这里插入图片描述
实际上,这些大家可以根据工程需要添加。跑马灯实验我们一共使用到 HAL 库中 9 个源文件,其他不用的源文件大家可以直接在工程中删除。这样可以大大减少工程编译时间。
  在工程根目录文件夹下面新建一个 HARDWARE 的文件夹,用来存储与硬件相关的代码。然后在 HARDWARE 文件夹下新建一个 LED 文件夹,用来存放与 LED 相关的代码。
在这里插入图片描述
  接下来, 我们回到我们的工程,新建一个文件,然后保存在HARDWARE->LED 文件夹下面,保存为 led.c
在这里插入图片描述
  在led.c文件中输入以下代码:

#include "led.h"

/*
函数名称:LED_Init
函数作用:LED初始化配置
输		入:无
输		出:无
*/
void LED_Init(void)
{
	GPIO_InitTypeDef GPIO_Initure; //定义结构体变量,结构体成员为GPIO的相关模式和状态
	__HAL_RCC_GPIOB_CLK_ENABLE(); //开启 GPIOB 时钟
	
	//设置多个IO口,并且在同一个分组下,并且每个IO的配置都是一样的,就可以通过“|”来设置
	GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1; //指定IO口:PB1,0
	GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //模式设置:推挽输出;GPIO_MODE_OUTPUT_OD是开漏输出
	GPIO_Initure.Pull=GPIO_PULLUP; //上下拉设置:上拉
	GPIO_Initure.Speed=GPIO_SPEED_HIGH; //速度设置:高速
	
	
	HAL_GPIO_Init(GPIOB,&GPIO_Initure);
	
	//设置一组 IO 口中的一个或者多个 IO 口的电平状态
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET); //PB0 置 1 ,默认灯灭
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET); //PB1 置 1 ,默认灯灭
	
	
}

其头文件为led.h

#ifndef _LED_H
#define _LED_H
#include "sys.h"

//宏定义LED控制管脚
#define LED0 PBout(1)  //LED0 PB1
#define LED1 PBout(0)  //LED1 PB0

//声明函数
void LED_Init(void);
#endif

  我们在 Manage Project Itmes 管理里面新建一个 HARDWARE的组,并把 led.c 加入到这个组里面。
在这里插入图片描述
再将 led.h 头文件的路径加入到工程里面
在这里插入图片描述
  打开main.c文件,编写如下:

/*
实验:跑马灯实验
实验现象:LED0 和 LED1 循环闪烁
*/
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"


int main(void)
{
	HAL_Init(); //初始化HAL库
	Stm32_Clock_Init(360,25,2,8); //设置时钟,180MHz
	delay_init(180); 
	LED_Init();
	
	while (1)
	{
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET); //LED0 亮
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET); //LED1 灭
		delay_ms(500); //延时 500ms
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET); //LED0 灭
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET); //LED1 亮
		delay_ms(500);		
	}

}

至此,整个程序就编写完成,我们编译一下,如下图所示:
在这里插入图片描述

1.位带操作(F7除外)

  位操作原理: 把每个比特膨胀为一个32位的字,当访问这些字的时候就达到了访问比特的目的,比如说BSRR寄存器有32个位,那么可以映射到32个地址上,我们去访问(读-改-写)这32个地址就达到访问32个比特的目的。
在这里插入图片描述
位带操作的优越性在这里插入图片描述
  修改 main()函数,直接通过位带操作达到同样的效果,位带操作的代码如下:

int main(void)
{ 
	HAL_Init(); //初始化 HAL 库 
	Stm32_Clock_Init(360,25,2,8); //设置时钟,180Mhz
	delay_init(180); //初始化延时函数
	LED_Init(); //初始化 LED 

	while(1)
	{
		LED0=0; //LED0 亮
		LED1=1; //LED1 灭
		delay_ms(500);
		LED0=1; //LED0 灭
		LED1=0; //LED1 亮
		delay_ms(500);
	}
}

当然,我们也可以通过直接操作相关寄存器的方法来设置 IO,我们只需要将主函数main.c修改为如下内容:

int main(void)
{ 
	HAL_Init(); //初始化 HAL 库 
	Stm32_Clock_Init(360,25,2,8); //设置时钟,180Mhz
	delay_init(180); //初始化延时函数
	LED_Init(); //初始化 LED 

	while(1)
	{
		GPIOB->BSRR=GPIO_PIN_1; //LED0 亮
		GPIOB->BSRR=GPIO_PIN_0<<16; //LED1 灭
		delay_ms(500); //延时 500ms
		GPIOB->BSRR=GPIO_PIN_1<<16; //LED0 灭
		GPIOB->BSRR=GPIO_PIN_0; //LED1 亮
		delay_ms(500); //延时 500ms
	}
}

四、实验现象

  使用 USB 线将开发板和电脑连接成功后(电脑能识别开发板上 CH340 串口),把编译后产生的.hex 文件烧入到芯片内。实验现象:LED0LED1 循环闪烁。
在这里插入图片描述

五、STM32CubeMX 配置 IO 口输入

  使用STM32CubeMX 配置 GPIO 口的步骤如下:

  1. 第一步,打开 STM32CubeMX 工具,在引脚图中选择要配置的 IO 口。这里我们选择 PB0为例,在弹出的下拉菜单中选择要配置的 IO 口模式,如下图所示:
    在这里插入图片描述
    从上图可以看出,这里我们除了配置 IO 口为输入输出之外,还可以选择 IO 口的复用功能或者作为外部中断引脚功能,比如我们要选择 IO 口复用为 ADC1 的通道 8 引脚,那么我们只需要选选项 ADC1_IN8 即可。对于本章跑马灯实验,PB0 是作为输出,所以我们选 GPIO_Output即可。

  2. 第二步,进入 Configuration->GPIO,在弹出的界面配置 IO 口的详细参数。如下图所示:
    在这里插入图片描述
    IO 口详细参数配置界面,点击我们要配置的 IO 口,会在窗口下方显示该 IO 口配置的详细参数表,下面我们依次来解释这些配置项的含义:

    • 选项GPIO output level用来设置IO口初始化电平状态为High(高电平)还是Low(低电平)。本实验我们设置为默认输出高 High
    • 选项 GPIO mode 用来设置输出模式为 Output Push Pull(推挽)还是 Output Open Drain(开漏)。本实验我们设置为推挽输出 Output Push Pull
    • 选项 GPIO Pull-up/Pull-down 用来设置 IO 口是上拉/下拉/没有上下拉。本实验我们设置为上拉(Pull-up)。
    • 选项Mzximum ouput speed用来设置输出速度为高速(Hign)/快速(Fast)/中速(Medium)/低速(Low)。本实验我们设置为高速 High
    • 选项 User Label 是用来设置初始化的 IOPin 值为我们自定义的宏,一般情况我们可以不用设置。
  3. 生成工程源码。接下来打开工程的 main.c 文件可以看到,该文件内部由 STM32CubeMX 生成了函数 MX_GPIO_Init,内容如下:

    void MX_GPIO_Init(void)
    {
    
      GPIO_InitTypeDef GPIO_InitStruct;
    
      /* GPIO Ports Clock Enable */
     // __HAL_RCC_GPIOH_CLK_ENABLE();
      __HAL_RCC_GPIOB_CLK_ENABLE();
    
      /*Configure GPIO pin Output Level */
      HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0|GPIO_PIN_1, GPIO_PIN_SET);
    
      /*Configure GPIO pins : PB0 PB1 */
      GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1;
      GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
      GPIO_InitStruct.Pull = GPIO_PULLUP;
      GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
      HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
    
    }
    

  该函数的作用跟前面讲解的跑马灯实验中 LED_Init 函数作用一模一样,有兴趣的同学可以直接修改跑马灯实验工程源码,把 LED_Init 函数内容修改为 MX_GPIO_Init 内容,大家会发现实验效果一模一样。
  一般情况下,STM32CubeMX 的主要作用是配置时钟系统和外设初始化函数。所以我们对外设进行配置之后,生成外设初始化代码,然后把该代码应用到我们工程即可。

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

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

相关文章

【salesforce Admin必备】-想到啥写点啥

【salesforce Admin必备】-想到啥写点啥 文章目录【salesforce Admin必备】-想到啥写点啥前言一&#xff0c;货币相关1.带汇率的多种货币-Activate multiple currencies with exchange rates1.1 启用多币种2.Update the Exchange Rate with ACM2.1启用高级货币管理&#xff08;…

数据结构【树和二叉树的相关知识和题目】

文章目录引言&#xff1a;一、树和二叉树的相关知识&#xff08;一、&#xff09;什么是树1.树&#xff08;1.&#xff09;日常生活中的树&#xff08;2.&#xff09;树的基本概念&#xff08;非线性结构&#xff09;&#xff08;3.&#xff09;代码人眼中的树&#xff1a;&…

ORB-SLAM2 --- Tracking::UpdateLocalKeyFrames函数

目录 1.函数作用 2. 函数步骤 3.code 4.函数解析 4.1 记录共视 4.2 更新局部关键帧&#xff08;mvpLocalKeyFrames&#xff09; 4.3 更新当前帧的参考关键帧&#xff0c;与自己共视程度最高的关键帧作为参考关键帧 1.函数作用 跟踪局部地图函数里&#xff0c;更新局部…

【在SpringBoot项目中删除相册数据--Service层】

由于AlbumMapper.java中已经实现了“根据id删除数据表中的相册数据”&#xff0c;所以&#xff0c;可以直接从Service开始开发此功能。 先在IAlbumService中添加抽象方法&#xff1a; /** * 删除相册 * param id 尝试删除的相册的id */ void delete(Long id); 然后&#xf…

[附源码]Python计算机毕业设计SSM基于web的烟草售卖系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Android Studio Gradle 无限 Build「假死」

Android Studio Gradle 无限 Build「假死」 解决方案 工程配置 Gradle 的 gradle.properties 文件中添加如下代码&#xff1a; org.gradle.daemontrue org.gradle.paralleltrue然后重新 Sync 工程&#xff0c;漫长等待依赖下载完成后&#xff0c;重新 Build 项目即可 补充 …

【Unity 3D 从入门到实战】Unity 3D 组件总结

目录 一&#xff0c;前言 二&#xff0c;常用组件 1&#xff0c;Transform 组件 2&#xff0c;Mesh Filter 组件 3&#xff0c;Box Collider 组件 4&#xff0c;Rigidbody 组件 5&#xff0c;脚本组件 三&#xff0c;总结 一&#xff0c;前言 组件是 Unity 3D 中的重要…

Attention Is All You Need

摘要 The dominant sequence transduction models 显性序列转换模型。complex recurrent 复杂的递归。convolutional neural networks 卷积神经网络。an encoder and a decoder 编码器和解码器。The best performing models性能最佳的模型the encoder →\rightarrow→ an atte…

D. Lucky Chains

传送门 题意&#xff1a;给你两个数x,y让你求满足xk,yk并且GCD(xk,yk)!1的最小值。 思路&#xff1a;要求满足xk,yk并且GCD(xk,yk)!1的最小值&#xff0c;那么就相等于存在(xk)%d(yk)%d 变化一下就等于(x-y)%d0&#xff0c;那么就是找x-y的约数&#xff0c;然后这个约数可能是…

疫情散去想看电影,用css动画模拟一个阿凡达2完美开场

在历经了艰苦卓绝的3年抗疫后&#xff0c;疫情终于还是来了&#xff0c;很多小伙伴变成了小洋人酸奶&#xff0c;我相信过不了多少天&#xff0c;疫情终将散去&#xff0c;那个时候就可以和家人走进电影院啦。 今天用css布局一个阿凡达2的影院场景&#xff0c;提前过一过瘾。 目…

ARM 异常返回地址

armv7-a armv8-a linux5.15 Preferred exception return address armv7 exception return address correction armv8-32 exception return address correction armv8-64 没有查到link value offset表 arm32 data abort exception为例 周期1周期2周期3周期4周期5指令1pc-8取指…

[附源码]Node.js计算机毕业设计电影推荐系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

【LSTM预测】基于鲸鱼算法优化双向长短时记忆BiLSTM(多输入单输出)航空发动机寿命预测含Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

CloudCompare算法库(CCCorelib)编译与使用

文章目录一、简介二、编译过程三、举个栗子优秀的算法库&#xff0c;值得所有点云爱好者去使用和研究*~*。 一、简介 之前一直没注意到CloudCompare的作者&#xff08;光头大佬&#xff09;已经将CloudCompare的算法库与其可视化部分进行了分离&#xff0c;今天正好有同学问了这…

以太坊地址Address介绍附代码示例

Address是什么 通常情况下&#xff0c;地址代表一外部账户或合约账户&#xff0c;它们都可以在区块链上接收&#xff08;目标地址&#xff09;或发送&#xff08;源地址&#xff09;。 更具体地说&#xff0c;它是根据ECDSA算法&#xff0c;从公钥的Keccak-256哈希值的最后20个…

MapRecuce 词频统计案例

文章目录初探MapReduce一、MapReduce核心思想二、MapReduce编程实例-词频统计思路1、map阶段(映射)2、reduce阶段(归并阶段)三、词频统计编程实现1、准备数据文件2、将文件上传到hdfs指定路径3、在java里创建词频统计映射器类4、创建词频统计驱动类5、运行词频统计驱动类&#…

【机器学习】SVM多分类问题及基于sklearn的Python代码实现

SVM多分类问题及Python代码实现1. 什么是SVM&#xff1f;2. SVM的分类3. SVM决策函数类型4. SVM多分类的Python代码实现参考资料1. 什么是SVM&#xff1f; 对于这个点已经介绍的非常多了&#xff0c;不管是西瓜书还是各种博客&#xff0c;就是需要找到一个超平面&#xff0c;用…

【Redis】Zset和Hash类型

Hash类型 Redis hash 是一个键值对集合。Redis hash是一个string类型的field和value的映射表&#xff0c;hash特别适合用于存储对象。 Hash 类型的底层数据结构是由压缩列表或哈希表实现的&#xff1a; 如果哈希类型元素小于512个&#xff0c;所有值的大小小于64字节。Redis…

一不小心手动实现了k8s的自动化构建

背景 由于公司需要对公司内部的软件需要对外部署&#xff0c;对于前端的部署&#xff0c;需要一套部署的方案。尝试了写了一个适配多模块可配置的部署脚本&#xff0c;本文对实现的过程进行一个记录。 目的 脚本采用的是node&#xff0c;前端同学的首选。脚本的目的就是实现k8s…

企业在ERP系统下的全面预算管理系统的实现

现代企业的发展离不开各种管理系统的建立和应用&#xff0c;针对于企业预算管理而言&#xff0c;全面的管理系统对于企业实现现代化管理有着较为深入的影响&#xff0c;ERP系统可以帮助企业更好的实现此项功能&#xff0c;本文就是在此背景下展开论述的。 编辑搜图 一、全面预算…