STM32呼吸灯

来源:互联网 发布:最好网络个人投资理财 编辑:程序博客网 时间:2024/04/28 20:49

设计要求:做两个呼吸灯,交替渐亮渐灭由全亮到全灭和由全灭到全亮都是0.5s

设计思路:利用两路脉冲宽度调制(PWM)分别控制两粒灯的亮度。(下面利用TM3的CH1与CH2两路)

具体方案和代码:利用STM32的TIM3定时器产生CH1的PWM输出和CH2的PWM输出分别控制LED0与LED1,其中,CH1的IO口为PA6,CH2的IO口为PA7,又因为LED0与LED1的IO端口分别为PA8与PD2,所以要先把PA6与PD2连接起来,PA7与PA8连接起来。


然后正式开始写代码:首先利用RCC->APB1ENR(外设时钟使能能寄存器)开启TM3(要使用TM3必须先开启对应的时钟APB1ENR)(外事时钟使能寄存器有两个,分别是APB1ENR与APB2ENR,具体用哪个查中文手册65页)。        RCC->APB1ENR|=1<<1; //TIM3 时钟使能


利用端口配置寄存器把PA8与PD2调为浮空输入(因为利用的是PA6与PA7,所以要禁止他们,不然出现短路)(具体怎样用看中文手册114页)
GPIOA->CRH&=0XFFFFFFF0;//PA8 输出GPIOA->CRH|=0X00000004;//浮空输入 GPIOD->CRL&=0XFFFFF0FF; GPIOD->CRL|=0X00000400;

再把PA7与PA6调为复用输出(因为CH1与CH2是以IO复用的形式连接到PA6与PA7上面)
GPIOA->CRL&=0X00FFFFFF;//PA7 与PA6输出
GPIOA->CRL|=0XBB000000;//复用功能输出 
GPIOA->ODR|=1<<7;//PA7 上拉

GPIOA->ODR|=1<<6;//PA6上拉


设置 ARR 和 PSC 两个寄存器的值来控制输出PWM的周期(>=50HZ) TIM3->ARR=arr;//设定计数器自动重装值 TIM3->PSC=psc;//预分频器不分频

利用捕获/比较模式寄存器(TIM3->CCMR1)控制CH1与CH2。(该寄存器有2个,具体看中文手册240页)

TIM3->CCMR1|=7<<4; //CH1 PWM2 模式
TIM3->CCMR1|=1<<3; //CH1 预装载使能

TIM3->CCMR1|=7<<12; //CH2 PWM2 模式
TIM3->CCMR1|=1<<11; //CH2 预装载使能


利用控制寄存器TIM3->CR1使能TM3(具体看中文手册233页),利用捕获\使能寄存器TIM3->CCER使能CH1与CH2(具体看中文手册244页)

TIM3->CCER|=1<<4; //OC2 输出使能 
TIM3->CCER|=1<<0;
TIM3->CR1=0x0080; //ARPE 使能
TIM3->CR1|=0x01; //使能定时器 3


最后,通过宏定义:

#define LED0_PWM_VAL TIM3->CCR2
#define LED1_PWM_VAL TIM3->CCR1

继而可以通过控制TIM3—CCR2与TIM3—CCR1来控制LED0与LED1的亮度。

遇到问题和解决办法:刚开始接触很多看不懂,最后通过问高手和自己慢慢摸索懂了8成。

感谢:当最后通过自己努力完成目标,感觉真的很开心。接下去继续把STM32学好吧。加油加油·



1 0
原创粉丝点击