历史上的今天
返回首页

历史上的今天

今天是:2024年09月28日(星期六)

2021年09月28日 | stm32f103pwm实现呼吸灯(寄存器)

2021-09-28 来源:eefocus

一、思路

通过 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;

    }

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

推荐阅读

史海拾趣

Hayashi Denko Co Ltd公司的发展小趣事

随着全球环保意识的日益增强,Bel Power Solutions积极响应号召,将环保理念融入产品设计和生产中。公司推出了多款环保型电源产品,如高效能、低能耗的DC-DC转换器和电源供应器,帮助客户降低能耗、减少碳排放。同时,公司还致力于研发和推广可再生能源应用技术,为可持续发展做出贡献。

EDAL公司的发展小趣事

EDAL公司始终秉持持续创新和客户至上的理念。公司不断投入研发资源,推出新的EDA产品和解决方案,满足客户的多样化需求。同时,EDAL公司还建立了完善的客户服务体系,为客户提供全方位的技术支持和解决方案。这些举措不仅增强了客户对EDAL公司的信任和忠诚度,还为公司的长期发展奠定了坚实的基础。

Digital Equipment Corp公司的发展小趣事

1957年,麻省理工学院的工程师肯尼斯·奥尔森(Kenneth Olsen)和哈伯特·安德森(Harlan Anderson)共同创立了Digital Equipment Corporation(DEC)。他们最初的目标是开发和生产创新的数字计算设备。凭借他们在数字技术领域的专业知识和独特视角,DEC推出了首批数字实验室和数字系统组件,这些产品在市场上取得了初步的成功,为DEC的发展奠定了坚实的基础。

EMC Technology RF Labs公司的发展小趣事

EMC Technology RF Labs成立于XXXX年,作为EMC Technology公司的一个专门研究射频(RF)技术的实验室。创立之初,RF Labs的目标是为电子通信行业提供高质量的射频元件和解决方案。公司聚集了一批在射频技术领域具有丰富经验和专业知识的工程师,开始了对射频技术的深入研究和探索。

Comchip Technology公司的发展小趣事

品质是Comchip Technology公司的生命线。公司始终坚持严格的质量管理体系,通过ISO9001、ISO14001等多项国际质量认证,确保产品质量的稳定性和可靠性。同时,公司还建立了完善的售后服务体系,为客户提供及时、专业的技术支持和服务。

ERNI公司的发展小趣事

1947年,瑞士工程师Ernst Rudolf Erni和他的妻子Elsa在瑞士那提空(Nänikon)共同创立了“ERNI & CO.”公司。他们的首个订单是为苏黎世克洛腾机场开发地雷探测器和机场导航灯。这个起点虽小,但为ERNI日后在电子行业的辉煌奠定了基础。随着订单的增多,公司逐渐扩大了生产规模,并开始涉足继电器、电气设备等领域。

问答坊 | AI 解惑

智能电话报警系统

本帖最后由 paulhyde 于 2014-9-15 09:50 编辑 我的毕业设计题目是\"智能电话报警系统\",现在准备交了,可MT8888自动拨号这部分程序还没调得,有哪位高手可以指点小妹下,万分感谢! 邮箱:dodo716@163.com  …

查看全部问答>

双向汽车防盗器设计(毕业设计系列)

本帖最后由 paulhyde 于 2014-9-15 08:54 编辑  …

查看全部问答>

深度解析与探讨:嵌入式系统的高低温故障的根源

呵呵,ARM7、ARM9 还有PXA3XX 等等嵌入式ARM都存在高低温时容易爆发故障?尤其是主频越高的CPU,越容易爆发高低温故障? 这是为什么? 这是因为我们疏忽了对于整个系统中的很多关键信号的完整性的研究、分析与设计; 我们的硬件、软硬件协调设计 ...…

查看全部问答>

问个小问题

     我买的一块上面有CPLD的开发板,查了附带的光盘资料,没写清每个管脚的作用,以前没用过CPLD ,难道每个管脚都一样,都是通用的吗??难道时钟引脚也随便用吗,每次写完VHDL都不知道该怎么分配管脚,请大家指点一下,只说 ...…

查看全部问答>

MessageBeep()通过蜂鸣器实现问题

我的设备中没有加声卡,只有一个蜂器鸣,写了个蜂鸣器的驱动,WINCE中的函数MessageBeep()如何去实现呢?MessageBeep()都调用了哪些函数和信息?请指点一下,谢谢!…

查看全部问答>

cannot open file 'ceddk.lib'(急寻解决办法)

别人考我一个工程EVC的 在他那可以运行 在我电脑上运行报错如下: LINK : fatal error LNK1104: cannot open file \'ceddk.lib\' 是要将这个库加到工程中吗? 哪位有这个库的发我一个 万分感谢! mickeyhao66@163.com…

查看全部问答>

WINCE问题(得答案后马上结帖)

WinCE中,在主对话框中有一子对话框,在子对话框中我用 CreateWindow(TEXT(\"DISPLAYCLASS\")……) 创建了一个IE控件,请问如何使当我鼠标指针只要一移到IE控件中就弹出一个消息框???…

查看全部问答>

我有技术,他有市场,但其他都不了解,如何合作?

我有技术,他有市场,但其他都不了解,如何合作?关键是公司运作,财务监督等,因为失败了两次,我对世人的诚信不敢恭维。…

查看全部问答>

FPGA+USB通信

我现在需要用ISP1362芯片实现USB通信,但是对上位机程序不是很了解,希望得到帮助,我的QQ是1261446649,加我QQ详谈要求和报酬。感激不尽!…

查看全部问答>

花了2天,SWIM底层接口终于搞定

8mA的sink电流比较变态。。。。。。 STM8S没有Chip_ID比较变态。。。。。。 其他都是浮云。。。。。。 swim.jpg (11.35 KB) 下载次数:32 2009-12-31 15:54 …

查看全部问答>