嵌入式学习--tim定时器使用

嵌入式学习--蜂鸣器,振动马达,风扇

pwm.c

#include "pwm.h"                                 
                                                 
void bee_init(unsigned int frq)                  
{                                                
RCC->MP_AHB4ENSETR|=0X1<<1;//使能pb              
GPIOB->MODER&=(~(0X3<<6*2));//配置pb6为复用模式  
GPIOB->MODER|=(0X2<<6*2);                        
GPIOB->AFRL&=(~(0XF<<24));//复用为tim4           
GPIOB->AFRL|=0X2<<24;                            
RCC->MP_APB1ENSETR|=0X1<<2;//使能tim4            
//                                               
//                                               
//设置分频器 psc=209=0XD0+1                      
TIM4->PSC&=(~(0XFFFF));                          
TIM4->PSC|=0XD0;                                 
//设置自动重载寄存器 arr 1000=0X3E8 200=CB       
TIM4->ARR&=(~(0XFFFFFFFF));                      
TIM4->ARR=frq;                                   
//配置捕获比较寄存器 ccr1  300=0x12C 100=64      
TIM4->CCR1&=(~(0XFFFFFFFF));                     
TIM4->CCR1=frq/2;                                
//设置捕获比较模式寄存器 ccmr1                   
    //设置为pwm1模式                             
    TIM4->CCMR1&=(~(0X7<<4));                    
    TIM4->CCMR1&=(~(0X1<<16));                   
    TIM4->CCMR1|=0X6<<4;                         
    //设置为预加载时使能                         
    TIM4->CCMR1|=0X1<<3;                         
    //设置为输出模式                             
    TIM4->CCMR1&=(~(0X3));                       
//捕获比较使能寄存器 CCER                        
    //配置输出模式                               
    TIM4->CCER&=(~(0X1<<3));                     
    //配置输出极性高电平                         
    TIM4->CCER&=(~(0X1<<1));                     
    //配置输出使能                               
    TIM4->CCER|=0X1;                             
//设置tim_cr1控制寄存器:                         
TIM4->CR1|=0X1<<7;  //使能自动重载               
TIM4->CR1&=(~(0X3<<5)); //边沿对齐,              
TIM4->CR1|=0X1<<4;  //递减计数                   
TIM4->CR1|=0X1;//使能                            
}                                                
                                                 
void vibrate_init()                              
{                                                
RCC->MP_AHB4ENSETR|=0X1<<5;//使能pf              
GPIOF->MODER&=(~(0X3<<6*2));//配置pf6为复用模式  
GPIOF->MODER|=(0X2<<6*2);                        
GPIOF->AFRL&=(~(0XF<<24));//复用为TIM16          
GPIOF->AFRL|=0X1<<24;                            
RCC->MP_APB2ENSETR|=0X1<<3;//使能TIM16           
//                                               
//                                               
//设置分频器 psc=209=0XD0+1                      
TIM16->PSC&=(~(0XFFFF));                         
TIM16->PSC|=0XD0;                                
//设置自动重载寄存器 arr 1000=0X3E8              
TIM16->ARR&=(~(0XFFFF));                         
TIM16->ARR=1000;                                 
//配置捕获比较寄存器 ccr1  300=0x12C             
TIM16->CCR1&=(~(0XFFFF));                        
TIM16->CCR1=200;                                 
//设置捕获比较模式寄存器 ccmr1:wa                
                                                 
    //设置为pwm1模式                             
    TIM16->CCMR1&=(~(0X7<<4));                   
    TIM16->CCMR1&=(~(0X1<<16));                  
    TIM16->CCMR1|=0X6<<4;                        
    //设置为预加载时使能                         
    TIM16->CCMR1|=0X1<<3;                        
    //设置为输出模式                             
    TIM16->CCMR1&=(~(0X3));                      
//捕获比较使能寄存器 CCER                        
    //配置输出模式                               
    TIM16->CCER&=(~(0X1<<3));                    
    /是否配置补充输出使能                
    //TIM16->CCER|=0x1<<2;                       
    //配置输出极性高电平                         
    TIM16->CCER&=(~(0X1<<1));                    
    //配置输出使能                               
    TIM16->CCER|=0X1;                            
//配置主输出                                     
//  TIM16->CR2|=0X1;                             
    TIM16->BDTR|=0X1<<15;//设置主要输出使能      
//设置tim_cr1控制寄存器:                         
TIM16->CR1|=0X1<<7; //使能自动重载               
TIM16->CR1&=(~(0X3<<5));    //边沿对齐,          
TIM16->CR1|=0X1<<4; //使能和递减计数             
TIM16->CR1|=0X1;                                 
}                                                
void fan_init()                                  
{                                                
RCC->MP_AHB4ENSETR|=0X1<<4;//使能pe              
GPIOE->MODER&=(~(0X3<<9*2));//配置pe9为复用模式  
GPIOE->MODER|=(0X2<<9*2);                        
GPIOE->AFRH&=(~(0XF<<4));//复用为TIM1            
GPIOE->AFRH|=0X1<<4;                             
RCC->MP_APB2ENSETR|=0X1;//使能TIM1               
//                                               
//                                               
//设置分频器 psc=209=0XD0+1                      
TIM1->PSC&=(~(0XFFFF));                          
TIM1->PSC|=0XD0;                                 
//设置自动重载寄存器 arr 1000=0X3E8              
TIM1->ARR&=(~(0XFFFF));                          
TIM1->ARR|=0X2710;                               
//配置捕获比较寄存器 ccr1  300=0x12C             
TIM1->CCR1&=(~(0XFFFF));                         
TIM1->CCR1|=0X1388;                              
//设置捕获比较模式寄存器 ccmr1                   
    //设置为pwm1模式                             
    TIM1->CCMR1&=(~(0X7<<4));                    
    TIM1->CCMR1&=(~(0X1<<16));                   
    TIM1->CCMR1|=0X6<<4;                         
    //设置为预加载时使能                         
    TIM1->CCMR1|=0X1<<3;                         
    //设置为输出模式                             
    TIM1->CCMR1&=(~(0X3));                       
//捕获比较使能寄存器 CCER                        
    //配置输出模式                               
    TIM1->CCER&=(~(0X1<<3));                     
    /是否配置补充输出使能                
    //TIM16->CCER|=0x1<<2;                       
    //配置输出极性高电平                         
    TIM1->CCER&=(~(0X1<<1));                     
    //配置输出使能                               
    TIM1->CCER|=0X1;                             
//配置主输出                                     
//  TIM1->CR2|=0X1;                              
    TIM1->BDTR|=0X1<<15;//设置主要输出使能       
//设置tim_cr1控制寄存器:                         
TIM1->CR1|=0X1<<7; //使能自动重载                
TIM1->CR1&=(~(0X3<<5));    //边沿对齐,           
TIM1->CR1|=0X1<<4; //使能和递减计数              
TIM1->CR1|=0X1;                                  
}                                                
                                                 
                                                 

pwm.h

#ifndef __PWM__H__             
#define __PWM__H__             
#include "stm32mp1xx_gpio.h"   
#include "stm32mp1xx_tim.h"    
#include "stm32mp1xx_rcc.h"    
void bee_init(); //tim4_CH1    
                               
                               
void vibrate_init();//TIM16_CH1
                               
void fan_init();//TIM1_CH1     
                               
                               
                               
                               
                               
                               
                               
                               
                               
                               
                               
                               
                               
#endif                         

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()
{
//vibrate_init();
//fan_init();

while(1)
{

bee_init(1000);
delay_ms(2000);
bee_init(50);
delay_ms(2000);
bee_init(5000);
delay_ms(2000);
bee_init(100);
delay_ms(2000);
bee_init(10000);
delay_ms(2000);
bee_init(10);                            
delay_ms(2000);
bee_init(50000);
delay_ms(2000);


}
        return 0;

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值