STM32通用定时器比较输出(RGB实验)

本文详细描述了如何使用RGBLED模块通过PA1、2、3连接TIM5实现按键控制RGB颜色的切换,涉及时钟配置、I/O口复用、PWM设置以及CCM配置等步骤。
摘要由CSDN通过智能技术生成

RGB彩灯实验:完成按键切换灯颜色(单定时器多通道)

                                                图1.RGB 模块

        RGB LED 模块通过 R G B 三个引脚的 PWM 电压输入可以调节三种基色(红 / / 绿)的强度从而实现全 彩的混色效果。

  软件流程

  1. 打开时钟)
  2. 配置I/O口---复用推挽输出
  3. 更新禁止
  4. 更新请求源
  5. 单脉冲
  6. 计数方向
  7. Arr的预装载(没有)
  8. 选择内部时钟源
  9. 更新事件使能
  10. 通道配置为输出
  11. 预装载使能
  12. 选择PWM模式
  13. 开启输出通道
  14. 选择有效电平
  15. 配置CNT ARR PSC
  16. 使能
  17. 调整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
	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;
		}
	}

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值