RGB彩灯实验:完成按键切换灯颜色(单定时器多通道)
图1.RGB 模块
RGB LED 模块通过
R
、
G
、
B
三个引脚的
PWM
电压输入可以调节三种基色(红
/
蓝
/
绿)的强度从而实现全 彩的混色效果。
软件流程
- 打开时钟)
- 配置I/O口---复用推挽输出
- 更新禁止
- 更新请求源
- 单脉冲
- 计数方向
- Arr的预装载(没有)
- 选择内部时钟源
- 更新事件使能
- 通道配置为输出
- 预装载使能
- 选择PWM模式
- 开启输出通道
- 选择有效电平
- 配置CNT ARR PSC
- 使能
- 调整CCR来改变占空比
RCC->AHB1ENR|=(1<<0);//打开PA时钟
RCC->APB1ENR|=(1<<3);//打开TIM5时钟
打开时钟(PA TIM5)
GPIOA->MODER&=~(3<<2);//清零
GPIOA->MODER|=(2<<2);//复用
GPIOA->OTYPER&=~(1<<1);//推挽
GPIOA->AFR[0]|=(2<<4);//PA1复用TIM5
GPIOA->MODER&=~(3<<4);//清零
GPIOA->MODER|=(2<<4);//复用
GPIOA->OTYPER&=~(1<<2);//推挽
GPIOA->AFR[0]|=(2<<8);//PA2复用TIM5
GPIOA->MODER&=~(3<<6);//清零
GPIOA->MODER|=(2<<6);//复用
GPIOA->OTYPER&=~(1<<3);//推挽
GPIOA->AFR[0]|=(2<<12);//PA3复用TIM5
配置I/O口---复用推挽输出
PA1、2、3 对应TIM5_CH2、3、4
![](https://img-blog.csdnimg.cn/direct/d3a5e50552294288815fdfc8e7c79714.png)
![](https://img-blog.csdnimg.cn/direct/ff8044961b254e86a87e102712d6558f.png)
TIM5->CR1&=~(1<<1);//更新禁止
TIM5->CR1&=~(1<<2);//更新请求源
TIM5->CR1&=~(1<<3);//单项脉冲
TIM5->CR1&=~(1<<4);//递增
TIM5->CR1&=~(1<<7);//没有Arr预装载
更新禁止/更新请求源/单脉冲/计数方向/Arr的预装载(没有)
TIM5->SMCR&=~(7<<0);//选择内部时钟源
选择内部时钟源
TIM5->EGR|=(1<<0);//更新事件使能
更新事件使能
TIM5->CCMR1&=~(3<<8);//通道2配置为输出
TIM5->CCMR1|=(1<<11);//预装载使能
TIM5->CCMR1&=~(7<<12);//清零
TIM5->CCMR1|=(6<<12);//PWM1
TIM5->CCER|=(1<<4);//开启输出通道2
TIM5->CCER|=(1<<5);//有低电平 通道2
通道配置为输出/预装载使能/选择PWM模式/开启输出通道/选择有效电平
TIM5->CCMR2&=~(3<<0);//通道3配置为输出
TIM5->CCMR2|=(1<<3);//预装载使能
TIM5->CCMR2&=~(7<<4);//清零
TIM5->CCMR2|=(6<<4);//PWM1
TIM5->CCER|=(1<<8);//开启输出通道3
TIM5->CCER|=(1<<9);//有效低电平 通道3
TIM5->CCMR2&=~(3<<8);//通道4配置为输出
TIM5->CCMR2|=(1<<11);//预装载使能
TIM5->CCMR2&=~(7<<12);//清零
TIM5->CCMR2|=(6<<12);//PWM1
TIM5->CCER|=(1<<12);//开启输出通道4
TIM5->CCER|=(1<<13);//有效低电平 通道4
与上面一致
TIM5->CNT&=~(1<<0);
TIM5->ARR=arr-1;
TIM5->PSC=psc-1;
TIM5->CCR2=ccr2;
TIM5->CCR3=ccr3;
TIM5->CCR4=ccr4;
配置CNT ARR PSC
TIM5->CR1|=(1<<0);//使能
使能
u8 key;
while(1)
{
key=Get_Key();
switch(key)
{
case 1:RGB_Config(84,1000,1000,0,0);break;//与串口2引脚冲突
case 2:RGB_Config(84,1000,0,1000,0);break;
case 3:RGB_Config(84,1000,0,0,1000);break;
}
}
调整CCR来改变占空比
完整代码
/*
Function name:Rgb_Config
Description:比较输出初始化
param:psc--分频比 arr--重装载值 ccr2--比较值 ccr3--比较值 ccr4--比较值
retval:None
Remarks:
PA1、2、3 TIM5_CH2、3、4
*/
void Rgb_Config(u32 psc,u32 arr,u32 ccr2,u32 ccr3,u32 ccr4)
{
RCC->AHB1ENR|=(1<<0);//打开PA时钟
RCC->APB1ENR|=(1<<3);//打开TIM5时钟
//配置PA1、2、3
GPIOA->MODER&=~(3<<2);//清零
GPIOA->MODER|=(2<<2);//复用
GPIOA->OTYPER&=~(1<<1);//推挽
GPIOA->AFR[0]|=(2<<4);//PA1复用TIM5
GPIOA->MODER&=~(3<<4);//清零
GPIOA->MODER|=(2<<4);//复用
GPIOA->OTYPER&=~(1<<2);//推挽
GPIOA->AFR[0]|=(2<<8);//PA2复用TIM5
GPIOA->MODER&=~(3<<6);//清零
GPIOA->MODER|=(2<<6);//复用
GPIOA->OTYPER&=~(1<<3);//推挽
GPIOA->AFR[0]|=(2<<12);//PA3复用TIM5
TIM5->CR1&=~(1<<1);//更新禁止
TIM5->CR1&=~(1<<2);//更新请求源
TIM5->CR1&=~(1<<3);//单项脉冲
TIM5->CR1&=~(1<<4);//递增
TIM5->CR1&=~(1<<7);//没有Arr预装载
TIM5->SMCR&=~(7<<0);//选择内部时钟源
TIM5->EGR|=(1<<0);//更新事件使能
TIM5->CCMR1&=~(3<<8);//通道2配置为输出
TIM5->CCMR1|=(1<<11);//预装载使能
TIM5->CCMR1&=~(7<<12);//清零
TIM5->CCMR1|=(6<<12);//PWM1
TIM5->CCER|=(1<<4);//开启输出通道2
TIM5->CCER|=(1<<5);//有低电平 通道2
TIM5->CCMR2&=~(3<<0);//通道3配置为输出
TIM5->CCMR2|=(1<<3);//预装载使能
TIM5->CCMR2&=~(7<<4);//清零
TIM5->CCMR2|=(6<<4);//PWM1
TIM5->CCER|=(1<<8);//开启输出通道3
TIM5->CCER|=(1<<9);//有效低电平 通道3
TIM5->CCMR2&=~(3<<8);//通道4配置为输出
TIM5->CCMR2|=(1<<11);//预装载使能
TIM5->CCMR2&=~(7<<12);//清零
TIM5->CCMR2|=(6<<12);//PWM1
TIM5->CCER|=(1<<12);//开启输出通道4
TIM5->CCER|=(1<<13);//有效低电平 通道4
//时基
TIM5->CNT&=~(1<<0);
TIM5->ARR=arr-1;
TIM5->PSC=psc-1;
TIM5->CCR2=ccr2;
TIM5->CCR3=ccr3;
TIM5->CCR4=ccr4;
TIM5->CR1|=(1<<0);//使能
}
主函数
u8 key;
while(1)
{
key=Get_Key();
switch(key)
{
case 1:RGB_Config(84,1000,1000,0,0);break;//与串口2引脚冲突
case 2:RGB_Config(84,1000,0,1000,0);break;
case 3:RGB_Config(84,1000,0,0,1000);break;
}
}