前言
1. 确定实现LED流水灯代码的逻辑
需要的功能有:
① 点亮与熄灭流水灯–实验的首要功能
② 计时器–用于以时间控制led效果
2. 准备工作
① LED灯珠
② STM32电路板
本次选择STM32F103C8T6
③ 标准外设库
④ 选择控制的引脚:本次选择A10,B5以及C13引脚
3. 算法思路
① 设计延时函数
延时函数,用于以秒为单位进行延时
② 启用GPIO的时钟:
在STM32微控制器中,每个GPIO端口都有对应的时钟使能位,需要启用相应的GPIO端口时钟才能进行配置和控制。GPIOA、GPIOB、和GPIOC分别对应不同的GPIO端口。
这是因为时钟管理是微控制器内部各个模块的重要组成部分,它可以用来控制不同模块的运行时钟。通过启用相应的GPIO端口时钟,你允许这些GPIO端口正常工作,并可以进行配置和控制。
具体来说,通过启用GPIO端口的时钟,你可以:
配置GPIO引脚的工作模式(比如输入、输出、复用功能等)。
控制GPIO引脚的电平状态(点亮LED、控制外部设备)。
使用GPIO引脚来连接外部电路或器件,如传感器、开关等。
监控GPIO引脚的输入状态,以获取外部信息。
因此,启用GPIO端口的时钟是确保你可以正确配置和使用微控制器的GPIO引脚的重要步骤。启用GPIOA、GPIOB和GPIOC端口的时钟,使它们可用于配置和控制对应的A10,B5,C13引脚
③配置引脚为通用推挽输出
GPIO支持4种输入模式(浮空输入、上拉输入、下拉输入、模拟输入)和4种输出模式(开漏输出、开漏复用输出、推挽输出、推挽复用输出)。同时,GPIO还支持三种最大翻转速度(2MHz、10MHz、50MHz)。
每个I/O口可以自由编程,但I/O口寄存器必须按32位字被访问。
1.GPIO_Mode_AIN 模拟输入
模拟输入模式下,I/O端口的模拟信号(电压信号,而非电平信号)直接模拟输入到片上外设模块,比如ADC模块等等
2.GPIO_Mode_IN_FLOATING 浮空输入
浮空输入模式下,I/O端口的电平信号直接进入输入数据寄存器。也就是说,I/O的电平状态是不确定的,完全由外部输入决定;如果在该引脚悬空(在无信号输入)的情况下,读取该端口的电平是不确定的
3.GPIO_Mode_IPD 下拉输入
下拉输入模式下,I/O端口的电平信号直接进入输入数据寄存器。但是在I/O端口悬空(在无信号输入)的情况下,输入端的电平可以保持在低电平;并且在I/O端口输入为高电平的时候,输入端的电平也还是高电平
4.GPIO_Mode_IPU 上拉输入
上拉输入模式下,I/O端口的电平信号直接进入输入数据寄存器。但是在I/O端口悬空(在无信号输入)的情况下,输入端的电平可以保持在高电平;并且在I/O端口输入为低电平的时候,输入端的电平也还是低电平
5.GPIO_Mode_Out_OD 开漏输出
开漏输出模式下,通过设置位设置/清除寄存器或者输出数据寄存器的值,途经N-MOS管,最终输出到I/O端口。这里要注意N-MOS管,当设置输出的值为高电平的时候,N-MOS管处于关闭状态,此时I/O端口的电平就不会由输出的高低电平决定,而是由I/O端口外部的上拉或者下拉决定;当设置输出的值为低电平的时候,N-MOS管处于开启状态,此时I/O端口的电平就是低电平。同时,I/O端口的电平也可以通过输入电路进行读取;注意,I/O端口的电平不一定是输出的电平
6.GPIO_Mode_Out_PP 推挽输出
推挽输出模式下,通过设置位设置/清除寄存器或者输出数据寄存器的值,途经P-MOS管和N-MOS管,最终输出到I/O端口。这里要注意P-MOS管和N-MOS管,当设置输出的值为高电平的时候,P-MOS管处于开启状态,N-MOS管处于关闭状态,此时I/O端口的电平就由P-MOS管决定:高电平;当设置输出的值为低电平的时候,P-MOS管处于关闭状态,N-MOS管处于开启状态,此时I/O端口的电平就由N-MOS管决定:低电平。同时,I/O端口的电平也可以通过输入电路进行读取;注意,此时I/O端口的电平一定是输出的电平
7.GPIO_Mode_AF_OD 复用开漏输出
开漏复用输出模式,与开漏输出模式很是类似。只是输出的高低电平的来源,不是让CPU直接写输出数据寄存器,取而代之利用片上外设模块的复用功能输出来决定的
8.GPIO_Mode_AF_PP 复用推挽输出
推挽复用输出模式,与推挽输出模式很是类似。只是输出的高低电平的来源,不是让CPU直接写输出数据寄存器,取而代之利用片上外设模块的复用功能输出来决定的
Q:为何要设置为推挽输出模式?
点亮LED或控制其他输出设备时,使用通用推挽输出模式是常见的选择,因为这种输出模式提供了许多优点:
-
高驱动能力:通用推挽输出模式能够提供较高的输出电流,可以驱动各种负载,包括LED、继电器、电机和其他外部设备。这意味着它能够轻松地控制不同类型的负载。
-
双向控制:通用推挽输出模式允许引脚的状态既能设为高电平又能设为低电平。这使得你可以轻松地在需要时点亮或熄灭LED,也可以控制其他双向负载。
-
抗干扰能力:通用推挽输出模式对于外部干扰(例如噪声)具有一定的抗干扰能力,因为它在高电平和低电平状态都有一个相对稳定的输出电压。
-
低功耗:与开漏输出模式相比,通用推挽输出模式通常在输出高电平时具有更低的功耗。这有助于在需要时节省电能。
-
多功能性:通用推挽输出模式可以用于多种用途,因此适用于多种应用场景,包括输入捕获、输出比较等。
④ 通过输出高低电平控制LED
电平(Voltage Level)是指电压的状态,通常用于描述数字电路中的信号状态。在数字电路中,通常有两个电平,即高电平(High Level)和低电平(Low Level)。
高电平:通常表示为逻辑1或者是高电压状态,它对应于正电压,通常表示为“1”或“真”。
低电平:通常表示为逻辑0或者是低电压状态,它对应于负电压,通常表示为“0”或“假”。
在数字电路中,通过电压的高低电平来表示和传递信息。例如,通常情况下,LED(Light Emitting Diode,发光二极管)的亮灭状态与控制它的引脚的电平有关。LED通常需要连接到电源(高电平)和地(低电平)来工作,因此控制引脚的高低电平就能控制LED的亮灭。
具体来说,LED是一种半导体器件,当它的两端之间施加电压时,会发光。LED通常是双向极性器件,其中一个引脚是阳极(Anode),另一个引脚是阴极(Cathode)。通过将阳极连接到高电平(正电压)而将阴极连接到低电平(地或负电压),电流会在LED中流动,激活LED并导致其发光。
因此,通过控制连接LED的引脚的高低电平,你可以实现LED的亮灭控制。当引脚处于高电平时,LED亮;当引脚处于低电平时,LED灭。这是数字电路中基本的亮灭控制原理。当然,使灯亮是高电平还是低电平,需要看具体的线路,下文会提到。
一、 基于寄存器点亮LED流水灯
1.创建工程
新建工程

选择对应型号

勾选

新建main.c


添加到Source Group1

2. 编写代码
Ⅰ 代码
先上代码再解释:
#include "stm32f10x.h"
void SysTick_Handler(void) {
// 什么也不做,只是为了满足SysTick中断的要求
}
void delay_s(uint32_t s) {
// 配置SysTick定时器为1毫秒滴答
SysTick_Config(SystemCoreClock / 1000);
// 计算所需的滴答数
uint32_t ticks = s * 1000;
while (ticks) {
if (SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) {
// 如果SysTick倒计时到0
ticks--;
}
}
// 关闭SysTick定时器
SysTick->CTRL =

最低0.47元/天 解锁文章
548





