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

.c #include "pwm.h"void pwm_gpio_init(){//设置RCC使能RCC->MP_AHB4ENSETR |= 0x1MO

.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]0110TIM4->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 选择pwm1TIM1->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;}