stm32f103pwm实现呼吸灯(寄存器)

发布者:数据之翼最新更新时间:2021-10-13 来源: eefocus关键字:stm32f103  pwm  呼吸灯  寄存器 手机看文章 扫描二维码
随时随地手机看文章

一、思路

通过 Tim 定时器可以设置多路 PWM 实现呼吸灯,所以我们使能一个 TIM3,因为 TIM3 的通道2(CH2)正好映射到 PB5(LED)

然后配置 PB5 为复用推挽输出,50MHZ

pwm通过定时器 TIM3 的计数器 CNT 从 0 到 ARR(ARR可以设置为0-65535) 进行周期的自增或自减, CNT 每自增或自减一次与 CCR2 比较一次,CCR2的值由我们自己设置,一般通过 while 循环按照我们希望的时间 比如1s增加1

如果在PWM模式1下 CNT向上计数时 CNT < CCR2 则将 PB5设为高电平

如果在PWM模式2下 CNT向上计数时 CNT < CCR2 则将 PB5设为低电平

通过 占空比 = 高电平时间 / 总时间 的变化实现呼吸灯效果

在这里插入图片描述

二、pwm_init()代码

void pwm_init() {

//1.配置AFIO 进行端口映射

//使能AFIO

RCC->APB2ENR |= 1 << 0;

//使能GPIOB RCC时钟

RCC->APB2ENR |= 1 << 3;

//使能TIM3

RCC->APB1ENR |= 1 << 1;

//把TIM3部分映射到GPIOB5

AFIO->MAPR |= 1 << 11;

AFIO->MAPR &= ~(1 << 10);

//2.配置GPIOB5端口

//设置GPIOB5为 复用推挽输出 即 [23:22] = CNF[1:0]

GPIOB->CRL |= 1 << 23;

GPIOB->CRL &= ~(1 << 22);

//设置GPIOB5为 输出模式 速度50MHZ   即 [21:20] = MODE[1:1]

GPIOB->CRL |= 1 << 21;

GPIOB->CRL |= 1 << 20;

//LED-OFF

GPIOB->ODR |= 1 << 5;

//3.配置TIM3

//PSC为定时器的分频器

TIM3->PSC = 0;

//ARR为定时器计数上限  设置自动重装载值

TIM3->ARR = 5000;

//TIM3->CH2 设置PWM模式1

TIM3->CCMR1 |= 6 << 12;

//TIM3->CH2 预装载使能

TIM3->CCMR1 |= 1 << 11;

//TIM3->CH2 输出使能

TIM3->CCER |= 1 << 4;

//使能 ARPE   ARR寄存器的值被装入缓冲器

TIM3->CR1 |= 1 << 7;

//使能计数器

TIM3->CR1 |= 1 << 0;

//通过while循环设置TIM3->CCR2的值

int nFlag = 1;

int nPwmValue = 0;

while (1) {

//通过for循环设置每次变化时间

    for (volatile int i = 0; i < 100; i++) {}

    //通过设置 nFlag 的设置自增或自减

    if (nFlag) {

        nPwmValue++;

    } else {

        nPwmValue--;

    }

    //设置周期最大值

    if (nPwmValue >= 5000) {

        nFlag = 0;

    }

    //设置周期最小值

    if (nPwmValue <= 0) {

        nFlag = 1;

    }

    //设置 CCR2 的值

    TIM3->CCR2 = nPwmValue;

}

}


三、 分步讲解

1.配置AFIO 进行端口映射 (部分芯片可能不支持 可采用跳线方式实现)

    //使能AFIO

    RCC->APB2ENR |= 1 << 0;

    //使能GPIOB RCC时钟

    RCC->APB2ENR |= 1 << 3;

    //使能TIM3

    RCC->APB1ENR |= 1 << 1;

    //把TIM3部分映射到GPIOB5

    AFIO->MAPR |= 1 << 11;

    AFIO->MAPR &= ~(1 << 10);

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.配置GPIOB5端口

    //设置GPIOB5为 复用推挽输出 即 [23:22] = CNF[1:0]

    GPIOB->CRL |= 1 << 23;

    GPIOB->CRL &= ~(1 << 22);

    //设置GPIOB5为 输出模式 速度50MHZ   即 [21:20] = MODE[1:1]

    GPIOB->CRL |= 1 << 21;

    GPIOB->CRL |= 1 << 20;

    //LED-OFF

在这里插入图片描述
在这里插入图片描述

3.配置TIM3

    //PSC为定时器的分频器

    TIM3->PSC = 0;

    //ARR为定时器计数上限  设置自动重装载值

    TIM3->ARR = 5000;

   

    //TIM3->CH2 设置PWM模式1

    TIM3->CCMR1 |= 6 << 12;

    //TIM3->CH2 预装载使能

    TIM3->CCMR1 |= 1 << 11;

   

    //TIM3->CH2 输出使能

    TIM3->CCER |= 1 << 4;

   

    //使能 ARPE   ARR寄存器的值被装入缓冲器。

    TIM3->CR1 |= 1 << 7;

    //使能计数器

    TIM3->CR1 |= 1 << 0;

   

    //通过while循环设置TIM3->CCR2的值

    int nFlag = 1;

    int nPwmValue = 0;

    while (1) {

    //通过for循环设置每次变化时间

        for (volatile int i = 0; i < 100; i++) {}

        //通过设置 nFlag 的设置自增或自减

        if (nFlag) {

            nPwmValue++;

        } else {

            nPwmValue--;

        }

        //设置周期最大值

        if (nPwmValue >= 5000) {

            nFlag = 0;

        }

        //设置周期最小值

        if (nPwmValue <= 0) {

            nFlag = 1;

        }

        //设置 CCR2 的值

        TIM3->CCR2 = nPwmValue;

    }

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

关键字:stm32f103  pwm  呼吸灯  寄存器 引用地址:stm32f103pwm实现呼吸灯(寄存器)

上一篇:基于STM32最简单的呼吸灯
下一篇:STM32入门学习之GPIO(STM32F030F4P6基于CooCox IDE)(寄存器操作版

推荐帖子

【MSPM0L1306 LaunchPad】 7 UART基本实验(1)
【MSPM0L1306LaunchPad】7UART基本实验(1)【MSPM0L1306LaunchPad】1开箱+环境搭建+点灯【MSPM0L1306LaunchPad】2GUIComposerGUI玩板子【MSPM0L1306LaunchPad】3Ti云开发环境【MSPM0L1306LaunchPad】4用MDK环境点灯【MSPM0L1306LaunchPad】5用ccstheia环境点灯【MS
damiaa MSPM0 MCU
TT50短信透明收发模块PCB封装
TT50短信透明收发模块PCB封装TT50短信透明收发模块PCB封装
songbo 模拟电子
想请个嵌入式工程师指导一下自己
自己在学习linux嵌入式开发两个多月了,主是linux系统移植,和驱动程序开发。本人现在在武汉,希望你在武汉工作。不会占用你太多时间,在你有空的时候指导一下。价钱面议qq41013774想请个嵌入式工程师指导一下自己这个祝楼主好运吧,顶一下!师傅领进门,修行在个人在武汉?哎武汉这方面的人不是很多
jiangxuewz 嵌入式系统
求问带SDK定制的FPGA的型号与大致价位
学校要和企业做一个项目,想用FPGA做数据库的东西,我想问问带SDK定制的FPGA都有哪些型号?大概价格是多少?谢谢大家~!求问带SDK定制的FPGA的型号与大致价位带SDK定制的?不懂,可以问问FAE
sukidasakura EE_FPGA学习乐园
PCB参考层
在PCB的设计向导中,会出现如图所示对话框,问你要不要指定电源或者地参考层的数目,老师教的时候没提到这个,我也一直是按默认做的,但看见网上好多设计都涉及到接地参考层,所以想请教一下设置参考层与否有什么区别? PCB参考层附件请重新上传如遇到问题请通过站内短信联系我回复楼主zzbaizhi的帖子无法上传附件或者图片回复沙发soso的帖子请通过站短告知我你的登陆密码我试试:)我刚刚找了个ID试了一下没有问题是不是网速的问题?还是弹出什么提示呢?如果是99
zzbaizhi PCB设计
Cortex-M3 的指针问题
急急??各位大虾我想问一下在Cortex-M3的内核下我定义一个32位的指针P,我把P加一是不是相当于加的4如果是16位的地址指针是不是相当于加的是2啊Cortex-M3的指针问题是这个与内核无关吧哦谢谢了昨晚发了我才猛然发现翻了这么个低级错误
爱好汽车电子 微控制器 MCU
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved