2月28号作业

该代码实现了一个在STM32MP1xx微控制器上的PWM功能,用于控制蜂鸣器、风扇和马达。通过配置RCC、GPIO和定时器寄存器,初始化相应的外设,设置PWM通道的占空比以控制设备的工作状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:实现蜂鸣器,风扇,马达功能

代码:

pwm.h

#ifndef __PWM_H__               
#define __PWM_H__               
#include "stm32mp1xx_rcc.h"     
#include "stm32mp1xx_gpio.h"    
#include "stm32mp1xx_tim.h"     
void beep_init();               
void fan_init();                
void monitor_init();            
                                
#endif                          

pwm.c

#include "pwm.h"

void beep_init()
{
    RCC->MP_AHB4ENSETR|=(0x1<<1);
    RCC->MP_APB1ENSETR|=(0x1<<2);

    GPIOB->MODER&=(~(0x3<<12));
    GPIOB->MODER|=(0x2<<12);

    GPIOB->AFRL&=(~(0xf<<24));
    GPIOB->AFRL|=(0x2<<24);

    TIM4->PSC=0xD0;
    TIM4->ARR=0x3E8;
    TIM4->CCR1=0x2BC;


    TIM4->CCMR1&=(~(0x7<<4));
    TIM4->CCMR1&=(~(0x1<<16));
    TIM4->CCMR1|=(0x6<<4);
    
    TIM4->CCMR1|=(0x1<<3);
    TIM4->CCMR1&=(~(0x3<<0));

    TIM4->CCER&=(~(0x1<<3));
    TIM4->CCER&=(~(0x1<<1));
    TIM4->CCER|=(0x1<<0);
    

    TIM4->CR1|=(0x1<<7);
    TIM4->CR1&=(~(0x3<<5));
    TIM4->CR1|=(0x1<<4);
    TIM4->CR1|=(0x1<<0);

}
void fan_init()
{
    RCC->MP_AHB4ENSETR|=(0x1<<4);          
    RCC->MP_APB2ENSETR|=(0x1<<0);          

    GPIOE->MODER&=(~(0x3<<18));            
    GPIOE->MODER|=(0x2<<18);               

    GPIOE->AFRH&=(~(0xf<<4));             
    GPIOE->AFRH|=(0x1<<4);                

    TIM1->PSC=0xD0;                        
    TIM1->ARR=0x3E8;                       
    TIM1->CCR1=0x2BC;                      


    TIM1->CCMR1&=(~(0x7<<4));              
    TIM1->CCMR1&=(~(0x1<<16));             
    TIM1->CCMR1|=(0x6<<4);                 

    TIM1->CCMR1|=(0x1<<3);                 
    TIM1->CCMR1&=(~(0x3<<0));              

    TIM1->CCER&=(~(0x1<<3));               
    TIM1->CCER&=(~(0x1<<1));               
    TIM1->CCER|=(0x1<<0);                  

    TIM1->BDTR|=(0x1<<15);

    TIM1->CR1|=(0x1<<7);                   
    TIM1->CR1&=(~(0x3<<5));                
    TIM1->CR1|=(0x1<<4);                   
    TIM1->CR1|=(0x1<<0);                 

}
void monitor_init()
{
    RCC->MP_AHB4ENSETR|=(0x1<<5);             
    RCC->MP_APB2ENSETR|=(0x1<<3);             
                                              
    GPIOF->MODER&=(~(0x3<<12));               
    GPIOF->MODER|=(0x2<<12);                  
                                              
    GPIOF->AFRL&=(~(0xf<<24));                
    GPIOF->AFRL|=(0x1<<24);                   
                                              
    TIM16->PSC=0xD0;                           
    TIM16->ARR=0x3E8;                          
    TIM16->CCR1=0x2BC;                         
                                              
                                              
    TIM16->CCMR1&=(~(0x7<<4));                 
    TIM16->CCMR1&=(~(0x1<<16));                
    TIM16->CCMR1|=(0x6<<4);                    
                                              
    TIM16->CCMR1|=(0x1<<3);                    
    TIM16->CCMR1&=(~(0x3<<0));                 
                                              
    TIM16->CCER&=(~(0x1<<3));                  
    TIM16->CCER&=(~(0x1<<1));                  
    TIM16->CCER|=(0x1<<0);                     
                                              
    TIM16->BDTR|=(0x1<<15);
                                              
    TIM16->CR1|=(0x1<<7);                      
    //TIM16->CR1&=(~(0x3<<5));                 
    //TIM16->CR1|=(0x1<<4);                    
    TIM16->CR1|=(0x1<<0);                      
                                              

}

main.c

#include "mix.h"                            
#include "spi.h"                            
#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;                               
}                                           
                                            

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值