0 卖盘信息
BOM询价
您现在的位置: 首页 > 技术方案 >LED应用 > 基于STM32F103C8T8寄存器方式点亮led灯设计方案

基于STM32F103C8T8寄存器方式点亮led灯设计方案

来源:
2025-07-23
类别:LED应用
eye 1
文章创建人 拍明芯城

基于STM32F103C8T6寄存器方式点亮LED灯设计方案


在本设计方案中,我们将深入探讨如何利用 STM32F103C8T6 微控制器,以寄存器操作这一底层且高效的方式,实现 LED 灯的稳定点亮。这种方法不仅能够让我们对微控制器的硬件操作有更深刻的理解,也能在资源受限或对性能有极致要求的应用中发挥其独特优势。我们将详细分析系统的各个组成部分,从核心的微控制器选择,到辅助电路中的阻容元件、连接器,甚至是电源管理方案,都将进行详尽的阐述,并剖析其选型理由与功能特性,力求构建一个稳定、可靠且易于扩展的实验平台。通过对每一个元器件的精挑细选和功能解析,我们旨在为读者提供一个全面且深入的学习路径,使其不仅能够成功实现 LED 点亮,更能对嵌入式系统开发有一个系统性的认知。

image.png

核心微控制器选型:STM32F103C8T6的卓越性能与广泛适用性


选择 STM32F103C8T6 作为本次设计的核心微控制器,是基于其在性能、成本、易用性和生态系统成熟度方面的综合考量。STM32F103C8T6 属于意法半导体(STMicroelectronics)推出的 STM32F103“增强型”系列微控制器,它搭载了业界标准的 ARM Cortex-M3 内核,这款 32 位 RISC 处理器在嵌入式领域拥有极高的声誉,其工作频率最高可达 72MHz,提供了充裕的计算能力,足以应对大多数通用嵌入式应用,包括本次的 LED 控制任务以及未来可能扩展的更复杂功能。Cortex-M3 内核内置了 Thumb-2 指令集,这使得它能够在保持高性能的同时,有效降低代码密度,从而减少程序存储空间的需求。STM32F103C8T6 集成了 64KB 的 Flash 存储器用于程序代码存储,以及 20KB 的 SRAM 用于数据存储和运行时变量,对于本次简单的 LED 项目来说绰绰有余,甚至为后续功能的迭代和扩展预留了充足空间。Flash 存储器允许程序在断电后保持不变,而 SRAM 则提供高速的数据读写能力,确保程序执行效率。

该型号微控制器还拥有丰富的外设接口,例如多个通用定时器(Timer)、SPI、I2C、USART(串口)、USB、CAN 总线以及 ADC(模数转换器)等,这些外设极大地扩展了 STM32F103C8T6 的应用范围。特别是其多达 37 个快速 I/O 端口,这些端口可以配置为通用输入/输出(GPIO)、复用功能(如连接外设)或模拟输入,为我们点亮 LED 提供了灵活的选择。每个 GPIO 引脚都具备独立的配置寄存器,可以独立设置其工作模式(输入、输出、模拟、浮空、上拉、下拉等)和输出速度,这正是我们通过寄存器方式控制 LED 的基础。此外,STM32F103C8T6 的供电电压范围宽广,通常为 2.0V 至 3.6V,这使得它能够兼容多种电源方案,增加了设计的灵活性。封装方面,C8T6 通常采用 LQFP48 封装,这是一种表面贴装技术(SMT)封装,引脚间距适中,便于手工焊接调试,也适用于批量生产,在业余爱好者和教育领域以及工业应用中都非常流行。STM32 系列微控制器拥有非常完善的开发生态系统,包括 ST 官方提供的 STM32CubeIDE、HAL 库、标准外设库以及大量的例程和技术文档,社区支持也异常活跃,这为开发者提供了极大的便利。尽管本次设计采用寄存器方式,但成熟的生态系统依然能够提供丰富的参考资料和问题解决方案。


电源管理与稳定:保证微控制器正常运行的基础


电源是任何电子系统的生命线,对于微控制器而言,稳定且纯净的电源至关重要。STM32F103C8T6 的核心供电电压通常为 3.3V。为了确保微控制器能够稳定工作,并避免因电源波动或噪声引起的异常行为,我们需要精心设计电源电路。


电源输入接口:Micro USB接口或DC电源座


考虑到实验和调试的便利性,我们通常会选择 Micro USB 接口 或者 DC 电源座 作为电源输入。Micro USB 接口的优势在于其普及性,可以使用手机充电器或电脑 USB 端口直接供电,无需额外购买专用电源适配器,大大降低了使用的门槛。标准 USB 端口通常提供 5V 电压,电流输出能力至少为 500mA,足以满足 STM32F103C8T6 和单个 LED 的功耗需求。如果选择 DC 电源座,其优点在于可以连接更大电流的电源适配器,为未来的扩展预留空间,但需要用户额外准备一个适配器。出于便利性考虑,我们本次设计倾向于采用 Micro USB 接口,它不仅能提供电源,还能在某些开发板上兼作串口通信接口,进一步简化了设计。其选择理由是普遍性、便捷性、低成本。


稳压芯片:AMS1117-3.3线性稳压器


由于 USB 提供的电压是 5V,而 STM32F103C8T6 的工作电压为 3.3V,因此需要一个稳压芯片将 5V 转换为 3.3V。AMS1117-3.3 是一款常用的低压差(LDO)线性稳压器,它能够将输入电压稳定地转换为 3.3V 的固定输出电压。其特点包括低压差(在输出电流较大时也能保持较小的输入输出电压差)、输出电流能力适中(通常为 1A 甚至更高,足以满足 STM32F103C8T6 的工作电流需求以及少量外设的供电)、成本低廉、封装小巧(SOT-223 封装)。选择 AMS1117-3.3 的主要原因是其高性价比和可靠性,在低功耗应用中,线性稳压器具有噪声低、电路简单等优点。虽然其效率低于开关稳压器,但对于低功耗的微控制器应用而言,其产生的热量在可接受范围内。它通过调整内部晶体管的导通电阻来实现稳压,多余的能量以热量形式散发。功能是把 5V 的不稳电压转换为稳定的 3.3V 电压,提供给 STM32F103C8T6 和其他 3.3V 供电的元器件。


滤波电容:10uF和0.1uF陶瓷电容


在稳压芯片的输入端和输出端,通常会并联不同容值的电容,以进行电源滤波,确保电源的纯净和稳定。通常会选用一个 10uF 的电解电容或陶瓷电容作为大容量滤波电容,主要用于滤除电源中的低频纹波和瞬态电流冲击,提供能量缓冲。而一个 0.1uF 的陶瓷电容则用于滤除高频噪声,它具有较低的等效串联电阻(ESR)和良好的高频特性,能够有效抑制芯片工作时产生的高频干扰。这些电容的选择原则是“一大一小”组合,大电容提供能量储存,应对瞬时电流变化;小电容快速响应高频噪声。它们并联在电源引脚和地之间,共同构成一个有效的低通滤波器,确保微控制器获得纯净稳定的电源,避免因电源噪声导致的工作异常。这些电容的主要功能是平滑电源电压,滤除高频和低频噪声,提供稳定的电压供电。选择它们是因为它们在不同频率范围内的滤波特性,共同保证电源的纯净度。


复位电路:保障微控制器可靠启动


复位电路是微控制器正常工作不可或缺的一部分,它确保微控制器在上电或遇到异常情况时能够从已知状态开始执行程序。


复位按键:轻触按键


我们通常会使用一个轻触按键作为手动复位输入。当按下按键时,它会将微控制器的 NRST 引脚(通常是低电平有效)拉低,从而触发复位。轻触按键具有体积小巧、成本低廉、手感清脆等优点,是电子设计中最常见的输入元件之一。选择轻触按键是为了提供一个用户友好的手动复位机制,方便调试和程序重新启动。它的功能是提供一个瞬时低电平信号,触发微控制器复位。


RC 复位电路:10KΩ电阻与0.1uF电容


为了配合复位按键,并确保微控制器在上电时能够可靠复位,通常会设计一个简单的 RC(电阻-电容)复位电路。一个 10KΩ 的上拉电阻将 NRST 引脚连接到 3.3V VCC,确保在没有按下复位按键时 NRST 引脚处于高电平状态,避免芯片进入复位状态。而一个 0.1uF 的电容则并联在 NRST 引脚和地之间。当微控制器上电时,电容会通过上拉电阻缓慢充电,在充电过程中,NRST 引脚的电压会逐渐从低电平上升到高电平。STM32 内部的复位逻辑会检测到这个低电平到高电平的跳变,从而完成上电复位。同时,当按下复位按键时,电容会通过按键快速放电,使 NRST 引脚瞬间拉低,松开按键后电容再次缓慢充电,从而实现按键复位。这种 RC 组合提供了一个可靠的上电复位延时,并有效滤除了按键抖动带来的虚假复位信号。选择 10KΩ 和 0.1uF 的组合,是为了在保证足够复位时间的同时,避免电容过大导致复位时间过长或按键响应延迟。它们的功能是提供上电复位延时和按键去抖动,确保微控制器稳定启动。


时钟电路:为微控制器提供精确节拍


时钟是微控制器的心脏,它为内部所有数字逻辑电路提供同步信号,决定了微控制器的工作速度和指令执行频率。STM32F103C8T6 提供了多种时钟源选择,包括内部高速 RC 振荡器(HSI)、内部低速 RC 振荡器(LSI)、外部高速晶体振荡器(HSE)和外部低速晶体振荡器(LSE)。在实际应用中,为了追求更高的精度和稳定性,通常会选择外部晶体振荡器。


外部高速晶体振荡器(HSE):8MHz无源晶振


选择 8MHz 的无源晶振作为外部高速时钟源(HSE)是非常常见的做法。STM32F103C8T6 内部的时钟系统可以通过 PLL(锁相环)将 8MHz 的 HSE 频率倍频至最高 72MHz,作为系统主频 SYSCLK。8MHz 晶振具有稳定性高、精度高、抗干扰能力强等优点,能够为微控制器提供一个非常精确的时钟基准。无源晶振本身不产生振荡,需要外部电路(STM32 内部集成)来驱动它进行振荡。选择它是因为其高稳定性、高精度,能够为微控制器提供可靠的时钟源。其功能是产生一个高精度、高频率的振荡信号,作为微控制器系统时钟的原始输入。


负载电容:2个22pF陶瓷电容


与晶振配合使用的还有两个 22pF 的陶瓷电容。这两个电容通常被称为负载电容,它们连接在晶振的两个引脚和地之间。晶振在工作时需要一定的负载电容才能稳定振荡,电容的值会影响晶振的频率精度和振荡稳定性。22pF 是一个常见的经验值,适用于大多数 8MHz 晶振,能够确保晶振起振稳定且频率准确。选择陶瓷电容是因为其高频特性好、稳定性高、体积小。它们的功能是提供晶振所需的负载电容,确保晶振稳定起振并输出精确的频率。


调试接口:SWD接口


为了方便程序的下载和在线调试,STM32 微控制器通常会使用 SWD(Serial Wire Debug)接口。


SWD 连接器:2x5 Pin 2.54mm 排针


我们通常会引出 SWD 调试接口,它由 SWDIO、SWCLK、NRST、VDD 和 GND 组成。使用 2x5 Pin 2.54mm 排针作为连接器,可以方便地连接 J-Link、ST-Link 等调试器。这种排针是标准间距,易于焊接和连接,是电子产品中常见的调试接口。选择它的原因在于其通用性、易用性和与主流调试器的兼容性。它的功能是提供一个物理接口,用于连接外部调试器,从而实现程序的下载、在线调试、断点设置、变量查看等功能。


发光二极管(LED):视觉反馈的指示器


LED(Light Emitting Diode)是本设计中我们希望点亮的目标,它将作为微控制器输出状态的直观反馈。


LED 类型:5mm红色/绿色/蓝色 直插式LED


选择最常见的 5mm 直插式 LED,可以是红色、绿色或蓝色,这取决于用户的喜好或特定指示需求。5mm LED 具有亮度适中、视角广、成本低廉、易于焊接和使用等优点,是实验板和原型开发的首选。其功能是将电能转换为光能,作为数字信号输出的视觉指示。选择它是因为其普遍性、低成本和直观的视觉效果。


限流电阻:330Ω金属膜电阻


LED 是一种电流驱动型器件,其亮度与流过它的电流大小有关。为了保护 LED 不被过大电流烧毁,并控制其亮度,必须串联一个限流电阻。对于 3.3V 供电的 STM32,以及常见的正向压降约为 2V 的红色 LED,如果希望流过 LED 的电流约为 5-10mA(足够亮且延长寿命),我们可以通过欧姆定律计算所需电阻值:R=(V_CCV_F)/I_F,其中 V_CC 是供电电压(3.3V),V_F 是 LED 的正向压降(假设为 2.0V),I_F 是希望通过的电流(假设为 5mA,即 0.005A)。那么 R=(3.3V2.0V)/0.005A=1.3V/0.005A=260Ω。考虑到标准电阻系列和一定的安全余量,选择 330Ω 的金属膜电阻是一个稳妥的选择。金属膜电阻具有精度高、稳定性好、噪声低等特点,适合用于信号通路和电流控制。它的功能是限制流过 LED 的电流,防止 LED 过流烧毁,并控制其亮度。选择它是基于 LED 的正向压降和期望工作电流,通过计算得到一个合适的阻值。


其他辅助元器件



连接器/排针:2.54mm 单排/双排排针


为了方便与外部电路连接或引出微控制器的其他 GPIO,通常会在开发板上预留各种 2.54mm 间距的单排或双排排针。这些排针可以方便地插入杜邦线或跳线帽,实现灵活的连接和功能扩展。它们的作用是提供灵活的接口,方便与其他模块或传感器进行连接,实现功能的扩展。选择它是基于其通用性、易用性和与常用原型板的兼容性。


PCB板:双面FR-4玻纤板


所有上述元器件都需要安装在印刷电路板(PCB)上。双面 FR-4 玻纤板是电子产品中最常用的 PCB 材料。FR-4 是一种玻璃纤维布基环氧树脂覆铜板,具有良好的绝缘性能、机械强度和耐热性。双面设计允许在板子的正反两面布线,从而实现更紧凑的布局和更复杂的电路连接。它的作用是承载和连接所有电子元器件,提供电气连接和机械支撑。选择它是因为其良好的电气性能、机械强度、成本效益和广泛应用。


基于寄存器方式点亮LED的软件设计


现在,我们将聚焦于如何利用 STM32F103C8T6 的寄存器来控制 GPIO 引脚,从而点亮 LED。我们将以 GPIOA 的第 0 个引脚(PA0)为例,连接一个 LED。在进行寄存器操作之前,理解 STM32F103 的时钟系统和 GPIO 寄存器结构至关重要。


GPIO概述


STM32F103 系列微控制器中的 GPIO(General Purpose Input/Output)端口是一个非常灵活的模块,每个 GPIO 端口(GPIOA、GPIOB 等)都有 16 个引脚,每个引脚都可以独立配置为多种模式,如输入(浮空、上拉、下拉)、输出(推挽、开漏)、复用功能(推挽、开漏)或模拟输入。所有这些配置都通过写入特定的寄存器来实现。


必要的寄存器操作


要通过寄存器方式点亮 LED,主要涉及以下几个关键的寄存器操作步骤:

  1. 使能GPIO端口时钟: 默认情况下,所有 GPIO 端口的时钟都是关闭的,以降低功耗。我们需要通过操作 RCC(复位和时钟控制) 模块的寄存器来打开所需 GPIO 端口的时钟。对于 GPIOA,我们需要设置 RCC_APB2ENR 寄存器中的相应位。RCC_APB2ENR 寄存器位于 APB2 总线上,它控制着 APB2 外设的时钟使能。每个 GPIO 端口对应一个位,例如对于 GPIOA,其对应的位是 IOPAEN(第 2 位)。将该位设置为 1 即可使能 GPIOA 的时钟。

    • 寄存器: RCC->APB2ENR

    • 操作:RCC->APB2ENR 寄存器的 IOPAEN 位(第 2 位)设置为 1。

    • 代码示例: RCC->APB2ENR |= (1 << 2);

    • 解释: 这行代码通过按位或操作,将 RCC_APB2ENR 寄存器的第 2 位置 1,从而使能 GPIOA 的时钟。这是任何 GPIO 操作的第一步,否则对 GPIO 寄存器的操作将无效。

  2. 配置GPIO引脚模式和速度: 每个 GPIO 引脚的模式和输出速度通过两个 32 位的配置寄存器来控制:CRL(Port configuration register low)CRH(Port configuration register high)。CRL 控制低 8 位引脚(Px0-Px7),CRH 控制高 8 位引脚(Px8-Px15)。每个引脚的配置需要 4 位(CNFx[1:0] 和 MODEx[1:0]),其中 CNF 决定输入/输出模式,MODE 决定输出速度或输入类型。

    • 首先,清除 PA0 对应的配置位,避免残留值影响设置:GPIOA->CRL &= ~(0xF << (0 * 4)); (0xF 表示 0b1111,左移 0 位,清除第 0-3 位)

    • 然后,设置 MODE 和 CNF 位。例如,MODE 为 0b11(50MHz),CNF 为 0b00(通用推挽输出)。结合起来,PA0 的 4 位配置为 0b0011 (即 3)。

    • GPIOA->CRL |= (0x3 << (0 * 4)); (0x3 表示 0b0011,左移 0 位,设置第 0-3 位)

    • MODE 位: 设置引脚的输出速度。例如,将 MODEx[1:0] 设置为 0b01 表示 10MHz 输出速度,0b10 表示 2MHz,0b11 表示 50MHz。对于 LED 这种低速应用,选择 0b01 (10MHz) 或 0b10 (2MHz) 即可。

    • CNF 位: 设置引脚的输出类型。对于推挽输出,将 CNFx[1:0] 设置为 0b00。推挽输出可以提供高电平或低电平,适合驱动 LED。

    • 对于输出模式:

    • 假设我们将 PA0 配置为推挽输出,速度为 50MHz。 PA0 对应 GPIOA 的 CRL 寄存器的低 4 位(第 0-3 位)。

    • 寄存器: GPIOA->CRL

    • 操作:

    • 代码示例(PA0配置为推挽输出,50MHz):

      C

      GPIOA->CRL &= ~(0xF << (0 * 4)); // 清除PA0的配置位GPIOA->CRL |= (0x3 << (0 * 4));  
      // 设置PA0为通用推挽输出,50MHz
    • 解释: 这两行代码首先清除了 PA0 引脚在 GPIOA->CRL 寄存器中对应的 4 位配置,然后将这些位设置为 0x3 (即 0b0011),表示将 PA0 配置为通用推挽输出模式,输出速度为 50MHz。

  3. 控制GPIO引脚输出状态:

    • 点亮 LED(PA0 输出低电平):GPIOA->BSRR = (1 << (0 + 16)); // 向高 16 位第 0 位置 1,清除 PA0

    • 熄灭 LED(PA0 输出高电平):GPIOA->BSRR = (1 << 0); // 向低 16 位第 0 位置 1,设置 PA0

    • 点亮 LED(假设 LED 阳极连接 VCC,阴极连接 PA0,需要输出低电平点亮):GPIOA->ODR &= ~(1 << 0); // 将 PA0 所在位清零,输出低电平

    • 熄灭 LED(输出高电平):GPIOA->ODR |= (1 << 0); // 将 PA0 所在位置 1,输出高电平

    • 输出数据寄存器(ODR): 这是最直接控制 GPIO 引脚输出状态的寄存器。将 ODR 寄存器中对应引脚的位设置为 1,则引脚输出高电平;设置为 0,则引脚输出低电平。

    • 寄存器: GPIOA->ODR

    • 操作:

    • 代码示例:

      // 点亮 LEDGPIOA->ODR &= ~(1 << 0); // PA0 输出低电平// 熄灭 LEDGPIOA->ODR |= (1 << 0);  // PA0 输出高电平
    • 解释: 通过位操作直接修改 GPIOA->ODR 寄存器中对应引脚的位,可以控制引脚的输出电平。

    • 位设置/清除寄存器(BSRR): STM32 还提供了更原子性的操作方式:BSRR(Bit Set/Reset Register)。这个寄存器分高 16 位和低 16 位。向低 16 位的对应位写入 1,可以将该引脚设置为高电平;向高 16 位的对应位写入 1,可以将该引脚设置为低电平。BSRR 的优点是操作原子性,不会受到读-改-写操作的影响,在多线程或中断上下文中更安全。

    • 寄存器: GPIOA->BSRR

    • 操作:

    • 代码示例:

      // 点亮 LEDGPIOA->BSRR = (1 << (0 + 16)); // PA0 输出低电平// 熄灭 LEDGPIOA->BSRR = (1 << 0);       // PA0 输出高电平
    • 解释: 使用 BSRR 寄存器可以实现对 GPIO 引脚电平的原子性设置或清除操作,避免了传统读-改-写操作可能带来的竞态条件,提高了代码的鲁棒性。


完整的点亮LED C语言代码示例

#include "stm32f10x.h" // 包含STM32F10x系列微控制器的头文件,定义了寄存器地址和结构体/**
* @brief  简单的延时函数
* @param  nCount: 延时循环次数
* @retval None
*/void delay_ms(volatile unsigned int nCount){    for (; nCount != 0; nCount--);
}/**
* @brief  主函数
* @param  None
* @retval int
*/int main(void){    // 1. 使能GPIOA端口时钟
   // RCC->APB2ENR 是复位和时钟控制器的APB2外设时钟使能寄存器
   // IOPAEN 位(第2位)控制GPIOA的时钟使能
   // |= (1 << 2) 表示将第2位置1,而不影响其他位
   RCC->APB2ENR |= (1 << 2);    // 2. 配置PA0引脚为通用推挽输出,50MHz速度
   // GPIOA->CRL 是GPIOA端口配置寄存器低位(控制PA0-PA7)
   // 每个引脚的配置需要4位,PA0对应CRL的第0-3位
   // 首先清除PA0的4位配置(CNF0[1:0]和MODE0[1:0])
   // ~(0xF << (0 * 4)) 生成一个除了0-3位是0,其他位是1的掩码
   GPIOA->CRL &= ~(0xF << (0 * 4));    // 然后设置PA0的配置位:
   // MODE0[1:0] = 0b11 (50MHz输出速度)
   // CNF0[1:0] = 0b00 (通用推挽输出)
   // 所以PA0的配置位为 0b0011 (即十进制的3)
   // (0x3 << (0 * 4)) 表示将0x3左移0位,即设置第0-3位为0x3
   GPIOA->CRL |= (0x3 << (0 * 4));    while (1)
   {        // 3. 控制PA0引脚输出状态
       // 点亮LED:将PA0设置为低电平 (假设LED阳极接VCC, 阴极接PA0)
       // GPIOA->BSRR 是GPIOA的位设置/清除寄存器
       // 写入高16位可以清除对应位(设置为低电平),写入低16位可以设置对应位(设置为高电平)
       // (1 << (0 + 16)) 表示将第16位(即PA0的清除位)置1,从而使PA0输出低电平
       GPIOA->BSRR = (1 << (0 + 16));

       delay_ms(1000000); // 延时一段时间,让LED保持点亮状态

       // 熄灭LED:将PA0设置为高电平
       // (1 << 0) 表示将第0位(即PA0的设置位)置1,从而使PA0输出高电平
       GPIOA->BSRR = (1 << 0);

       delay_ms(1000000); // 延时一段时间,让LED保持熄灭状态
   }
}


代码解释


  • #include "stm32f10x.h": 这个头文件包含了 STM32F103 系列微控制器的寄存器定义和结构体,使得我们可以通过 RCC->APB2ENRGPIOA->CRL 等方式直接访问寄存器。

  • void delay_ms(volatile unsigned int nCount): 这是一个简单的软件延时函数,通过一个空循环来消耗 CPU 时间,从而实现延时效果。volatile 关键字是必要的,它告诉编译器不要对 nCount 变量进行优化,确保循环能够完整执行。

  • RCC->APB2ENR |= (1 << 2);: 这行代码是使能 GPIOA 端口时钟的关键。STM32 的外设都由时钟控制,如果不使能时钟,对该外设的任何操作都将无效。RCC->APB2ENR 是 APB2 总线上外设时钟使能寄存器的地址,通过位操作将其第 2 位(对应 GPIOA)置 1,即可打开 GPIOA 的时钟。

  • GPIOA->CRL &= ~(0xF << (0 * 4));GPIOA->CRL |= (0x3 << (0 * 4));: 这两行代码配置了 PA0 引脚的工作模式和速度。GPIOA->CRL 是 GPIOA 端口的低位配置寄存器,控制 PA0-PA7。每个引脚需要 4 位来配置其模式和速度。我们首先使用掩码 ~(0xF << (0 * 4)) 清除 PA0 对应的 4 位,然后使用 (0x3 << (0 * 4)) 设置这 4 位为 0x3(即 0b0011),这代表将 PA0 配置为通用推挽输出,输出速度为 50MHz。

  • GPIOA->BSRR = (1 << (0 + 16));GPIOA->BSRR = (1 << 0);: 这两行代码控制 PA0 的高低电平输出。GPIOA->BSRR 是 GPIOA 的位设置/清除寄存器,具有原子性操作的特点。当向 BSRR 的低 16 位写入 1 时,对应的引脚会被设置为高电平;当向 BSRR 的高 16 位写入 1 时,对应的引脚会被设置为低电平。这里,1 << (0 + 16) 是将第 16 位置 1,用于清除 PA0(即设置为低电平),从而点亮 LED;而 1 << 0 是将第 0 位置 1,用于设置 PA0(即设置为高电平),从而熄灭 LED。


编译与烧录


完成代码编写后,需要使用交叉编译器(例如 GCC ARM Embedded Toolchain)将其编译成可在 STM32F103C8T6 上运行的二进制文件(通常是 .hex 或 .elf 格式)。然后,通过 J-Link、ST-Link 或其他兼容的调试器将编译好的程序烧录到 STM32F103C8T6 的 Flash 存储器中。烧录完成后,LED 就会按照程序设定的间隔周期性地闪烁。


总结与展望


本设计方案详细阐述了基于 STM32F103C8T6 微控制器,采用寄存器方式点亮 LED 灯的整个过程,从核心元器件的选择与功能分析,到具体的软件设计与寄存器操作细节,都进行了深入的探讨。通过对 STM32F103C8T6 的 Cortex-M3 内核、丰富外设、时钟系统以及 GPIO 寄存器操作的理解,我们不仅成功实现了 LED 的控制,更重要的是,掌握了嵌入式系统底层开发的核心技术。这种寄存器操作方式虽然比使用库函数更复杂,但它能让我们更深入地理解硬件工作原理,更精准地控制外设,并在性能和资源优化方面具有无可比拟的优势。

责任编辑:David

【免责声明】

1、本文内容、数据、图表等来源于网络引用或其他公开资料,版权归属原作者、原发表出处。若版权所有方对本文的引用持有异议,请联系拍明芯城(marketing@iczoom.com),本方将及时处理。

2、本文的引用仅供读者交流学习使用,不涉及商业目的。

3、本文内容仅代表作者观点,拍明芯城不对内容的准确性、可靠性或完整性提供明示或暗示的保证。读者阅读本文后做出的决定或行为,是基于自主意愿和独立判断做出的,请读者明确相关结果。

4、如需转载本方拥有版权的文章,请联系拍明芯城(marketing@iczoom.com)注明“转载原因”。未经允许私自转载拍明芯城将保留追究其法律责任的权利。

拍明芯城拥有对此声明的最终解释权。

下一篇: 已是最后一篇
标签: led灯

相关资讯

拍明芯城微信图标

各大手机应用商城搜索“拍明芯城”

下载客户端,随时随地买卖元器件!

拍明芯城公众号
拍明芯城抖音
拍明芯城b站
拍明芯城头条
拍明芯城微博
拍明芯城视频号
拍明
广告
恒捷广告
广告
深亚广告
广告
原厂直供
广告