pwm.c
#include "pwm.h"
void bee_init(unsigned int frq)
{
RCC->MP_AHB4ENSETR|=0X1<<1;//使能pb
GPIOB->MODER&=(~(0X3<<6*2));//配置pb6为复用模式
GPIOB->MODER|=(0X2<<6*2);
GPIOB->AFRL&=(~(0XF<<24));//复用为tim4
GPIOB->AFRL|=0X2<<24;
RCC->MP_APB1ENSETR|=0X1<<2;//使能tim4
//
//
//设置分频器 psc=209=0XD0+1
TIM4->PSC&=(~(0XFFFF));
TIM4->PSC|=0XD0;
//设置自动重载寄存器 arr 1000=0X3E8 200=CB
TIM4->ARR&=(~(0XFFFFFFFF));
TIM4->ARR=frq;
//配置捕获比较寄存器 ccr1 300=0x12C 100=64
TIM4->CCR1&=(~(0XFFFFFFFF));
TIM4->CCR1=frq/2;
//设置捕获比较模式寄存器 ccmr1
//设置为pwm1模式
TIM4->CCMR1&=(~(0X7<<4));
TIM4->CCMR1&=(~(0X1<<16));
TIM4->CCMR1|=0X6<<4;
//设置为预加载时使能
TIM4->CCMR1|=0X1<<3;
//设置为输出模式
TIM4->CCMR1&=(~(0X3));
//捕获比较使能寄存器 CCER
//配置输出模式
TIM4->CCER&=(~(0X1<<3));
//配置输出极性高电平
TIM4->CCER&=(~(0X1<<1));
//配置输出使能
TIM4->CCER|=0X1;
//设置tim_cr1控制寄存器:
TIM4->CR1|=0X1<<7; //使能自动重载
TIM4->CR1&=(~(0X3<<5)); //边沿对齐,
TIM4->CR1|=0X1<<4; //递减计数
TIM4->CR1|=0X1;//使能
}
void vibrate_init()
{
RCC->MP_AHB4ENSETR|=0X1<<5;//使能pf
GPIOF->MODER&=(~(0X3<<6*2));//配置pf6为复用模式
GPIOF->MODER|=(0X2<<6*2);
GPIOF->AFRL&=(~(0XF<<24));//复用为TIM16
GPIOF->AFRL|=0X1<<24;
RCC->MP_APB2ENSETR|=0X1<<3;//使能TIM16
//
//
//设置分频器 psc=209=0XD0+1
TIM16->PSC&=(~(0XFFFF));
TIM16->PSC|=0XD0;
//设置自动重载寄存器 arr 1000=0X3E8
TIM16->ARR&=(~(0XFFFF));
TIM16->ARR=1000;
//配置捕获比较寄存器 ccr1 300=0x12C
TIM16->CCR1&=(~(0XFFFF));
TIM16->CCR1=200;
//设置捕获比较模式寄存器 ccmr1:wa
//设置为pwm1模式
TIM16->CCMR1&=(~(0X7<<4));
TIM16->CCMR1&=(~(0X1<<16));
TIM16->CCMR1|=0X6<<4;
//设置为预加载时使能
TIM16->CCMR1|=0X1<<3;
//设置为输出模式
TIM16->CCMR1&=(~(0X3));
//捕获比较使能寄存器 CCER
//配置输出模式
TIM16->CCER&=(~(0X1<<3));
/是否配置补充输出使能
//TIM16->CCER|=0x1<<2;
//配置输出极性高电平
TIM16->CCER&=(~(0X1<<1));
//配置输出使能
TIM16->CCER|=0X1;
//配置主输出
// TIM16->CR2|=0X1;
TIM16->BDTR|=0X1<<15;//设置主要输出使能
//设置tim_cr1控制寄存器:
TIM16->CR1|=0X1<<7; //使能自动重载
TIM16->CR1&=(~(0X3<<5)); //边沿对齐,
TIM16->CR1|=0X1<<4; //使能和递减计数
TIM16->CR1|=0X1;
}
void fan_init()
{
RCC->MP_AHB4ENSETR|=0X1<<4;//使能pe
GPIOE->MODER&=(~(0X3<<9*2));//配置pe9为复用模式
GPIOE->MODER|=(0X2<<9*2);
GPIOE->AFRH&=(~(0XF<<4));//复用为TIM1
GPIOE->AFRH|=0X1<<4;
RCC->MP_APB2ENSETR|=0X1;//使能TIM1
//
//
//设置分频器 psc=209=0XD0+1
TIM1->PSC&=(~(0XFFFF));
TIM1->PSC|=0XD0;
//设置自动重载寄存器 arr 1000=0X3E8
TIM1->ARR&=(~(0XFFFF));
TIM1->ARR|=0X2710;
//配置捕获比较寄存器 ccr1 300=0x12C
TIM1->CCR1&=(~(0XFFFF));
TIM1->CCR1|=0X1388;
//设置捕获比较模式寄存器 ccmr1
//设置为pwm1模式
TIM1->CCMR1&=(~(0X7<<4));
TIM1->CCMR1&=(~(0X1<<16));
TIM1->CCMR1|=0X6<<4;
//设置为预加载时使能
TIM1->CCMR1|=0X1<<3;
//设置为输出模式
TIM1->CCMR1&=(~(0X3));
//捕获比较使能寄存器 CCER
//配置输出模式
TIM1->CCER&=(~(0X1<<3));
/是否配置补充输出使能
//TIM16->CCER|=0x1<<2;
//配置输出极性高电平
TIM1->CCER&=(~(0X1<<1));
//配置输出使能
TIM1->CCER|=0X1;
//配置主输出
// TIM1->CR2|=0X1;
TIM1->BDTR|=0X1<<15;//设置主要输出使能
//设置tim_cr1控制寄存器:
TIM1->CR1|=0X1<<7; //使能自动重载
TIM1->CR1&=(~(0X3<<5)); //边沿对齐,
TIM1->CR1|=0X1<<4; //使能和递减计数
TIM1->CR1|=0X1;
}
pwm.h
#ifndef __PWM__H__
#define __PWM__H__
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_tim.h"
#include "stm32mp1xx_rcc.h"
void bee_init(); //tim4_CH1
void vibrate_init();//TIM16_CH1
void fan_init();//TIM1_CH1
#endif
main.c
#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++);
}
int main()
{
//vibrate_init();
//fan_init();
while(1)
{
bee_init(1000);
delay_ms(2000);
bee_init(50);
delay_ms(2000);
bee_init(5000);
delay_ms(2000);
bee_init(100);
delay_ms(2000);
bee_init(10000);
delay_ms(2000);
bee_init(10);
delay_ms(2000);
bee_init(50000);
delay_ms(2000);
}
return 0;
}