作业-----2.28编写蜂鸣器/风扇/马达代码

该代码实现STM32MP1XX微控制器对蜂鸣器、马达和风扇的PWM控制初始化。通过设置RCC、GPIO和TIM寄存器,配置分频器、自动重载计数器和输出模式,以达到控制不同设备的工作频率和状态。
摘要由CSDN通过智能技术生成

编写蜂鸣器/风扇/马达代码

  pwm.h

#ifndef  __PWM_H__
#define  __PWM_H__
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_tim.h"
//蜂鸣器初始化
void beep_init();
//马达初始化
void monitor_init();
//风扇初始化
void fan_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 |= (0x1 << 13);//设置为复用模式
	GPIOB->AFRL &= (~(0xf << 24));
	GPIOB->AFRL |= (0x1 << 25);//设为复用功能TIM4_CH1 
	/*******TIM章节**********/
	//设置分频器
	TIM4->PSC &= (~(0xffff));
    TIM4->PSC |= (0xD0);
    //TIM4 ARR自动重载计数器 1000 ---> 1000Hz
    TIM4->ARR &= (~(0xffff));
    TIM4->ARR |= (0x3E8);
    //TIM4 CR1
    TIM4->CR1 |= (0x1 << 7);     //自动重载计数器使能    
    TIM4->CR1 &= (~(0x3 << 5)); //边沿对齐模式
    TIM4->CR1 |= (0x1 << 4);     //采用递减计数
    TIM4->CR1 |= (0x1);         //计时器使能
    //TIM4 CCMR1
    TIM4->CCMR1 &= (~(0x1 << 16));
    TIM4->CCMR1 |= (0x3 << 5);
    TIM4->CCMR1 &= (~(0x1 << 4)); //28~30 设置输出模式为PWM模式
    TIM4->CCMR1 |= (0x1 << 3);       //比较计算器使能
    TIM4->CCMR1 &= (~(0x3));       //设置通道输出模式
    //TIM4 CCER
    TIM4->CCER &= (~(0x1 << 3));  //设置通道1为输出模式
    TIM4->CCER &= (~(0x1 << 1));  //配置通道1起始高电平
    TIM4->CCER |= (0x1 << 0);       //配置通道1输出使能
    //TIM4 CCR1 捕获/比较计算器 700
    TIM4->CCR1 &= (~(0xffff));
    TIM4->CCR1 |= (0x2BC);
}

//马达初始化 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 |= (0x1 << 13);
	GPIOF->AFRL &= (~(0xf << 24));//设置复用功能为TIM16_CH1
	GPIOF->AFRL |= (0x1 << 24);

	/*******TIM章节**********/
	//设置分频器
	TIM16->PSC &= (~(0xffff));
    TIM16->PSC |= (0xD0);
    //TIM16 ARR自动重载计数器 1000 ---> 1000Hz
    TIM16->ARR &= (~(0xffff));
    TIM16->ARR |= (0x3E8);
	
    //TIM16 CR1
    TIM16->CR1 |= (0x1 << 7);     //自动重载计数器使能    
    TIM16->CR1 &= (~(0x3 << 5)); //边沿对齐模式
    TIM16->CR1 |= (0x1 << 4);     //采用递减计数
    TIM16->CR1 |= (0x1);         //计时器使能
    //TIM16 CCMR1
    TIM16->CCMR1 &= (~(0x1 << 16));
    TIM16->CCMR1 |= (0x3 << 5);
    TIM16->CCMR1 &= (~(0x1 << 4)); //28~30 设置输出模式为PWM模式
    TIM16->CCMR1 |= (0x1 << 3);       //比较计算器使能
    TIM16->CCMR1 &= (~(0x3));       //设置通道输出模式
    //TIM16 CCER
    TIM16->CCER &= (~(0x1 << 3));  //设置通道1为输出模式
    TIM16->CCER &= (~(0x1 << 1));  //配置通道1起始高电平
    TIM16->CCER |= (0x1 << 0);       //配置通道1输出使能
    //TIM16 CCR1 捕获/比较计算器
    TIM16->CCR1 &= (~(0xffff));
    TIM16->CCR1 |= (0x2BC);
    //TIM16 BDTR
    TIM16->BDTR |= (0x1 << 15);

}
//风扇初始化 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 |=(0x1<<19);
	GPIOE->AFRH &=(~(0xf<<4));//设置复用功能为TIM1_CH1
	GPIOE->AFRH |=(0x1<<4);	
	/*******TIM章节**********/
	//设置分频器
	TIM1->PSC &= (~(0xffff));
    TIM1->PSC |= (0xD0);
    //TIM16 ARR自动重载计数器 1000 ---> 1000Hz
    TIM1->ARR &= (~(0xffff));
    TIM1->ARR |= (0x3E8);
 	//TIM1 CR1
    TIM1->CR1 |= (0x1 << 7);     //自动重载计数器使能    
    TIM1->CR1 &= (~(0x3 << 5)); //边沿对齐模式
    TIM1->CR1 |= (0x1 << 4);     //采用递减计数
    TIM1->CR1 |= (0x1);         //计时器使能
    //TIM4 CCMR1
    TIM1->CCMR1 &= (~(0x1 << 16));
    TIM1->CCMR1 |= (0x3 << 5);
    TIM1->CCMR1 &= (~(0x1 << 4)); //28~30 设置输出模式为PWM模式
    TIM1->CCMR1 |= (0x1 << 3);       //比较计算器使能
    TIM1->CCMR1 &= (~(0x3));       //设置通道输出模式
    //TIM1 CCER
    TIM1->CCER &= (~(0x1 << 3));  //设置通道1为输出模式
    TIM1->CCER &= (~(0x1 << 1));  //配置通道1起始高电平
    TIM1->CCER |= (0x1 << 0);       //配置通道1输出使能
    //TIM1 CCR1 捕获/比较计算器 700
    TIM1->CCR1 &= (~(0xffff));
    TIM1->CCR1 |= (0x2BC);
    //TIM1 BDTR 输出使能
    TIM1->BDTR |= (0x1 << 15);
}

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)

{

	//蜂鸣器初始化

	//beep_init();

	//马达初始化

	monitor_init();

	//风扇初始化

	//fan_init();

	

	while(1)

	{};

	return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值