STM32入门开发操作记录(二)——LED与蜂鸣器

目录

  • 一、工程模板
  • 二、点亮主板
    • 1. 配置寄存器
    • 2. 调用库函数
  • 三、LED
    • 1. 闪烁
    • 2. 流水灯
  • 四、蜂鸣器

一、工程模板

  参照第一篇,新建工程目录ProjectMould,将先前打包好的StartLibraryUser文件^C^V过来,并在Keil5内完成器件支持包的加载模块路径的添加ST配置,即可得到工程模板。

  以后建立新项目只需拷贝模板、重命名后,在Keil5内打开即可。
请添加图片描述

二、点亮主板

  所需器材:STM32最小系统板、ST-Link仿真器、母对母杜邦线4根。
  端口接线:

STM32ST-Link
GNDGND
SWCLKSWCLK
SWIOSWDIO
3V33.3V

请添加图片描述

  正确接入后,PWR端口01灯常亮,PC13端口02灯闪烁,这是芯片内置的初始测试程序。

1. 配置寄存器

  该方法需要阅读芯片参考手册,将数字信号转换为八进制传递参数。

#include "stm32f10x.h"

int main(void)
{
	// 配置寄存器点灯
	RCC->APB2ENR = 0x00000010;	// RCC寄存器——APB2外设时钟使能寄存器 -> 开启IO端口C时钟
	GPIOC->CRH = 0x00300000;	// GPIO寄存器——端口配置高寄存器 -> 通用推挽输出模式:最大速度50MHz
	GPIOC->ODR = 0x00002000;	// GPIO寄存器——端口输出数据寄存器 -> PC13端口:高电平(灭)
	//GPIOC->ODR = 0x00000000;	// GPIO寄存器——端口输出数据寄存器 -> PC13端口:低电平(亮)	
}

  程序编写完成后,F7 + F8编译并载入,就可以实现PC13端口02灯的控制。请添加图片描述

2. 调用库函数

  该方法形式较为复杂,但代码更具复用性和可读性,下文开始全部使用库函数编程。

#include "stm32f10x.h"

int main(void)
{
	// 外设时钟控制:使能/失能APB2的外设时钟 -> 开启IO端口C时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
	
	// 配置结构体参数
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;	// 通用推挽输出模式
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;			// PC13引脚
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	// 最大速度50MHz
	
	// 初始化端口模式 -> 初始化GPIOC外设时钟
	GPIO_Init(GPIOC, &GPIO_InitStructure);
	
	// 配置端口电平
	GPIO_SetBits(GPIOC, GPIO_Pin_13);		// 高电平:熄灭
	//GPIO_ResetBits(GPIOC, GPIO_Pin_13);	// 低电平:点亮
}

三、LED

  所需器材:STM32最小系统板、ST-LINK仿真器、MB-102面包板、LED(长脚+,短脚-)若干、跳线若干、杜邦线若干。
请添加图片描述

  系统板初次插入面包板会十分困难,建议先用杜邦线探针逐个疏通面包板的插孔,然后在系统板两端交替施力,“跷跷板式”下压,直至完全进入。

1. 闪烁

  参照第一篇,将目录Resource\程序源码\STM32Project-无注释版\1-3 Delay函数模块\下的头文件加入System,完成延时函数模块的添加,编译并载入以下代码。

#include "stm32f10x.h"	// 器件模块
#include "Delay.h" 		// 延时模块

// LED闪烁
int main(void)
{
	// 使能/失能APB2的外设时钟 -> 开启IO端口A时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	// 配置结构体参数
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;	// 通用推挽输出模式
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;			// PA0引脚
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	// 最大速度50MHz
	
	// 配置端口模式 -> 初始化GPIOA外设时钟
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	// 配置端口电平
	//GPIO_SetBits(GPIOA, GPIO_Pin_0);		// 高电平:熄灭
	//GPIO_ResetBits(GPIOA, GPIO_Pin_0);	// 低电平:点亮
	
	// 闪烁:周期200毫秒
	while(1)
	{
		//GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);		// 低电平:点亮
		//Delay_ms(500);
		//GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);		// 高电平:熄灭
		//Delay_ms(500);
		
		GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)0);		// 低电平:点亮
		Delay_ms(100);
		GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)1);		// 高电平:熄灭
		Delay_ms(100);
	}
}

2. 流水灯

  在A0A7端口接入LED

#include "stm32f10x.h"	// 器件模块
#include "Delay.h" 		// 延时模块

// 流水灯
int main(void)
{
	// 使能/失能APB2的外设时钟 -> 开启IO端口A时钟
	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_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; // PA引脚
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	// 最大速度50MHz
	
	// 配置端口模式 -> 初始化GPIOA外设时钟
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	// 延时闪烁:取反 -> 低电平:点亮
	while(1)
	{
		GPIO_Write(GPIOA, ~0x0001);		// A0
		Delay_ms(100);
		GPIO_Write(GPIOA, ~0x0002);		// A1
		Delay_ms(100);
		GPIO_Write(GPIOA, ~0x0004);		// A2
		Delay_ms(100);
		GPIO_Write(GPIOA, ~0x0008);		// A3
		Delay_ms(100);
		GPIO_Write(GPIOA, ~0x0010);		// A4
		Delay_ms(100);
		GPIO_Write(GPIOA, ~0x0020);		// A5
		Delay_ms(100);
		GPIO_Write(GPIOA, ~0x0040);		// A6
		Delay_ms(100);
		GPIO_Write(GPIOA, ~0x0080);		// A7
		Delay_ms(100);
	}
}

  

四、蜂鸣器

  所需器材:STM32最小系统板、ST-LINK仿真器、MB-102面包板、3.3V有源蜂鸣器、跳线若干、公对公/母杜邦线若干。
  端口接线:除了A15B3B4JLINK的调试端口,其他端口都可用。

蜂鸣器面包板
GND-
I/OB13
VCC+
#include "stm32f10x.h"	// 器件模块
#include "Delay.h" 		// 延时模块

// 蜂鸣器
int main(void)
{
	// 使能/失能APB2的外设时钟 -> 开启IO端口B时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	// 配置结构体参数
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;	// 通用推挽输出模式
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;			// PB12引脚
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	// 最大速度50MHz
	
	// 配置端口模式 -> 初始化GPIOB外设时钟
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	// 手表闹钟
	while(1)
	{
		GPIO_ResetBits(GPIOB, GPIO_Pin_12);	// 低电平:响
		Delay_ms(100);
		GPIO_SetBits(GPIOB, GPIO_Pin_12);
		Delay_ms(100);
		GPIO_ResetBits(GPIOB, GPIO_Pin_12);
		Delay_ms(100);
		GPIO_SetBits(GPIOB, GPIO_Pin_12);
		Delay_ms(700);
	}
}

请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

可视化工具选择指南:助力企业数字化转型和新质生产力发展

随着信息技术的快速发展和新质生产力概念的兴起,可视化工具在各个行业中的作用日益凸显。这些工具不仅能够帮助用户更直观地理解和分析数据,还能提升团队的协作效率和决策质量。 在当今数字化转型迅速发展的背景下,新质生产力的概念正在成为…

策略模式原理与C++实现

定义 定义一些列算法,把他们一个个封装起来,并且使他们可以相互替换(变化)。该模式使得算法可独立于使用它的客户程序(稳定)而变化(扩展、子类化)。 C实现 在不考虑策略模式的情况…

数学基础【俗说矩阵】:齐次线性方程和非齐次线性方程求解-学习笔记

一、矩阵基础知识 二元一次方程的传统解法 不论是代入消元法还是加减消元法都统称 【高斯消元法】。 齐次方程组和非齐次方程组 线性方程组的解 线性方程的向量展示 向量规则 矩阵的高斯消元和初等行变行及其规则 高斯消元规则 初等行变换 矩阵经初等行变换成阶梯矩阵&…

入坑树莓派(2)——树莓派4B与手机蓝牙通信

入坑树莓派(2)——树莓派4B与手机蓝牙通信 1、引言 在入坑树莓派(1)中已经搞掂了可视化问题。现在继续开展下一步,尝试与手机通信,一开始是想弄wifi连接的,但发现基于wifi的APP比较难弄,为了降低开发的难度,又因为树莓派板子自带蓝牙模块,所以直接选用蓝牙连接手机…

SAP 银企直连--FBPM生成付款文件增强

需求描述: SAP中通过运行事务码FBPM生成付款文件,触发传输将文件写入跳板机,写入跳板机之前,检查文件是否已存在,存在则给出提示无需执行 实现步骤 : 文件校验 参照标准函数FI_PAYMEDIUM_SAMPLE_21 创建自…

Vision Pro的增强视觉:企业级Unity插件包实现主摄像头访问

在AR和VR技术的快速发展中,Unity作为跨平台游戏和应用开发的首选引擎,其插件生态的丰富性一直是开发者们关注的焦点。最近,一个专为Vision Pro设计的Unity插件包——EnterpriseCameraAccessPlugin,因其能够通过企业API访问主摄像头的功能,引起了广泛关注。 一、插件背景与…

【学习笔记】无人机(UAV)在3GPP系统中的增强支持(二)-支持高分辨率视频直播应用

引言 本文是3GPP TR 22.829 V17.1.0技术报告,专注于无人机(UAV)在3GPP系统中的增强支持。文章提出了多个无人机应用场景,分析了相应的能力要求,并建议了新的服务级别要求和关键性能指标(KPIs)。…

[Linux] yum和vim

文章目录 yumyum是什么?linux系统(Centos)的生态 vimvim是什么?vim配置 yum yum是什么? yum是一个下载安装及卸载管理软件的客户端。类似如应用商店 linux系统(Centos)的生态 Centos下载方式3种:源代…

【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【26】【内网穿透】cpolar

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【27】【内网穿透】cpolar 内网穿透cpolar内网穿透联调配置练习—使用公网地址访问gulimall.com参考 内网穿透 正常的外网需要访问我们项目的流程是: 买服务器并且有公网固定…

Why can‘t I access GPT-4 models via API, although GPT-3.5 models work?

题意:为什么我无法通过API访问GPT-4模型,尽管GPT-3.5模型可以工作? 问题背景: Im able to use the gpt-3.5-turbo-0301 model to access the ChatGPT API, but not any of the gpt-4 models. Here is the code I am using to tes…

PyCharm在线版,一周使用总结!!!

前言 过去一周,对pycharm在线版进行了使用,对云原生开发工具有了全新的认识,云原生开发是一种现代化的软件开发和部署方法,它充分利用了云计算的优势,特别是容器化、微服务、持续集成/持续部署(CI/CD&…

数据结构之线性表表示集合详解与示例(C,C#,C++)

文章目录 基本特征线性表的特点:线性表的表示方法:C、C#和C语言如何实现一个线性表表示集合1. C实现2. C#实现3. C实现 总结 线性表是计算机数据结构中的一个基本概念,它是一种最简单的抽象数据类型。在线性表中,数据元素之间的关…

如何在SpringCloud中使用Kafka Streams实现实时数据处理

使用Kafka Streams在Spring Cloud中实现实时数据处理可以帮助我们构建可扩展、高性能的实时数据处理应用。Kafka Streams是一个基于Kafka的流处理库,它可以用来处理流式数据,进行流式计算和转换操作。 下面将介绍如何在Spring Cloud中使用Kafka Streams实…

【AI绘画教程】Stable Diffusion 1.5 vs 2

在本文中,我们将总结稳定扩散 1 与稳定扩散 2 辩论中的所有要点。我们将在第一部分中查看这些差异存在的实际原因,但如果您想直接了解实际差异,您可以跳下否定提示部分。让我们开始吧! Stable Diffusion 2.1 发布与1.5相比,2.1旨在解决2.0的许多相对缺点。本文的内容与理解…

LabVIEW机器学习实现外观检测

介绍如何利用LabVIEW平台结合机器学习技术实现对被测样品的外观检测。详细说明了硬件选择、算法使用、操作步骤以及注意事项。 硬件选择 工业相机:高分辨率工业相机(如Basler、FLIR等)用于采集样品的图像。 照明设备:均匀的LED照…

C++深度解析教程笔记9-静态成员变量,静态成员函数,二阶构造,友元,函数重载,操作符重载

C深度解析教程笔记9 第25课 - 类的静态成员变量实验-数对象个数(失败)实验-静态变量小结 第26课 - 类的静态成员函数实验-修改对象的静态变量数值实验-利用静态成员函数实验-静态变量静态函数实现统计对象个数小结 第27课 - 二阶构造模式实验-初始化是否…

高翔【自动驾驶与机器人中的SLAM技术】学习笔记(二)——带着问题的学习;一刷感受;环境搭建

按照作者在读者寄语中的说法:我们得榨干这本书的知识。 带着问题 为了更好的学习,我们最好带着问题去探索。 第一:核心问题与基础知识 如上图:这本书介绍了SLAM相关的核心问题和基础知识。王谷博士给我们做了梳理:…

redis登录缓存

1.pom.xml中引入redis依赖 <!-- Redis依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency> 2.将登录成功的token存储到redis中 if(Md5…

Vue和Element UI 路由跳转

在Vue.js中&#xff0c;使用Vue Router可以方便地实现页面之间的路由跳转。Element UI是一个基于Vue 2.0的桌面端组件库&#xff0c;它本身并不直接提供路由跳转的功能&#xff0c;但你可以在使用Element UI的Vue项目中结合Vue Router来实现这一功能。 以下是一个基于Vue和Ele…

文心一言:如何备考软考架构师

提问&#xff1a;软考高级:架构师指导&#xff0c;有哪些考点、重点考点有哪些&#xff1f;需要如何备考&#xff1f;案例分析题如何做&#xff1f;论文如何写&#xff1f; 文心一言回答1700字如下&#xff1a; 针对软考高级架构师的考试&#xff0c;以下是对考点、重点考点、备…