1.pwm.h
#ifndef __PWM_H__
#define __PWM_H__
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_tim.h"
//蜂鸣器初始化
void hal_beep_init();
//风扇初始化
void hal_fan_init();
//马达初始化
void hal_monitor_init();
#endif
2.pwm.c
#include "pwm.h"
//蜂鸣器初始化 TIM4---->CH1 /PB6
void hal_beep_init()
{
/************RCC章节初始化*******/
//设置GPIOB 使能TIM4
RCC->MP_AHB4ENSETR |=(0x1 <<1);
RCC->MP_AHB4ENSETR |=(0x1 <<2);
/************GPIO章节初始化******/
//设置PB6引脚为复用功能模式
GPIOE->MODER &=(~(0x3<<12));
GPIOE->MODER |=(0x2<<12);
//设置PB6引脚复用功能为TIM4_CH1
GPIOB->AFRL &=(~(0xF<<24));
GPIOB->AFRL |=(0x1<<25);
/************TIM4章节初始化******/
//设置预分频寄存器
TIM4->PSC=208;
//设置PWM方波周期
TIM4->ARR=1000;
//设置PWM方波占空比
TIM4->CCR1=300;
//设置TIM4_CH1通道为PWM1模式
TIM4->CCR1 &=(~(0x1<<16));
TIM4->CCR1 &=(~(0x7<<4));
TIM4->CCR1 |=(0x3<<5);
//设置输出寄存器预加载使能
TIM4->CCR1 |=(0x1<<3);
//设置通道1为输出模式
TIM4->CCR1 &=(~(0x3));
//设置捕获/比较寄存输出极性
TIM4->CCER |=(0x1<<3);
//设置捕获/比较寄存输出极性,起始状态为高电平
TIM4->CCER &=(~(0x1<<1));
//设置捕获/比较寄存输出使能
TIM4->CCR1 &=(~(0x1));
//设置定时器为边沿对其方式
TIM4->CR1&=(~(0x3<<5));
//设置计数器为递减计数器方式
TIM4->CR1|=(0x1<<4);
//设置计数器使能
TIM4->CR1|=(0x1);
}
//风扇初始化 TIM4 --->CH1 /PE9
void hal_fan_init()
{
/********RCC章节********/
//设置GPIOE 使能TIM1
RCC->MP_AHB4ENSETR|=(0x1<<4);
RCC->MP_APB2ENSETR|=0x1;
/********GPIO章节********/
//设置Pe9引脚为复用功能
GPIOE->MODER&=(~(0x3<<18));
GPIOE->MODER|=((0x2<<18));
//设置Pe9引脚复用功能为TIM1_CH1
GPIOE->AFRH&=(~(0xf<<4));
GPIOE->AFRH|=(0x1<<4);
TIM1->PSC=208;
TIM1->ARR=1000;
TIM1->CCR1=300;
//设置主输出使能
TIM1->BDTR |=(0x1 <<15);
TIM4->CCR1 &=(~(0x1<<16));
TIM4->CCR1 &=(~(0x7<<4));
TIM4->CCR1 |=(0x3<<5);
TIM1->CCMR1|=(0x1<<3);
TIM1->CCMR1&=(~(0x3));
TIM1->CCER&=(~(0x1<<1));
TIM1->CCER|=(0x1);
TIM1->CR1|=(0x1<<7);
TIM1->CR1&=(~(0x3<<5));
TIM1->CR1|=(0x1<<4);
TIM1->CR1|=(0x1);
}
//马达初始化 TIMI6---->CH1 /PF6
void hal_monitor_init()
{
/********RCC章节********/
//设置GPIOF 使能TIM16
RCC->MP_AHB4ENSETR|=(0x1<<5);
RCC->MP_APB2ENSETR|=(0x1<<3);
/********GPIO章节********/
//设置PF6引脚为复用功能
GPIOF->MODER&=(~(0x3<<12));
GPIOF->MODER|=((0x2<<12));
//设置Pf6引脚复用功能为TIM16_CH1
GPIOF->AFRL&=(~(0xf<<24));
GPIOF->AFRL|=(0x1<<24);
TIM16->PSC=208;
TIM16->ARR=1000;
TIM16->CCR1=300;
//设置主输出使能
TIM16->BDTR |=(0x1 <<15);
TIM16->CCMR1&=(~(0x1<<16));
TIM16->CCMR1|=(0x6<<4);
TIM16->CCMR1|=(0x1<<3);
TIM16->CCMR1&=(~(0x3));
TIM16->CCER&=(~(0x1<<3));
TIM16->CCER|=(0x1<<1);
TIM16->CCER|=(0x1);
TIM16->CR1|=(0x1<<7);
TIM16->CR1&=(~(0x3<<5));
TIM16->CR1|=(0x1<<4);
TIM16->CR1|=(0x1);
}
3.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()
{
// hal_beep_init();
// hal_fan_init();
hal_monitor_init();
while(1)
{
}
return 0;
}