PWM实现蜂鸣器、马达、风扇

.c

#include "pwm.h"






void pwm_gpio_init()
{
	//设置RCC使能
	RCC->MP_AHB4ENSETR |= 0x1<<1;

	//设置引脚复用功能
	GPIOB->MODER &=(~(0x3)<<12);
	GPIOB->MODER |=(0x1)<<13;
	//设置PB2---->AF2---->TIM4_CH!
	GPIOB->AFRL &=(~(0xf)<<24);
	GPIOB->AFRL |=(0x1)<<25;

}



void pwm_rcc_init()
{
	//设置RCC使能
	RCC->MP_APB1ENSETR |= 0x1<<2;
}



//配置tim计数器方式
void TIM4_CR1_init()
{
//自动重载计数器预加载使能
	TIM4->CR1 |= 0x1<<7;
//设置边缘对齐模式(递减计数器)
	TIM4->CR1 &= (~(0x3<<5));
//设置递减计数器
	TIM4->CR1 |= 0x1<<4;

//设置计数器使能
	TIM4->CR1 |= 0x1;

}

void TIM4_CCMR1_init()
{
//设置为pwm1模式 [16][6:4]0110
	TIM4->CCMR1 &=(~(0x1<<16));
	TIM4->CCMR1 |=0x3<<5;
	TIM4->CCMR1 &=(~(0x1<<4));
//设置预加载使能
	TIM4->CCMR1 |=0x1<<3;

//设置为输出模式
	TIM4->CCMR1 &=(~0x3);


}


void TIM4_CCER_init()
{
	TIM4->CCER |=0x1<<3;
	TIM4->CCER &=(~(0x1<<1));
	TIM4->CCER |=0x1;


}



void TIM4_PSC_init()
{
	TIM4->PSC = 208;


}

void TIM4_ARR_init()
{
	TIM4->ARR = 1000;


}

void TIM4_CCR1_init()
{
	TIM4->CCR1 = 300;


}


//设置马达初始化
void mada_init()
{

	 //设置RCC使能                
   	RCC->MP_AHB4ENSETR = (0x1 << 5);                                                      
	RCC->MP_APB2ENSETR = (0x1 << 3);                                                      
        //设置引脚复用功能                  
    	GPIOF->MODER &= (~(0x3 << 12));                                                       
    	GPIOF->MODER |= (0x2 << 12);                                                          
                                
    	GPIOF->AFRL &= (~(0xF << 24));                                                        
    	GPIOF->AFRL |= (0x1 << 24);   

//自动重载计数器预加载使能
	TIM16->CR1 |= 0x1<<7;
//设置边缘对齐模式(递减计数器)
	TIM16->CR1 &= (~(0x3<<5));
//设置递减计数器
    TIM1->CR1 &= ~(0x1 << 4);

//设置计数器使能
	TIM16->CR1 |= 0x1;
//设置输出使能
	TIM16->BDTR |=0x1 << 15;

//设置为pwm1模式 [16][6:4]0110 选择CH_1通道
	TIM16->CCMR1 &=(~(0x1<<16));
	TIM16->CCMR1 |=0x3<<5;
	TIM16->CCMR1 &=(~(0x1<<4));
//设置预加载使能
	TIM16->CCMR1 |=0x1<<3;

//设置为输出模式
	TIM16->CCMR1 &=(~0x3);


	TIM16->CCER &=(~(0x1<<1));
	TIM16->CCER |=0x1;

	TIM16->PSC = 208;
	TIM16->ARR = 1000;
	TIM16->CCR1 = 300;





}

//设置风扇初始化
void fengshan_init()
{

	 //设置RCC使能      
  	 RCC->MP_AHB4ENSETR = (0x1 << 4);                                                    
  	 RCC->MP_APB2ENSETR = (0x1 << 0);                                                    
          //设置引脚复用功能                   
   	 GPIOE->MODER &= (~(0x3 << 18));                                                     
  	 GPIOE->MODER |= (0x2 << 18);                                                        
                                
	GPIOE->AFRH &= (~(0xF << 4));                                                      
	GPIOE->AFRH |= (0x1 << 4); 

	TIM1->PSC = 208;
	TIM1->ARR = 1000;
	TIM1->CCR1 = 700;	

//设置为pwm1模式 [16][6:4]0110 选择pwm1
    TIM1->CCMR1 &= ~((0x1 << 16) | (0x7 << 4));
    TIM1->CCMR1 |= (0x6 << 4);

//设置预加载使能
	TIM1->CCMR1 |=0x1<<3;



	TIM1->CCER &=(~(0x1<<1));
	TIM1->CCER |=0x1;







//自动重载计数器预加载使能
	TIM1->CR1 |= 0x1<<7;
//设置边缘对齐模式(递减计数器)
	TIM1->CR1 &= (~(0x3<<5));
//设置递减计数器
    TIM1->CR1 &= ~(0x1 << 4);

//设置计数器使能
	TIM1->CR1 |= 0x1;
 
	TIM1->BDTR |=0x1 << 15;

}




.h

#ifndef __PWM_H__
#define __PWM_H__
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_tim.h"
void pwm_gpio_init();

void pwm_rcc_init();

void TIM4_CR1_init();

void TIM4_CCMR1_init();

void TIM4_CCER_init();

void TIM4_PSC_init();

void TIM4_ARR_init();

void TIM4_CCR1_init();

void mada_init();

void fengshan_init();

#endif



main.c

#include "gpio.h"

#include "uart4.h"

#include "command.h"

#include "beep.h"

#include "key-TI.h"

#include "si7006.h"

#include "pwm.h"

extern void printf(const char *fmt, ...);

void delay_ms(int ms)

{

	int i,j;

	for(i = 0; i < ms;i++)

		for (j = 0; j < 1800; j++);

}

void buzzer_init()
{
	pwm_gpio_init();



	 pwm_rcc_init();



	 TIM4_CR1_init();



	TIM4_CCMR1_init();



	TIM4_CCER_init();



	TIM4_PSC_init();



	TIM4_ARR_init();



	TIM4_CCR1_init();


}



int main(void)

{

	buzzer_init();
	
	mada_init();

	fengshan_init();





	while(1)

	{

	

	

	}

	return 0;

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值