pwm.h:
#ifndef __PWM_H__
#define __PWM_H__
#include "stm32mp1xx_tim.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
//蜂鸣器初始化
void beep_init();
//风扇初始化
void fan_init();
//马达初始化
void monitor_init();
#endif
pwm.c:
#include "pwm.h"
//蜂鸣器初始化 PB6---->TIM4_CH1
void beep_init()
{
/********RCC章节********/
RCC->MP_AHB4ENSETR |= (0x1<<1);//使能GPIOB组控制器
RCC->MP_APB1ENSETR |= (0x1<<2);//使能TIM4组控制器
/********GPIO章节********/
GPIOB->MODER &= (~(0x3<<12));
GPIOB->MODER |= (0x2<<12);//MODER寄存器设置为复用模式
//将PB6引脚设置为TIM4_CH1功能
GPIOB->AFRL &=(~(0xf<<24));
GPIOB->AFRL |=(0x2<<24); //AFRL--->AF2
/********TIM4章节 1000HZ ~ 2000HZ 方波信号********/
TIM4->PSC =208;
TIM4->ARR =1000;
TIM4->CCR1 =700;
//计数器初始化
TIM4->CR1 |=(0x1<<7);//设置自动重载计数器预加载使能
TIM4->CR1 &=(~(0x3<<5));//设置定时器为边沿对齐
TIM4->CR1 |=(0x1<<4);//设置计数器为递减计数器方式
TIM4->CR1 |=0x1;//设置计数器使能
//比较/捕获寄存器模式选择
TIM4->CCMR1 &=(~(0x1<<16));
TIM4->CCMR1 &=(~(0x7<<4));//输出比较模式为PWM模式
TIM4->CCMR1 |=(0x6<<4);
TIM4->CCMR1 |=(0x1<<3);//设置输出比较寄存器使能
TIM4->CCMR1 &=(~(0x3));//设置通道为输出模式
//设置TIM4_CH1通道模式
TIM4->CCER &=(~(0x1<<3));//配置通道1为输出极性模式
TIM4->CCER &=(~(0x1<<1));//配置通道1起始电平状态
TIM4->CCER |=0x1;//配置通道1使能
}
//风扇初始化 PE9---->TIM1_CH1
void fan_init()
{
/********RCC章节********/
RCC->MP_AHB4ENSETR |= (0x1<<4);//使能GPIOE组控制器
RCC->MP_APB2ENSETR |= (0x1<<0);//使能TIM1组控制器
/********GPIO章节********/
GPIOE->MODER &= (~(0x3<<18));
GPIOE->MODER |= (0x2<<18);//MODER寄存器设置为复用模式
//将PE9引脚设置为TIM1_CH1功能
GPIOE->AFRH &=(~(0xf<<4));
GPIOE->AFRH |=(0x1<<4); //AFRH--->AF1
/********TIM1章节 1000HZ ~ 2000HZ 方波信号********/
TIM1->PSC =208;
TIM1->ARR =1000;
TIM1->CCR1 =700;
TIM1->BDTR |=(0x1<<15);//主输出使能
//计数器初始化
TIM1->CR1 |=(0x1<<7);//设置自动重载计数器预加载使能
TIM1->CR1 &=(~(0x3<<5));//设置定时器为边沿对齐
TIM1->CR1 |=(0x1<<4);//设置计数器为递减计数器方式
TIM1->CR1 |=0x1;//设置计数器使能
//比较/捕获寄存器模式选择
TIM1->CCMR1 &=(~(0x1<<16));
TIM1->CCMR1 &=(~(0x7<<4));//输出比较模式为PWM模式
TIM1->CCMR1 |=(0x6<<4);
TIM1->CCMR1 |=(0x1<<3);//设置输出比较寄存器使能
TIM1->CCMR1 &=(~(0x3));//设置通道为输出模式
//设置TIM4_CH1通道模式
TIM1->CCER &=(~(0x1<<3));//配置通道1为输出极性模式
TIM1->CCER &=(~(0x1<<1));//配置通道1起始电平状态
TIM1->CCER |=0x1;//配置通道1使能
}
//马达初始化 PF6---->TIM16_CH1
void monitor_init()
{
/********RCC章节********/
RCC->MP_AHB4ENSETR |= (0x1<<5);//使能GPIOF组控制器
RCC->MP_APB2ENSETR |= (0x1<<3);//使能TIM16组控制器
/********GPIO章节********/
GPIOF->MODER &= (~(0x3<<12));
GPIOF->MODER |= (0x2<<12);//MODER寄存器设置为复用模式
//将PB6引脚设置为TIM16_CH1功能
GPIOF->AFRL &=(~(0xf<<24));
GPIOF->AFRL |=(0x1<<24); //AFRL--->AF1
/********TIM16章节 1000HZ ~ 2000HZ 方波信号********/
TIM16->PSC =208;
TIM16->ARR =1000;
TIM16->CCR1 =700;
TIM16->BDTR |=(0x1<<15);//主输出使能
//计数器初始化
TIM16->CR1 |=(0x1<<7);//设置自动重载计数器预加载使能
TIM16->CR1 &=(~(0x3<<5));//设置定时器为边沿对齐
TIM16->CR1 |=(0x1<<4);//设置计数器为递减计数器方式
TIM16->CR1 |=0x1;//设置计数器使能
//比较/捕获寄存器模式选择
TIM16->CCMR1 &=(~(0x1<<16));
TIM16->CCMR1 &=(~(0x7<<4));//输出比较模式为PWM模式
TIM16->CCMR1 |=(0x6<<4);
TIM16->CCMR1 |=(0x1<<3);//设置输出比较寄存器使能
TIM16->CCMR1 &=(~(0x3));//设置通道为输出模式
//设置TIM4_CH1通道模式
TIM16->CCER &=(~(0x1<<3));//配置通道1为输出极性模式
TIM16->CCER &=(~(0x1<<1));//配置通道1起始电平状态
TIM16->CCER |=0x1;//配置通道1使能
}
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()
{
beep_init();
fan_init();
monitor_init();
while(1)
{
}
return 0;
}