首页 > 其他分享 >7.用寄存器点亮LED

7.用寄存器点亮LED

时间:2024-07-23 14:54:29浏览次数:8  
标签:输出 LED 引脚 点亮 STM32 GPIOB 寄存器 GPIO

7. 用寄存器点亮LED

7.1 GPIO简介

GPIO是通用输入输出端口的简称,简单来说就是STM32可控制的引脚。通过将STM32芯片的GPIO引脚与外部设备连接,可以实现外部通信、控制以及数据采集的功能。STM32芯片的GPIO被分成很多组,每组有16个引脚。例如,STM32F103VET6的芯片有GPIOA至GPIOE共5组GPIO,100个引脚中GPIO占了一大部分。所有的GPIO引脚都有基本的输入输出功能。

最基本的输出功能是由STM32控制引脚输出高、低电平,实现开关控制。比如把GPIO引脚接入LED灯,就可以控制LED灯的亮灭;引脚接入继电器或三极管,就可以通过继电器或三极管控制外部大功率电路的通断。最基本的输入功能是检测外部输入电平,比如把GPIO引脚连接到按键,通过电平高低区分按键是否被按下。

7.2 GPIO框图剖析

通过GPIO硬件结构框图,可以从整体上深入了解GPIO外设及其各种应用模式。下面我们按图7-1中的编号对GPIO端口的结构部件进行说明。

7.2.1 基本结构分析
  1. 保护二极管及上、下拉电阻

    • 引脚的两个保护二极管可以防止引脚外部过高或过低的电压输入。当引脚电压高于VDD时,上方的二极管导通;当引脚电压低于VSS时,下方的二极管导通,防止不正常电压引入芯片导致芯片烧毁。尽管有这样的保护,并不意味着STM32的引脚能直接外接大功率驱动器件,如直接驱动电机。
  2. P-MOS管和N-MOS管

    • GPIO引脚线路经过两个保护二极管后,向上流向“输入模式”结构,向下流向“输出模式”结构。推挽输出模式由P-MOS和N-MOS管组成的单元电路实现。推挽输出的等效电路见图7-2。开漏输出模式时,上方的P-MOS管完全不工作。等效电路见图7-3。
    • 推挽输出模式一般应用在输出电平为0和3.3V且需要高速切换的场合。开漏输出一般应用在I2C、SMBUS通信等需要“线与”功能的总线电路中。
  3. 输出数据寄存器

    • 双MOS管结构的输入信号由GPIO输出数据寄存器GPIOx_ODR提供。通过修改输出数据寄存器的值,可以修改GPIO引脚的输出电平。
  4. 复用功能输出

    • 复用功能输出中的“复用”是指STM32的其他片上外设对GPIO引脚进行控制。比如使用USART串口通信时,可将GPIO引脚配置成USART串口复用功能。
  5. 输入数据寄存器

    • GPIO引脚经过内部的上、下拉电阻,可以配置成上/下拉输入,然后连接到肖特基触发器,信号经过触发器后转化为0、1的数字信号,存储在输入数据寄存器GPIOx_IDR中。
  6. 复用功能输入

    • 在复用功能输入模式时,GPIO引脚的信号传输到STM32的其他片上外设,由该外设读取引脚状态。
  7. 模拟输入输出

    • 当GPIO引脚用于ADC采集电压的输入通道时,用作模拟输入功能。类似地,当GPIO引脚用于DAC作为模拟电压输出通道时,作为模拟输出功能。
7.2.2 GPIO工作模式

GPIO可以配置成以下模式:

  1. 输入模式(模拟/浮空/上拉/下拉)

    • 在输入模式时,肖特基触发器打开,输出被禁止。输入模式可设置为上拉、下拉、浮空和模拟4种。
  2. 输出模式(推挽/开漏)

    • 在输出模式中,推挽模式时双MOS管轮流工作。开漏模式时,只有N-MOS管工作。输出速度可配置,有2MHz、10MHz、50MHz几种选项。
  3. 复用功能(推挽/开漏)

    • 在复用功能模式中,输出使能,输出速度可配置,可工作在开漏及推挽模式,输出信号源于其他外设。

通过对GPIO寄存器写入不同的参数,可以改变GPIO的工作模式。具体寄存器说明查阅《STM32F10X-中文参考手册》。

7.3 实验:使用寄存器点亮LED

7.3.1 硬件连接

在本书中STM32芯片与LED的连接如下图所示。这个RGB灯由红蓝绿3个小灯构成,使用PWM控制时可以混合成256种不同的颜色。

在这里插入图片描述

目标是将GPIO的引脚设置成推挽输出模式,并且默认下拉,输出低电平,使LED亮起来。

7.3.2 启动文件

启动文件startup_stm32f10x_hd.s用汇编语言写好了基本程序,当STM32芯片上电启动时,首先会执行汇编程序,建立起C语言的运行环境。该文件可以从ST固件库找到,并添加到工程中。

启动文件的主要功能如下:

  • 初始化堆栈指针SP。
  • 初始化程序计数器指针PC。
  • 设置堆、栈的大小。
  • 初始化中断向量表。
  • 配置外部SRAM作为数据存储器(由用户配置)。
  • 调用SystemInit()函数配置STM32的系统时钟。
  • 设置C库的分支入口“__main”。
7.3.3 stm32f10x.h文件

定义寄存器映射代码在stm32f10x.h文件中,见代码清单7-5。

#define GPIOB_BASE (0x40010C00)
#define RCC_BASE (0x40021000)

#define GPIOB_CRL (*((volatile unsigned long *)(GPIOB_BASE + 0x00)))
#define GPIOB_CRH (*((volatile unsigned long *)(GPIOB_BASE + 0x04)))
#define GPIOB_IDR (*((volatile unsigned long *)(GPIOB_BASE + 0x08)))
#define GPIOB_ODR (*((volatile unsigned long *)(GPIOB_BASE + 0x0C)))
#define GPIOB_BSRR (*((volatile unsigned long *)(GPIOB_BASE + 0x10)))
#define GPIOB_BRR (*((volatile unsigned long *)(GPIOB_BASE + 0x14)))

#define RCC_APB2ENR (*((volatile unsigned long *)(RCC_BASE + 0x18)))
7.3.4 main文件

在main文件中编写一个main函数,先定义一个空的SystemInit函数。

void SystemInit(void) {
    // 配置STM32的系统时钟
}

int main(void) {
    // 主程序
    return 0;
}
1. GPIO模式

将连接到LED的GPIO引脚PB0配置成输出模式,具体见代码清单7-7。

// 清除GPIOB0位的配置
GPIOB_CRL &= ~(0xF << 0);
// 设置GPIOB0为推挽输出,10MHz速度
GPIOB_CRL |= (0x1 << 0);
2. 控制引脚输出电平

操作ODR寄存器控制GPIO的电平,见代码清单7-8。

// 设置GPIOB0输出低电平
GPIOB_ODR &= ~(0x1 << 0);
// 设置GPIOB0输出高电平
GPIOB_ODR |= (0x1 << 0);
3. 开启外设时钟

所有GPIO都挂载到APB2总线上,具体时钟由APB2外设时钟使能寄存器(RCC_APB2ENR)控制,见代码清单7-9。

// 使能GPIOB的时钟
RCC_APB2ENR |= (1 << 3);
4. 完整代码

完整的程序代码如下:

#include "stm32f10x.h"

// 初始化系统时钟
void SystemInit(void) {
    // 配置STM32的系统时钟


}

int main(void) {
    // 使能GPIOB的时钟
    RCC_APB2ENR |= (1 << 3);

    // 清除GPIOB0位的配置
    GPIOB_CRL &= ~(0xF << 0);
    // 设置GPIOB0为推挽输出,10MHz速度
    GPIOB_CRL |= (0x1 << 0);

    // 设置GPIOB0输出低电平
    GPIOB_ODR &= ~(0x1 << 0);

    while (1) {
        // 循环点亮LED
    }

    return 0;
}

7.3.5 下载验证

把编译好的程序下载到开发板并复位,可以看到板子上的LED被点亮。

至此,通过寄存器控制点亮LED的实验成功完成。

标签:输出,LED,引脚,点亮,STM32,GPIOB,寄存器,GPIO
From: https://blog.csdn.net/weixin_43905308/article/details/140633742

相关文章

  • pymobiledevice3:如果没有抽象方法“_create_service_connection”的实现,则无法实例化
    全面披露:我不知道我在做什么。我没有编程经验。我已要求ChatGPT为我创建一个程序。ChatGPT为我创建的文件之一名为“device_detection.py”。这个特定文件应该检测通过USB端口连接到我的笔记本电脑的智能手机设备,然后在终端中打印结果。如果这就是我所需要的,那就太好了(并且......
  • ✨分享心得,点亮信心✨两个月前端基础+半个月实践能做什么
    Hello,小伙伴大家好,我是小VIE,一名学习前端时长两月半的前端萌新(ノ◡◝)这次主要是分享我在前端两个月的学习过程心得和半个月的实践成果,希望无论是准备秋招的同学,还是日常中学习、工作、求职的小伙伴都能得到一些信心!如果你想直接知道能做什么?那么我半个月的实践成果,也许可以......
  • 零基础学STM32(二)-新建工程(点亮一个LED灯)
    本项目讲解所用工程均使用stm32f103C8T6芯片HAL库版本。STM32f103参考文档:https://pan.baidu.com/s/1JEtJMZmqU5gk4Nbupe1Apg?pwd=8888CubeMX简介CubeMX是STMicroelectronics(意法半导体)提供的一款免费的配置和初始化工具,用于其STM32微控制器系列。这个工具可以帮助开发者轻......
  • AP9235B dc-dc升压恒流电源驱动IC 2.8-30V 输出电流2A SOT23-6 白光LED驱动方案
    概述 AP9235B系列是一款固定振荡频率、恒流输出的升压型DC/DC转换器,非常适合于移动电话、PDA、数码相机等电子产品的背光驱动。输出电压可达30V,3.2V输入电压可以驱动六个串联LED,2.5V输入电压可以驱动两路并联LED(每路串联三个LED)。通过改变CE脚上PWM信号的占空比可以控制LED的......
  • ScaleDet:AWS 基于标签相似性提出可扩展的多数据集目标检测器 | CVPR 2023
    论文提出了一种可扩展的多数据集目标检测器(ScaleDet),可通过增加训练数据集来扩大其跨数据集的泛化能力。与现有的主要依靠手动重新标记或复杂的优化来统一跨数据集标签的多数据集学习器不同,论文引入简单且可扩展的公式来为多数据集训练产生语义统一的标签空间,通过视觉文本对齐进......
  • SPI通信----STM32C8T6+RC522刷卡+0.96寸OLED显示
    1.项目涉及的知识点1.SPI通信在RC522上的刷卡应用2.操作STM32内部FLASH3.IIC在OLED上显示数据的应用4.串口编程及其应用2.STM32与各个模块的管脚接线STM32管脚模块管脚3V3或者5V串口3V3或者5VPA9串口1的RXDPA10串口1的TXDGND串口GND3V3或者5V0.96寸OLED屏的3V3或者5VPB60.96......
  • 记录 OpenWrt 执行 opkg update 命令报错 Failed to download,但是换源无效且源用浏览
    记录OpenWrt执行opkgupdate命令报错Failedtodownload,但是换源无效且源用浏览器可访问的解决方案解决方法首先给出解决方法:)网络-->接口-->WAN-->编辑-->高级设置取消勾选“自动获取DNS服务器”-->在使用自定义的DNS服务器一栏中添加并输入可用的DNS地址。......
  • ChatRule: Mining Logical Rules with Large Language Models for Knowledge Graph Re
    文章目录题目摘要引言方法实验消融研究题目ChatRule:利用大型语言模型挖掘逻辑规则进行知识图推理论文地址:https://arxiv.org/abs/2309.01538摘要    逻辑规则对于揭示关系之间的逻辑联系至关重要,这可以提高推理性能并在知识图谱(KG)上提供可解释的结果。尽......
  • 0.96寸 30pin OLED简介(芯片为SSD1306)
    基本简介OLED屏的特点:1. 模块有单色和双色可选,单色为纯蓝色,双色为黄蓝双色;2. 显示尺寸为0.96寸3. 分辨率为128*644. 多种接口方式,该模块提供了总共5种接口包括:6800、8080两种并行接口方式、3线或4线的SPI接口,IIC接口方式......
  • Error: Assertion failed (nimages > 0) in cv::calibrateCameraRO, file D:\opencv4
    报错信息:Error:Assertionfailed(nimages>0)incv::calibrateCameraRO,fileD:\opencv4\opencv\opencv-4.1.0\modules\calib3d\src\calibration.cpp,line3691  原因:①图片路径问题,没有指向包含棋盘格的图片②图片中不包含棋盘格或者图片模糊等问题,导致查找棋盘......