10.2-国庆-作业

使用pwm方波驱动蜂鸣器、马达、风扇

 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(void)
{
	//buzzer_init();//蜂鸣器
	//motor_init();//马达
	fan_init();//风扇
	while(1)
	{

	}

	return 0;
}

 pwm.c

#include "pwm.h"

/*******蜂鸣器**********/
void buzzer_init()
{
	/*******RCC章节**********/
	RCC->MP_AHB4ENSETR |= (0x1 << 1);//GPIOB使能
	RCC->MP_APB1ENSETR |= (0x1 << 2);//TIM4使能
	/*******GPIO章节**********/
	GPIOB->MODER &= (~(0x3 << 12));
	GPIOB->MODER |= (0x1 << 13);//设置为复用模式
	GPIOB->AFRL &= (~(0xf << 24));
	GPIOB->AFRL |= (0x1 << 25);//设为复用功能TIM4_CH1 
	/*******TIM章节**********/
	TIM4->PSC = 209;//设置分频器 209
	TIM4->ARR = 1000;//设置周期,自动重载计数器赋值1000
	TIM4->CCR1 = 300;//设置占空比,比较、捕获寄存器300
	TIM4->CCMR1 &= (~(0x1 << 16));
	TIM4->CCMR1 &= (~(0x7 << 4));
	TIM4->CCMR1 |= (0x3 << 5);//设置为PWM1模式
	TIM4->CCER |= (0x1 << 0);//设置为预加载使能
	TIM4->CCMR1 &= (~(0x3 << 0));//设置为输出模式
	TIM4->CCER |= (0x1 << 3);
	TIM4->CCER &= (~(0x3 << 0));//设置为输出模式极性高电平
	TIM4->CCMR1 |= (0x1 << 3);//设置比较、捕获寄存器使能
	TIM4->CR1 |= (0x1 << 7);//设置自动重载计数器预加载使能
	TIM4->CR1 &= (~(0x3 << 5));//设置为边沿对齐方式
	TIM4->CR1 |= (0x1 << 4);//设置为递减计数方式
	TIM4->CR1 |= (0x1 << 0);//设置计数器使能
}

/*******马达**********/
void motor_init()
{  
	/*******RCC章节**********/
	RCC->MP_AHB4ENSETR |= (0x1 << 5);
	RCC->MP_APB2ENSETR |= (0x1 << 3);

	/*******GPIO章节**********/
	GPIOF->MODER &= (~(0x3 << 12));
	GPIOF->MODER |= (0x1 << 13);
	GPIOF->AFRL &= (~(0xf << 24));
	GPIOF->AFRL |= (0x1 << 24);

	/*******TIM章节**********/
	TIM16->PSC = 0xD0;//设置分频器
	TIM16->ARR = 0x3E8;//设置重载计数器,会影响PWM方波的周期和频率
	TIM16->CCR1 = 0x12C;//设置比较寄存器,占空比
	TIM16->CR1 |= (0x1 << 7);//自动重载计数器预加载使能
	TIM16->CR1 |= (0x1 << 0);//设置计数器使能
	TIM16->CCMR1 &= (~(0x1 << 16));//设置为输出模式 16,[6:4]--->0110
	TIM16->CCMR1 &= (~(0x7 << 4));
	TIM16->CCMR1 |= (0x3 << 5);
	TIM16->CCMR1 |= (0x1 << 3);//预加载使能
	TIM16->CCMR1 &= (~(0x3 << 0));//设置为输出模式
	TIM16->CCER |= (0x1 << 1);//设置起始高电平
	TIM16->CCER |= (0x1 << 0);//输出使能
	TIM16->BDTR |= (0x1 << 15);//总输出使能
}

/*******风扇**********/
void fan_init()
{
	/*******RCC章节**********/
	RCC->MP_AHB4ENSETR |= (0x1 << 4);
	RCC->MP_APB2ENSETR |= (0x1 << 0);

	/*******GPIO章节**********/
	GPIOE->MODER &= (~(0x3 << 18));
	GPIOE->MODER |= (0x1 << 19);
	GPIOE->AFRH &= (~(0xf << 4));
	GPIOE->AFRH |= (0x1 << 4);

	/*******TIM章节**********/
	TIM1->PSC = 0xD0;//设置分频器
	TIM1->ARR = 0x1F4;//设置重载计数器,风扇稍微加快频率
	TIM1->CCR1 = 0x12C;//设置比较寄存器,占空比
	TIM1->CR1 |= (0x1 << 7);
	TIM1->CR1 &= (~(0x3 << 5));
	TIM1->CR1 |= (0x1 << 4);
	TIM1->CR1 |= (0x1 << 0);
	TIM1->CCMR1 &= (~(0x1 << 16));
	TIM1->CCMR1 &= (0x7 << 4);
	TIM1->CCMR1 |= (0x3 << 5);
	TIM1->CCMR1 |= (0x1 << 3);
	TIM1->CCMR1 &= (~(0x3 << 0));
	TIM1->CCER |= (0x1 << 3);//设置为输出模式
	TIM1->CCER &= (~(0x1 << 1));//设置起始电平为高
	TIM1->CCER |= (0x1 << 0);//设置输出使能
	TIM1->BDTR |= (0x1 << 15);//总输出使能
}

pwm.h

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

void motor_init();

void fan_init();
#endif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值