普中STM32F103ZET6开发攻略(一)

article/2025/6/22 21:37:19

各位看官老爷们,点击关注不迷路哟。你的点赞、收藏,一键三连,是我持续更新的动力哟!!!

目录

普中STM32F103ZET6开发攻略

1. GPIO端口实验——点亮LED灯

1.1 实验目的

1.2 实验原理

1.3 实验环境和器材:

1.4 实验思路

1.5 实验代码

1.5.1 LED相关代码

1.5.2 delay相关代码

1.6 实验思考和拓展

1.6.1 如何调整LED灯的闪烁频率?

1.6.2 如何实现呼吸灯效果?

1.6.2.1 非 PWM 实现呼吸灯的原理

1.6.2.2 具体实现方法(以 STM32 为例)

1. 亮度等级划分

2. 控制亮灭时间比例

1.6.2.3 代码实例:

1.6.3 除了使用简单延时外,STM32还有哪些更加精准的延时方式?

1.7 注意事项


普中STM32F103ZET6开发攻略

1. GPIO端口实验——点亮LED灯

1.1 实验目的

  1. 了解STM32F10x微控制器的GPIO口结构和基本操作

  1. 掌握STM32标准库函数对GPIO的配置和使用方法

  1. 学会使用GPIO控制LED的亮灭,实现LED基本显示效果

  1. 掌握简单延时函数的编写方法

1.2 实验原理

  1. GPIO原理

    STM32的GPIO(通用输入/输出端口)用于外设信号的输入输出控制。STM32F10x系列GPIO具有以下特性:

    (1) 每个I/O端口有16个可独立配置的I/O位

    (2) 支持8种不同的工作模式

    模式分类具体模式核心特点典型应用
    输入模式浮空输入无内部上下拉,电平由外部决定外部信号采集(需外部上下拉)
    上拉输入内部上拉,默认高电平按键输入(低电平有效)
    下拉输入内部下拉,默认低电平按键输入(高电平有效)
    模拟输入连接 ADC,禁用数字输入功能ADC 模数转换
    输出模式开漏输出需外部上拉,支持线与逻辑I2C 总线、电平转换
    推挽输出直接输出高低电平,驱动能力强LED 控制、普通数字信号
    开漏复用功能外设驱动,需外部上拉SPI/I2C 外设输出
    推挽复用功能外设驱动,直接输出高低电平USART/CAN 外设输出

    通过配置 GPIO 的模式寄存器(CRL/CRH)和输出类型寄存器,可灵活选择上述工作模式,满足不同外设的控制需求。

    (3) 每个I/O口可以产生外部中断

    (4) 位设置/复位寄存器,支持原子位操作

  2. LED控制原理

    LED (发光二极管) 是一种单向导电器件,只有在正向偏置时才会发光。根据开发板硬件设计,LED灯通常采用如下接法:

    (1) 共阳极接法:LED阳极接VCC,阴极接单片机GPIO,GPIO输出低电平时LED点亮;

    (2) 共阴极接法:LED阴极接地,阳极接单片机GPIO,GPIO输出高电平时LED点亮;

    本实验中,LED灯采用的是共阳极接法。

1.3 实验环境和器材:

  1. 电脑:Keil5+Vstudio

  2. 硬件资源:普中玄武F103开发板(主控芯片:STM32F103ZET6

1.4 实验思路

硬件接线图如下所示:

由上图可知:

  1. DS0即LED0、DS1即LED1,分别连接着:PB5和PE5

    LED0连接到GPIOB的Pin5引脚,LED1连接到GPIOE的Pin5引脚

  2. 为了完成实验目的:

    我们需要再项目工程中新建两个“库函数”:LED.c+delay.c

1.5 实验代码

1.5.1 LED相关代码

头文件:

//led.h
#ifndef _led_H
#define _led_H
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"  // 包含GPIO相关的函数和宏定义
#include "stm32f10x_rcc.h"   // 包含RCC(时钟控制)相关的函数和宏定义
void LED_init(void); 
void LED0_On(void);
void LED0_Off(void);
void LED1_On(void);
void LED1_Off(void);
void LED0_Toggle(void);
void LED1_Toggle(void);
#endif
​

源文件:

//led.c
#include "led.h"
​
void LED_init(void)
{// 使能 GPIOB 和 GPIOE 的时钟(几乎所有外设(包括 GPIO)在使用前都需要先使能对应的时钟)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOE, ENABLE);
​GPIO_InitTypeDef GPIO_InitStructure;
​// 配置 PB5 为推挽输出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);
​// 配置 PE5 为推挽输出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;GPIO_Init(GPIOE, &GPIO_InitStructure);
​// 初始状态GPIO_SetBits(GPIOB, GPIO_Pin_5);GPIO_SetBits(GPIOE, GPIO_Pin_5);
}
​
​
void LED0_On(void) {GPIO_ResetBits(GPIOB, GPIO_Pin_5);
}
void LED0_Off(void){GPIO_SetBits(GPIOB, GPIO_Pin_5);
}
void LED1_On(void) {GPIO_ResetBits(GPIOE, GPIO_Pin_5);
}
void LED1_Off(void) {GPIO_SetBits(GPIOE, GPIO_Pin_5);
}
void LED0_Toggle(void) {GPIOB->ODR ^= GPIO_Pin_5;
}
void LED1_Toggle(void) {GPIOE->ODR ^= GPIO_Pin_5;
}
​

因为我们这里是直接输出高低电平:所以采用的是推挽输出的方式,由上文可知:推完输出直接输出高低电平,驱动能力强。

初始状态需要设置成为高电平,由上文中的硬件接线图可知,LED(发光二极管)是在正向偏置时才会发光,所以应该是“低电平有效

1.5.2 delay相关代码

头文件:

#ifndef __DELAY_H
#define __DELAY_H
​
#include "stm32f10x.h"
​
void Delay_Init(void);
void Delay_ms(u32 nms);
​
#endif
​

源文件:

#include "delay.h"
​
static u32 fac_ms = 0;
​
void Delay_Init(void)
{SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); // HCLK/8fac_ms = SystemCoreClock / 8000;
}
​
void Delay_ms(u32 nms)
{u32 temp;SysTick->LOAD = nms * fac_ms;SysTick->VAL = 0x00;SysTick->CTRL = 0x01;do{temp = SysTick->CTRL;} while ((temp & 0x01) && !(temp & (1 << 16)));SysTick->CTRL = 0x00;SysTick->VAL = 0X00;
}
​

1.6 实验思考和拓展

1.6.1 如何调整LED灯的闪烁频率?

LED灯闪烁的频率,归根结底还是由灯光的亮和灭时间间隔决定的,亮和灭的时间间隔越小,那么频率就越高

实现方法:

  1. 使用定时器实现精确延时

    若使用自定义简单延时函数(如void Delay_ms(uint32_t ms)),直接调整传入的延时参数。 :原闪烁周期为 0.6 秒(亮 0.3 秒 + 灭 0.3 秒),若改为亮 0.1 秒 + 灭 0.1 秒,则周期变为 0.2 秒,频率提高 3 倍。

    // 原代码(周期0.6秒)
    LED0_ON();  // 亮
    Delay_ms(300);
    LED0_OFF(); // 灭
    Delay_ms(300);
    ​
    // 调整后(周期0.2秒)
    LED0_ON();
    Delay_ms(100);
    Delay_ms(100);
  2. 使用定时器实现精确延时

    简单延时函数依赖系统时钟和循环次数,可通过计算循环次数与时钟周期的关系提高精度。 :若系统时钟为 72MHz,一个循环约耗时 1 微秒,则延时 1 毫秒需循环 1000 次。

  3. 使用定时器实现精确延时:

    利用 STM32 的定时器(如 TIM2、TIM3)产生精确中断,通过中断计数实现延时,避免 CPU 空转,提升系统效率。 步骤: ① 初始化定时器,配置为定时中断模式(如定时 1 毫秒); ② 在中断服务函数中维护一个全局计数器; ③ 主函数中通过判断计数器值实现延时。

1.6.2 如何实现呼吸灯效果?

方法:软件模拟渐变效果

1.6.2.1 非 PWM 实现呼吸灯的原理

呼吸灯的本质是让人眼感知到 LED 亮度的线性渐变(从暗到亮或从亮到暗)。人眼对亮度的感知具有惰性,当 LED 在极短时间内(如几毫秒)频繁亮灭时,会将亮灭时间的平均值视为 “亮度”。因此,即使不使用硬件 PWM,也可以通过软件控制 LED 的亮灭占空比(即导通时间与周期的比例),逐步改变占空比来模拟亮度变化。

1.6.2.2 具体实现方法(以 STM32 为例)

LED 为共阳极接法(低电平点亮),通过以下步骤实现亮度渐变:

1. 亮度等级划分

将亮度从 0%(全灭)到 100%(最亮)划分为若干等级(如 256 级),用一个变量(如brightness)表示当前等级(范围:0~255)。

  • brightness=0:LED 全灭(高电平)。

  • brightness=255:LED 全亮(低电平)。

2. 控制亮灭时间比例

每个亮度等级对应一个周期总时间(如 10ms),其中:

  • 点亮时间 = (brightness / 255) × 周期总时间

  • 熄灭时间 = 周期总时间 - 点亮时间

通过循环改变brightness的值(如从 0 逐渐增加到 255,再逐渐减小到 0),并在每个等级中控制 LED 的亮灭时间,即可实现渐变效果。

1.6.2.3 代码实例:
// 定义LED引脚(共阳极,低电平点亮)
#define LED_GPIO_PORT GPIOB
#define LED_PIN GPIO_Pin_5
​
// 亮度等级(0~255)
uint8_t brightness = 0;
uint8_t direction = 1; // 1表示亮度增加,-1表示亮度减少
​
void breathe_led(void) {// 亮度渐变方向控制(到达边界时反转方向)if (brightness == 255) direction = -1;if (brightness == 0) direction = 1;brightness += direction;
​// 计算亮灭时间(周期总时间设为10ms,可调整)uint16_t on_time = (brightness * 10) / 255; // 点亮时间(ms)uint16_t off_time = 10 - on_time; // 熄灭时间(ms)
​// 控制LED点亮GPIO_ResetBits(LED_GPIO_PORT, LED_PIN); // 低电平点亮delay_ms(on_time); // 点亮持续时间
​// 控制LED熄灭GPIO_SetBits(LED_GPIO_PORT, LED_PIN); // 高电平熄灭delay_ms(off_time); // 熄灭持续时间
}
​
// 主循环中调用
while (1) {breathe_led();
}

与 PWM 方案的对比

特性非 PWM 软件模拟硬件 PWM
实现复杂度需编写循环逻辑和延时函数,代码较繁琐直接配置定时器 PWM 模式,代码简洁
CPU 占用率高(需实时控制亮灭时间,阻塞延时)低(定时器硬件自动更新占空比)
亮度平滑度受延时精度限制,可能有闪烁感平滑(硬件驱动,频率稳定)
适用场景简单实验、对实时性要求低的场合高要求场景(如电机调速、精密调光)

1.6.3 除了使用简单延时外,STM32还有哪些更加精准的延时方式?
  1. 定时器延时(精确且不阻塞 CPU)

    原理:利用定时器的计数功能,通过配置自动重装载值(TIMx_ARR)和预分频器(TIMx_PSC)设定定时时间,结合中断或查询方式实现延时。

    优点:精度高(可达微秒级),延时期间 CPU 可执行其他任务。

  2. SysTick 定时器延时(系统级延时)

    原理:利用 STM32 内部的 SysTick 定时器(系统滴答定时器),基于系统时钟(如 72MHz)产生精确中断。

    优点:无需额外外设,由 Cortex-M 内核直接支持,适合系统级延时。

  3. 实时操作系统(RTOS)任务调度

    原理:在 RTOS(如 FreeRTOS、uCOS)中,通过任务调度函数(如vTaskDelay())实现延时,本质是释放 CPU 资源给其他任务。

    优点:多任务并行处理,延时期间可执行其他任务,适合复杂系统。

  4. 总结与拓展

    1. 简单场景:优先使用 SysTick 或定时器查询方式,兼顾精度与代码复杂度。

    2. 复杂场景:引入 RTOS 或定时器中断,实现多任务协同和精确时序控制。

    3. 进阶实践:结合 DMA(直接内存访问)与定时器,实现无 CPU 参与的自动 PWM 输出,进一步提升效率。

1.7 注意事项

(1) 使用标准库函数时,需要注意头文件的包含和依赖关系。

(2) 共阳极LED的控制逻辑:低电平点亮,高电平熄灭。

(3) 简单延时函数的精确度受系统时钟和编译优化的影响。

(4) GPIO操作前必须先使能对应的外设时钟。

文章有写的不当的地方,欢迎在评论区中指正修改。如果感觉文章实用对你有帮助,欢迎点赞收藏和关注,你的点赞关注就是我动力,大家一起学习进步。

有不懂的可以在评论区里提出来哟,博主看见后会及时回答的。


http://www.hkcw.cn/article/anjPlGJGhY.shtml

相关文章

Azure DevOps 管道部署系列之二IIS

本博客旨在提供如何使用 Azure DevOps YAML 管道部署到虚拟机上的 IIS 的实用指南。 开始之前,您需要做好以下准备: 您拥有要部署的服务器的访问权限以及 PowerShell 的管理员访问权限。您拥有要部署的远程服务器的互联网访问权限。您拥有在服务器上安装 .NET Core 托管包的…

Linux命令之ausearch命令

一、命令简介 ausearch 是 Linux 审计系统 (auditd) 中的一个实用工具,用于搜索审计日志中的事件。它是审计框架的重要组成部分,可以帮助系统管理员分析系统活动和安全事件。 二、使用示例 1、安装ausearch命令 Ubuntu系统安装ausearch命令,安装后启动服务。 root@testser…

2025山东CCPC题解

文章目录 L - StellaD - Distributed SystemI - Square PuzzleE - Greatest Common DivisorG - Assembly Line L - Stella 题目来源&#xff1a;L - Stella 解题思路 签到题&#xff0c;因为给出的字母不是按顺序&#xff0c;可以存起来赋其值&#xff0c;然后在比较。 代码…

复数三角不等式简介及 MATLAB 演示

复数三角不等式简介及 MATLAB 演示 1. 复数三角不等式简介 复数三角不等式&#xff08;Complex Triangle Inequality&#xff09;是复数的一种重要性质&#xff0c;它类似于普通的三角不等式&#xff0c;但适用于复数空间。具体来说&#xff0c;复数三角不等式可以描述复数之…

学术合作交流

想找志同道合的科研小伙伴&#xff01;研究方向包括&#xff1a;计算机视觉&#xff08;CV&#xff09;、人工智能&#xff08;AI&#xff09;、目标检测、行人重识别、行人搜索、虹膜识别等。欢迎具备扎实基础的本科、硕士及博士生加入&#xff0c;共同致力于高质量 SCI 期刊和…

2025-05-31 Python深度学习10——模型训练流程

文章目录 1 数据准备1.1 下载与预处理1.2 数据加载 2 模型构建2.1 自定义 CNN 模型2.2 GPU加速 3 训练配置3.1 损失函数3.2 优化器3.3 训练参数 4 训练循环4.1 训练模式 (model.train())4.2 评估模式 (model.eval()) 5 模型验证 本文环境&#xff1a; Pycharm 2025.1Python 3.1…

十五、STM32的TIM(六)(PWM驱动舵机)

介绍&#xff1a;本章节主要讲解如何在 STM32C8T6 上使用 PWM 驱动舵机。通过按键输入控制&#xff0c;输出以 PWM 信号调整舵机转动角度&#xff0c;从而实现对舵机的精准控制。 目录 一、接线图 二、相关参数的计算 三、相关代码的编写 四、程序现象 一、接线图 二、相关…

C语言指针完全指南:从入门到精通(上)

目录 一、内存和指针 1.1 指针的使用场景 二、指针变量和地址 2.1 取地址符(&) 2.2指针变量和解引用操作符(*) 2.2.1 指针变量 2.3 指针变量的大小 三、指针变量类型的意义 3.2 指针-整数 ​编辑 四、指针计算 五、const修饰指针 5.1 const修饰变量 1.2 const修饰…

Kafka数据怎么保障不丢失

在分布式消息系统中&#xff0c;数据不丢失是核心可靠性需求之一。Apache Kafka 通过生产者配置、副本机制、持久化策略、消费者偏移量管理等多层机制保障数据可靠性。以下从不同维度解析 Kafka 数据不丢失的核心策略&#xff0c;并附示意图辅助理解。 一、生产者端&#xff1a…

Win10秘笈:两种方式修改网卡物理地址(MAC)

Win10秘笈&#xff1a;两种方式修改网卡物理地址&#xff08;MAC&#xff09; 在修改之前&#xff0c;可以先确定一下要修改的网卡MAC地址&#xff0c;查询方法有很多种&#xff0c;比如&#xff1a; 1、在设置→网络和Internet→WLAN/以太网&#xff0c;如下图所示。 2、在控…

Angularjs-Hello

1 关于Angularjs 最近因为项目需要又要做这个&#xff0c;所以简单复习下。其实这个大概7&#xff0c;8年前就用过&#xff0c;当时做了几个简单页面觉得太简单就还是回去做嵌入式了。按照互联网技术的进化速度&#xff0c;本来以为早死在 沙滩上了&#xff0c;没想到现在还在坚…

红外遥控(外部中断)

目录 1.红外遥控简介 通信方式&#xff1a; 红外LED波长&#xff1a; 通信协议标准&#xff1a; 2.硬件电路 发送部分1&#xff1a; 内部元件介绍&#xff1a; 工作原理&#xff1a; 为什么要以38KHZ亮灭&#xff1f; 电路图&#xff1a; 发送部分2&#xff1a; 电…

leetcode hot100刷题日记——33.二叉树的层序遍历

解题总结二维vector的初始化方法 题目描述情况1&#xff1a;不确定行数和列数情况2&#xff1a;已知行数和列数情况3&#xff1a;已知行数但不知道列数情况4&#xff1a;已知列数但不知道行数 题目描述 解答&#xff1a;用队列 思路都差不多&#xff0c;我觉得对于我自己来说&a…

GitToolBox 插件安装与配置指南

GitToolBox 插件安装与配置指南 GitToolBox GitToolBox IntelliJ plugin 项目地址: https://gitcode.com/gh_mirrors/gi/GitToolBox 1. 项目基础介绍和主要编程语言 项目基础介绍 GitToolBox 是一个专为 JetBrains 家族 IDE&#xff08;如 IntelliJ IDEA、PyCharm 等&…

开源模型应用落地-qwen模型小试-Qwen3-8B-推理加速-vLLM-结构化输出(三)

一、前言 在人工智能技术迅猛发展的今天,高效推理框架与强大语言模型的结合正不断突破应用边界。vLLM作为新一代高性能推理引擎,凭借其创新的PagedAttention技术和内存优化能力,为大规模语言模型部署提供了全新可能。 本文将聚焦vLLM框架与QWen3-8B这一国产开源大模型的深度…

史上最全 Git 图文教程(非常详细)零基础入门到精通,收藏这一篇就够了

戳上方蓝字“Java知音”关注我 Git安装 安装 1.先去官网下载这个软件, 准备安装到本电脑中 https://git-scm.com/ 2.根据自己电脑系统下载此软件到本机 Windows 系统直接下载 .exe 文件即可&#xff0c;macOS 系统使用 Homebrew 命令行安装&#xff0c;终端输入 git --versi…

GitHub学生认证申请

想要免费使用Copilot&#xff0c;申请学生认证可以免费使用。在申请过程中&#xff0c;踩了些坑。记录一下供大家参考 认证有效期 默认时长&#xff1a;首次认证成功后&#xff0c;学生权益&#xff08;如 GitHub Pro 权限和 Student Developer Pack&#xff09;的有效期一般为…

最新Spring Security实战教程(十五)快速集成 GitHub 与 Gitee 的社交登录

&#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Micro麦可乐的博客 &#x1f425;《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程&#xff0c;入门到实战 &#x1f33a;《RabbitMQ》…

Vue3 开源UI 框架推荐 (总有一款适合你)

一 、前言 &#x1f4a5;这篇文章主要推荐了支持 Vue3 的开源 UI 框架&#xff0c;包括 web 端和移动端的多个框架&#xff0c;如 Element-Plus、Ant Design Vue 等 web 端框架&#xff0c;以及 Vant、NutUI 等移动端框架&#xff0c;并分别介绍了它们的特性和资源地址。&#…

Java 版 Manus 实现来了,Spring AI Alibaba 发布开源 OpenManus 实现

大家好&#xff0c;我是玄姐。 此次官方发布的 Spring AI Alibaba OpenManus 实现&#xff0c;涵盖了完整的多智能体任务规划、思考与执行流程。这一版本专为 Java 开发者设计&#xff0c;能够让开发者亲身体验多智能体协同工作的强大效果。它具备根据用户问题进行深度分析、操…