【嵌入式】——STM32F401VE 时钟复用+蜂鸣器乐器编程

时钟复用+蜂鸣器乐器编程

实验目的

了解STM32时钟复用技术,并实现实现蜂鸣器奏乐

实验器材

操作系统:Windows 10 家庭中文版
软件:keil5(编译)、source insight4.0(写程序)、Proteus8.8(仿真运行)
仿真器件:STM32F401VE芯片、LED灯、电阻、电容

实验代码

rj_buzzer.c

#include "stm32f4xx.h"
#include "main.h"
#include "systick.h"

#define  ZERO  3000//
#define  R  10000 //F_CLOCK/(N+1)=10000	
#define  L1       (R/262)-1        //DO
#define  half_L1  (R/277)-1        //#1低音DO#
#define  L2       (R/294)-1
#define  half_L2  (R/311)-1
#define  L3       (R/330)-1
#define  L4       (R/349)-1
#define  half_L4  (R/370)-1
#define  L5       (R/392)-1
#define  half_L5  (R/410)-1
#define  L6       (R/440)-1
#define  half_L6  (R/466)-1
#define  L7       (R/494)-1

#define  M1       (R/523)-1        //中音DO
#define  half_M1 ??R/554)-1        //#1 DO#
#define  M2       (R/587)-1
#define  half_M2  (R/622)-1
#define  M3       (R/659)-1
#define  M4       (R/698)-1
#define  half_M4  (R/740)-1
#define  M5       (R/784)-1
#define  half_M5  (R/831)-1
#define  M6       (R/880)-1
#define  half_M6  (R/932)-1
#define  M7       (R/988)-1

#define  H1       (R/1046)-1        //高音DO
#define  half_H1 ??R/1109)-1        //#1DO#
#define  H2       (R/1175)-1
#define  half_H2  (R/1245)-1
#define  H3       (R/1318)-1
#define  H4       (R/1397)-1
#define  half_H4  (R/1480)-1
#define  H5       (R/1568)-1
#define  half_H5  (R/1661)-1
#define  H6       (R/1760)-1
#define  half_H6  (R/1865)-1
#define  H7       (R/1967)-1

int flag=1;//标志
int x;

//音符数组
int tune[] =  
{  
  H1,M7,H1,M3,M2,M3,M3,M5,
M2,M1,M2,M2,M7,M7,H1,H1,H1,M3,M5,M5,
H1,M7,H1,M6,M5,M6,M6,H1,
M5,H1,M5,M5,M3,M4,M6,M5,M5,M6,M3,M3,M2,
H1,M7,H1,M3,M2,M3,M3,M5,
M2,M1,M2,M2,M7,M7,H1,H1,H1,H2,H3,H3,
H2,H3,H1,H1,M6,M6,M6,M6,
M5,H1,M5,M5,M3,M4,M5,M6,M6,H1,H3,H2,
H1,H1,H1
};

//节拍数组
float duration[]= 
{  
  1,1,1,1,0.5,0.5,0.5,1.5,
1,0.5,0.5,0.5,1.5,1,0.5,0.5,1,0.5,0.5,2,
1,1,1,1,0.5,0.5,0.5,1.5,
1,0.5,0.5,0.5,1.5,1,0.5,0.5,1,0.5,0.5,0.5,1.5,
1,1,1,1,0.5,0.5,0.5,1.5,
1,0.5,0.5,0.5,1.5,1,0.5,0.5,0.5,1,0.5,1,
1,0.5,0.5,1,0.5,0.5,1.5,0.5,
1,0.5,0.5,1.5,0.5,1,0.5,0.5,0.5,1.5,2,1,
2,2,2
  };

int length = sizeof(tune)/sizeof(tune[0]); 
void buzzer_init(int f)
{            
	   /*时钟使能*/
		RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);	 
		RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM13, ENABLE);      
//1
       GPIO_InitTypeDef p;
       p.GPIO_Pin = GPIO_Pin_8;
       p.GPIO_Mode = GPIO_Mode_AF; //多路复用模式
       p.GPIO_PuPd  = GPIO_PuPd_NOPULL;
       p.GPIO_Speed = GPIO_Speed_50MHz;
       GPIO_Init(GPIOF,&p);
       GPIO_PinAFConfig(GPIOF,GPIO_PinSource8,GPIO_AF_TIM13);
//2
	   /*配置GPIO引脚的功能,AF:复用功能*/
        TIM_TimeBaseInitTypeDef t;
        t.TIM_Prescaler = 8399;	//预分频值   10000HZ=TIM13_CLK
        
        t.TIM_CounterMode = TIM_CounterMode_Down;//递减模式
        t.TIM_Period = f;    //N值
        t.TIM_RepetitionCounter = 0;    //不需要重复计数
        TIM_TimeBaseInit(TIM13, &t);
//3

        //输出通道的配置
        TIM_OCInitTypeDef t_oc;
        t_oc.TIM_OCMode = TIM_OCMode_PWM2;
        t_oc.TIM_OCPolarity = TIM_OCPolarity_High;
        t_oc.TIM_OutputState = TIM_OutputState_Enable;
        t_oc.TIM_Pulse = f*0.9;	
        TIM_OC1Init(TIM13, &t_oc);				
				TIM_OC1PreloadConfig(TIM13, TIM_OCPreload_Enable);//
//4			
				//使能定时器
        TIM_ARRPreloadConfig(TIM13, ENABLE);				//
        TIM_Cmd(TIM13, ENABLE);
}
void music_fun()
{
     for(x=0;x<length;x++)
    {  
        if(flag==1) 
        
        {
            flag=0;
        }
        if(tune[x]==ZERO)
        { 
            
            RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, DISABLE);         
            RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM13, DISABLE);         
            flag=1;
        }

        buzzer_init(tune[x]);
        if(flag==1)
				{
            delay_ms((uint32_t)(1000*duration[x]));
						flag = 0;
				}
        else
            delay_ms((uint32_t)(400*duration[x]));
            
    }
    
		//关闭时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM13, DISABLE);
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, DISABLE); 
}

main.c

#include "main.h" 
#include "rj_led.h" 
#include "rj_int_key.h" 
#include "systick.h"
#include "rj_buzzer.h"
extern uint8_t status;
int main(void)
{
	
  while (1)
  {
			music_fun();

  }
}

实验现象

演示视频:https://www.bilibili.com/video/BV1Pi4y1x7q1

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 基于STM32F401VE的信号发生器设计,需要考虑以下几个方面: 1. 硬件设计:需要选择合适的外设,如DAC、定时器等,以及合适的电路设计,如滤波电路、放大电路等。 2. 软件设计:需要编合适的程序,实现信号的生成和输出,以及控制界面的设计和实现。 3. 稳定性和精度:需要考虑信号的稳定性和精度,如时钟精度、DAC精度等,以保证输出信号的质量。 4. 功能和性能:需要考虑信号发生器的功能和性能,如输出波形种类、频率范围、幅度范围等,以满足不同的应用需求。 总之,基于STM32F401VE的信号发生器设计需要综合考虑硬件和软件两个方面,以及稳定性、精度、功能和性能等多个因素,才能设计出满足实际需求的信号发生器。 ### 回答2: 为了设计一款基于STM32F401VE的信号发生器,我们需要考虑到以下几个方面。 首先,我们需要根据设计要求选择适合的STM32F401VE开发板并在电路设计过程中保证其可靠性,并确保板子上的元件与引脚与我们的信号发生器设计需求匹配。例如,我们需要确定板子上可用的GPIO口数量,查看是否与信号发生器频率输出可兼容,检查板子上的DAC与ADC可能的影响等等。 其次,我们需要确定开发板能够输出哪些类型的信号。对于信号发生器而言,我们需要考虑可以发生哪些波形形式——正弦波、方波或矩形波或其他波形,以及输出信号的幅度范围。因此,我们需要研究STM32F401VE时钟、DAC、计时器和PWM总线等特性,并确定如何利用这些元件产生各种稳定的波形。 第三,我们需要进行编程和软件设计的过程。首先我们需要配置系统时钟和时序,然后通过编代码进行驱动和控制DAC、计时器和PWM总线等元件,产生不同类型的波形。我们还需要设计合适的用户界面,以便用户可以配置波形形式和输出幅度等参数。 最后,我们需要进行测试和验证以保证信号发生器的性能稳定。可以将发生器与示波器配合使用检查产生的波形的频率响应、相位准确性和幅度范围等等。在测试过程中,我们需要注意保持电路环境的稳定性,尤其是在测量反馈回路、控制电压、幅度分析等重点测量时应该特别小心。 综上所述,基于STM32F401VE的信号发生器设计需要设计合适的电路、研究选型、编软件进行功能实现、调试并测试整体性能。需要高度的技术知识以及沉着的耐心。 ### 回答3: STM32F401VE是一款高性能微控制器,集成了高速CPU、模拟、数字、存储器、通信等多个模块,因此非常适合作为信号发生器的基础板。基于STM32F401VE芯片的信号发生器能够实现高精度、高性能、高稳定性的波形输出。 该信号发生器设计需要结合模拟和数字电路的技术,其主要包括以下部分: 1. AD9851数字信号发生芯片:该芯片可实现32位频率相位调制,能够产生高精度的正弦、三角波和方波等波形。 2. DAC8532模拟信号输出芯片:该芯片能够将数字信号转化为模拟信号,同时具有16位的精度和多路输出能力。 3. 正弦波电路设计:通过AD9851芯片和DAC8532芯片的组合,实现高精度正弦波的输出,主要包括选取高精度震荡晶振、AD9851芯片的控制电路、DAC8532的接口电路等。 4. 方波和三角波电路设计:方波和三角波主要通过AD9851芯片的控制实现,需要根据实际需求设计模拟滤波电路。 5. 控制电路设计:从外部输入信号进行触发控制,需要设计按键和LCD显示屏等与外部相对应的控制元件。 综上所述,基于STM32F401VE的信号发生器设计可以实现高精度、高性能、高稳定性的波形输出。该方案在其它领域中也有广泛应用,如数字信号处理、工业自动化控制、医疗设备、机器人、电力电子等领域。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Nydia~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值