基于寄存器&标准外设库的LED流水灯

前言

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或控制其他输出设备时,使用通用推挽输出模式是常见的选择,因为这种输出模式提供了许多优点:

  1. 高驱动能力:通用推挽输出模式能够提供较高的输出电流,可以驱动各种负载,包括LED、继电器、电机和其他外部设备。这意味着它能够轻松地控制不同类型的负载。

  2. 双向控制:通用推挽输出模式允许引脚的状态既能设为高电平又能设为低电平。这使得你可以轻松地在需要时点亮或熄灭LED,也可以控制其他双向负载。

  3. 抗干扰能力:通用推挽输出模式对于外部干扰(例如噪声)具有一定的抗干扰能力,因为它在高电平和低电平状态都有一个相对稳定的输出电压。

  4. 低功耗:与开漏输出模式相比,通用推挽输出模式通常在输出高电平时具有更低的功耗。这有助于在需要时节省电能。

  5. 多功能性:通用推挽输出模式可以用于多种用途,因此适用于多种应用场景,包括输入捕获、输出比较等。

④ 通过输出高低电平控制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 = 
基于寄存器实现LED流水灯控制,以STM32F103C8T6为例,主要步骤如下: ### 1. 了解芯片及相关原理 - **STM32F103C8T6简介**:这是一款常用的ARM Cortex-M3内核的微控制器,有丰富的外设资源,适合用于LED流水灯等实验开发[^1]。 - **地址映射**:将芯片上的各种存储器、外设等资源映射到特定的地址空间,通过访问这些地址来操作相应的硬件资源。 - **寄存器映射**:给每个寄存器分配一个特定的地址,通过对这些地址进行读写操作,就可以控制相应的硬件功能。 ### 2. GPIO端口初始化设置 #### 时钟配置 要使用GPIO端口控制LED,首先需要使能相应的GPIO端口时钟。不同的GPIO端口对应不同的时钟使能寄存器,例如要使能GPIOA端口时钟,需要操作RCC_APB2ENR寄存器。以下是示例代码: ```c // 使能GPIOA端口时钟 RCC->APB2ENR |= 0x00000004; // 0x00000004对应GPIOA的时钟使能位 ``` #### 输入输出模式输出速率设置 需要将连接LED的GPIO引脚配置为输出模式,并设置合适的输出速率。以GPIOA的第0引脚为例: ```c // 配置GPIOA的第0引脚为推挽输出,最大速度为50MHz GPIOA->CRL &= 0xFFFFFFF0; // 清除第0引脚的配置位 GPIOA->CRL |= 0x00000003; // 配置为推挽输出,最大速度50MHz ``` ### 3. 流水灯原理及实现 流水灯的原理是依次点亮连接在不同GPIO引脚上的LED,形成流动的效果。以下是一个简单的C语言实现示例: ```c #include "stm32f10x.h" // 延时函数 void delay(unsigned int time) { for (unsigned int i = 0; i < time; i++); } int main(void) { // 使能GPIOA端口时钟 RCC->APB2ENR |= 0x00000004; // 配置GPIOA的第0、1、2引脚为推挽输出,最大速度为50MHz GPIOA->CRL &= 0xFFFFF000; GPIOA->CRL |= 0x00000333; while (1) { // 点亮第0引脚的LED GPIOA->BSRR = 0x00000001; delay(1000000); // 熄灭第0引脚的LED GPIOA->BRR = 0x00000001; // 点亮第1引脚的LED GPIOA->BSRR = 0x00000002; delay(1000000); // 熄灭第1引脚的LED GPIOA->BRR = 0x00000002; // 点亮第2引脚的LED GPIOA->BSRR = 0x00000004; delay(1000000); // 熄灭第2引脚的LED GPIOA->BRR = 0x00000004; } } ``` ### 4. 烧录程序 将编写好的程序通过烧录工具(如ST-Link、J-Link等)烧录到STM32F103C8T6芯片中,即可看到LED流水灯的效果。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值