2022-10-2 PWM方波实验(复习)

PWM方波实验的内容是关于无源蜂鸣器的实验,包括了马达还有风扇,首先是代码头文件包含部分,包括对蜂鸣器,马达,风扇的初始化

#ifndef __BEEP_H__
#define __BEEP_H__

#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_tim.h"


void beep_init();

void fengshan_init();

void mada_init();

#endif

以上是头文件部分,三个设备的初始化,已经需要包含的库文件

下面是功能函数部分,对蜂鸣器以及其他两个设备RCC章节,GPIO章节还有TIM章节的分析和引脚配置,

#include "beep.h"

// 蜂鸣器 --> PB6--> TIM4_CH1 --> APB1
void  beep_init(int i)
{
	// 1. 设置GPIOB,TIM4的时钟使能   RCC_MP_AHB4ENSETR[1]  RCC_MP_APB1ENSETR[2]
    RCC->MP_AHB4ENSETR = (0x1 << 1);
    RCC->MP_APB1ENSETR = (0x1 << 2);
	// 2. 设置PB6引脚为复用功能       GPIOB_MODER[13:12]
	GPIOB->MODER &= (~(0x3 << 12));
    GPIOB->MODER |= (0x2 << 12);
	// 3. 设置PB6引脚为TIM4_CH1功能   GPIOB_AFRL[27:24]
    GPIOB->AFRL &= (~(0xF << 24));
    GPIOB->AFRL |= (0x2 << 24);
	// 4. 设置预分频寄存器,TIM4_PSC[15:0] = 208   // CK_PSC = 209MHz
	// 		提供给TIM4的时钟源的频率是209MHz
   // TIM4->PSC = 209-1;
    TIM4->PSC = i;
       	// 5. 设置PWM方波的最终的周期  TIM4_ARR[16:0] = 1000
	// 		得到一个1000-2000Hz的方波
    TIM4->ARR = 1000;
	// 6. 设置PWM方波的占空比   TIM4_CCR1[16:0] = 700
    TIM4->CCR1 = 700;
	// 7. 设置TIM4_CH1通道为PWM1模式
	// 		TIM4_CCMR1[16] = 0b0  TIM4_CCMR1[6:4] = 0b110   // pwm模式1  = 0b0110
    TIM4->CCMR1 &= ~((0x1 << 16) | (0x7 << 4));
    TIM4->CCMR1 |= (0x6 << 4);

	// 8. 设置TIM4_CH1通道使能TIMx_CCR1预加载使能寄存器
	// 		TIM4_CCMR1[3] = 0x1
    TIM4->CCMR1 |= (0x1 << 3);
	// 9. 设置TIM4_CH1通道输出PWM方波的极性,
	// 	  TIM4_CCER[1] = 0x1 or 0x0
    // TIM4->CCER |= (0x1 << 1);
    TIM4->CCER &= ~(0x1 << 1);
	// 10. 设置TIM4_CH1通道的输出使能位,输出PWM方波
	// 		TIM4_CCER[0] = 0x1
    TIM4->CCER |= (0x1 << 0);
	// 11. 设置TIM4_CH1通道的TIMx_ARR预装载寄存器的缓冲区的使能
	// 		TIM4_CR1[7] = 0x1
    TIM4->CR1 |= (0x1 << 7);
	// 12. 设置定时器的计数方式,边沿对齐
	// 		TIM4_CR1[6:5] = 0x0
    TIM4->CR1 &= (~(0x3 << 5));
	// 12 设置定时器计数的方向,采用递减计数/递增计数
	// 		TIM4_CR1[4] = 0x0
    TIM4->CR1 &= (~(0x1 << 4));
	// 13. 使能TIM4_CH1计数器
	// 		TIM4_CR1[0] = 0x1
    TIM4->CR1 |= (0x1 << 0);
}


//风扇 -->PE9-->TIM1_CH1-->APB2
void fengshan_init()
{
   // 1. 设置GPIOE,TIM1的时钟使能        
   RCC->MP_AHB4ENSETR = (0x1 << 4);                                                    
   RCC->MP_APB2ENSETR = (0x1 << 0);                                                    
   // 2. 设置PE9引脚为复用功能       GPIOB_MODER[13:12]                                
   GPIOE->MODER &= (~(0x3 << 18));                                                     
   GPIOE->MODER |= (0x2 << 18);                                                        
   // 3. 设置PB6引脚为TIM4_CH1功能   GPIOB_AFRL[27:24]                                 
   GPIOE->AFRH &= (~(0xF << 4));                                                      
   GPIOE->AFRH |= (0x1 << 4);                                                         
 

   
   // 4. 设置预分频寄存器,TIM4_PSC[15:0] = 208   // CK_PSC = 209MHz                   
   //      提供给TIM4的时钟源的频率是209MHz                                            
   TIM1->PSC = 209-1;                                                                  
   // 5. 设置PWM方波的最终的周期  TIM4_ARR[16:0] = 1000                                
   //      得到一个1000-2000Hz的方波                                                   
   TIM1->ARR = 1000;                                                                   
   // 6. 设置PWM方波的占空比   TIM4_CCR1[16:0] = 700                                   
   TIM1->CCR1 = 700;                                                                   
   // 7. 设置TIM4_CH1通道为PWM1模式                                                    
   //      TIM4_CCMR1[16] = 0b0  TIM4_CCMR1[6:4] = 0b110   // pwm模式1  = 0b0110       
   TIM1->CCMR1 &= ~((0x1 << 16) | (0x7 << 4));                                         
   TIM1->CCMR1 |= (0x6 << 4);                                                          
                                                                                       
   // 8. 设置TIM4_CH1通道使能TIMx_CCR1预加载使能寄存器                                 
   //      TIM4_CCMR1[3] = 0x1                                                         
   TIM1->CCMR1 |= (0x1 << 3);                                                          
   // 9. 设置TIM4_CH1通道输出PWM方波的极性,                                           
   //    TIM4_CCER[1] = 0x1 or 0x0                                                     
   // TIM4->CCER |= (0x1 << 1);                                                        
   TIM1->CCER &= ~(0x1 << 1);                                                          
   // 10. 设置TIM4_CH1通道的输出使能位,输出PWM方波                                    
   //      TIM4_CCER[0] = 0x1                                                          
    TIM1->CCER |= (0x1 << 0);                                         
    // 11. 设置TIM4_CH1通道的TIMx_ARR预装载寄存器的缓冲区的使能       
    //      TIM4_CR1[7] = 0x1   
	TIM1->BDTR |=0x1 << 15;
    TIM1->CR1 |= (0x1 << 7);                                          
    // 12. 设置定时器的计数方式,边沿对齐                             
    //      TIM4_CR1[6:5] = 0x0                                       
    TIM1->CR1 &= (~(0x3 << 5));                                       
    // 12 设置定时器计数的方向,采用递减计数/递增计数                 
    //      TIM4_CR1[4] = 0x0                                         
    TIM1->CR1 &= (~(0x1 << 4));                                       
    // 13. 使能TIM4_CH1计数器                                         
    //      TIM4_CR1[0] = 0x1                                         
    TIM1->CR1 |= (0x1 << 0);                                          




}


//马达 -->PF6-->TIM16_CH1-->APB2
void mada_init()
{

    // 1. 设置GPIOF,TIM16的时钟使能            
    RCC->MP_AHB4ENSETR = (0x1 << 5);                                                      
    RCC->MP_APB2ENSETR = (0x1 << 3);                                                      
    // 2. 设置PF6引脚为复用功能       GPIOB_MODER[13:12]                                  
    GPIOF->MODER &= (~(0x3 << 12));                                                       
    GPIOF->MODER |= (0x2 << 12);                                                          
    // 3. 设置PF6引脚为TIM4_CH1功能   GPIOB_AFRL[27:24]                                   
    GPIOF->AFRL &= (~(0xF << 24));                                                        
    GPIOF->AFRL |= (0x1 << 24);                                                           
    // 4. 设置预分频寄存器,TIM4_PSC[15:0] = 208   // CK_PSC = 209MHz                     
    //      提供给TIM4的时钟源的频率是209MHz                                              
    TIM16->PSC = 209-1;                                                                    
    // 5. 设置PWM方波的最终的周期  TIM4_ARR[16:0] = 1000                                  
    //      得到一个1000-2000Hz的方波                                                     
    TIM16->ARR = 1000;                                                                     
    // 6. 设置PWM方波的占空比   TIM4_CCR1[16:0] = 700                                     
    TIM16->CCR1 = 700;                                                                     
    // 7. 设置TIM4_CH1通道为PWM1模式                                                      
    //      TIM4_CCMR1[16] = 0b0  TIM4_CCMR1[6:4] = 0b110   // pwm模式1  = 0b0110        
    TIM16->CCMR1 &= ~((0x1 << 16) | (0x7 << 4));                                           
    TIM16->CCMR1 |= (0x6 << 4);                                                            
                                                                                          
    // 8. 设置TIM4_CH1通道使能TIMx_CCR1预加载使能寄存器                                   
    //      TIM16_CCMR1[3] = 0x1                                                           
    TIM16->CCMR1 |= (0x1 << 3);                                                            
    // 9. 设置TIM4_CH1通道输出PWM方波的极性,                                             
    //    TIM16_CCER[1] = 0x1 or 0x0                                                       
    // TIM4->CCER |= (0x1 << 1);                                                          
    TIM16->CCER &= ~(0x1 << 1);                                                            
    // 10. 设置TIM4_CH1通道的输出使能位,输出PWM方波                                      
    //      TIM16_CCER[0] = 0x1                                                            
	TIM16->CCER |= (0x1 << 0);                                        
    // 11. 设置TIM4_CH1通道的TIMx_ARR预装载寄存器的缓冲区的使能      
    //      TIM16_CR1[7] = 0x1   
	TIM16->BDTR |= 0X1 <<15;
    TIM16->CR1 |= (0x1 << 7);                                         
    // 12. 设置定时器的计数方式,边沿对齐                            
    //      TIM16_CR1[6:5] = 0x0                                      
    TIM16->CR1 &= (~(0x3 << 5));                                      
    // 12 设置定时器计数的方向,采用递减计数/递增计数                
    //      TIM16_CR1[4] = 0x0                                        
    TIM16->CR1 &= (~(0x1 << 4));                                      
    // 13. 使能TIM16_CH1计数器                                        
    //      TIM4_CR1[0] = 0x1                                        
    TIM16->CR1 |= (0x1 << 0);                                         


}

三个设备分别一一对应注释部分直接复制之前的了,没有修改,大体就是把引脚对应一下即可

#include "beep.h"

void delay_ms(unsigned int ms)

{

	int i,j;

	for(i = 0; i < ms;i++)

		for (j = 0; j < 1800; j++);

}



//extern char  buffer[LEN];

int main()

{

	int i=0;	

//	beep_init();  // 串口的初始化

	fengshan_init();

	mada_init();

	while(1)

	{

	 

		beep_init(i);	

		i++;

	//	delay_ms(10);

	}

	return 0;

}

最后的是主函数部分,我稍做了一下修改,可以让蜂鸣器叫起来像莫斯电码的声音,主要是通过修改蜂鸣器的频率

希望对你们有帮助

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值