STM32F103 标准库介绍及PWM波控制LED亮度

STM32F103 标准库介绍及PWM波控制LED亮度

引言

STM32F103 系列微控制器(MCU)是意法半导体(STMicroelectronics)推出的一款高性能、低功耗的嵌入式芯片,广泛应用于各种嵌入式系统中。STM32F103 基于ARM Cortex-M3内核,具有丰富的外设接口和强大的处理能力。本文将介绍如何使用STM32F103的标准库生成PWM波,并通过PWM波控制LED的亮度。

标准库简介

STM32F103 的标准外设库(Standard Peripheral Library, SPL)是意法半导体提供的一组软件库,用于简化对STM32系列芯片外设的操作。SPL 提供了丰富的API函数,涵盖了GPIO、USART、I2C、SPI、TIM等常用外设,极大地方便了开发者进行快速开发。

硬件连接

在开始编写代码之前,我们需要连接硬件。假设我们使用STM32F103C8T6开发板,并将LED连接到PA8引脚。我们将通过PWM波来调节该LED的亮度。

软件开发环境

我们使用Keil uVision作为开发环境,并使用STM32标准外设库进行开发。需要下载并安装STM32F103标准外设库。

PWM波生成及控制LED亮度
  1. 初始化库和外设

首先,我们需要初始化标准库和时钟。然后,我们需要配置GPIO引脚为复用功能,以便它可以输出PWM波。

c 复制代码
#include "stm32f10x.h"

void RCC_Configuration(void)
{
    /* 使能时钟 */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_TIM1, ENABLE);
}

void GPIO_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    
    /* 配置PA8为复用推挽输出 */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}

void TIM1_Configuration(void)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_OCInitTypeDef TIM_OCInitStructure;

    /* 配置TIM1 */
    TIM_TimeBaseStructure.TIM_Period = 999; // 自动重装载寄存器值
    TIM_TimeBaseStructure.TIM_Prescaler = 71; // 预分频器
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

    /* PWM模式配置 */
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_Pulse = 0; // 初始占空比
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OC1Init(TIM1, &TIM_OCInitStructure);

    /* 使能TIM1 */
    TIM_Cmd(TIM1, ENABLE);

    /* 使能TIM1 PWM输出 */
    TIM_CtrlPWMOutputs(TIM1, ENABLE);
}
  1. 主函数

在主函数中,我们将上述配置函数依次调用,然后通过改变PWM占空比来控制LED的亮度。

c 复制代码
int main(void)
{
    RCC_Configuration();
    GPIO_Configuration();
    TIM1_Configuration();

    while (1)
    {
        for (uint16_t i = 0; i < 1000; i++)
        {
            TIM_SetCompare1(TIM1, i); // 改变占空比
            for (volatile int j = 0; j < 10000; j++); // 延时
        }

        for (uint16_t i = 1000; i > 0; i--)
        {
            TIM_SetCompare1(TIM1, i); // 改变占空比
            for (volatile int j = 0; j < 10000; j++); // 延时
        }
    }
}
代码解析
  1. RCC_Configuration:使能GPIOA和TIM1的时钟。
  2. GPIO_Configuration:配置PA8引脚为复用推挽输出。
  3. TIM1_Configuration:配置TIM1的时基和PWM模式,使能TIM1及其PWM输出。
  4. 主函数:在主循环中,通过改变TIM1的CCR1(捕获/比较寄存器)值来调整PWM波的占空比,从而控制LED的亮度。
总结

通过使用STM32F103的标准外设库,我们可以方便地生成PWM波,并通过PWM波的占空比控制LED的亮度。以上代码展示了从配置时钟、GPIO、TIM1到调节PWM波占空比的完整过程。这种方法不仅适用于控制LED,还可以用于其他需要PWM控制的场景,如电机控制等。希望本文对初学者理解和使用STM32F103标准库有所帮助。

相关推荐
点灯小铭6 小时前
基于单片机的多模式自动洗衣机设计与实现
数据库·单片机·嵌入式硬件·毕业设计·课程设计
La Pulga6 小时前
【STM32】RTC实时时钟
c语言·stm32·单片机·嵌入式硬件·mcu·实时音视频
m0_555762906 小时前
STM32产品程序测试完整指南
stm32·单片机·嵌入式硬件
普中科技7 小时前
【普中Hi3861开发攻略--基于鸿蒙OS】-- 第 26 章 WIFI实验-AP 建立网络
单片机·嵌入式硬件·wifi·liteos·hi3861·普中科技
普中科技7 小时前
【普中Hi3861开发攻略--基于鸿蒙OS】-- 第 24 章 OLED液晶显示实验
单片机·嵌入式硬件·oled·liteos·hi3861·普中科技
冻结的鱼7 小时前
STM32H5 的 PB14 引脚被意外拉低的问题解析
stm32·单片机·嵌入式硬件
小莞尔8 小时前
【51单片机】【protues仿真】基于51单片机彩灯控制器系统
单片机·嵌入式硬件
文火冰糖的硅基工坊8 小时前
[嵌入式系统-146]:五次工业革命对应的机器人形态的演进、主要功能的演进以及操作系统的演进
前端·网络·人工智能·嵌入式硬件·机器人
老六哥_AI助理指南8 小时前
为什么AI会改变单片机的未来?
人工智能·单片机·嵌入式硬件
点灯小铭8 小时前
基于单片机的智能家居多参数环境监测与联动报警系统设计
单片机·mongodb·毕业设计·智能家居·课程设计·期末大作业