前言
STM32F103C8T6是一款基于ARM Cortex-M3内核的32位微控制器,由意法半导体公司(STMicroelectronics)生产。STM32F103C8T6以其高性能、低功耗、低成本和丰富的外设接口,成为嵌入式系统设计中广泛使用的微控制器之一。
-
基本参数:
- CPU:ARM Cortex-M3 32位RISC内核
- 最大主频:72MHz
- 程序存储器容量:64KB Flash存储器
- RAM容量:20KB SRAM
- 电压-电源(Vcc/Vdd):2V ~ 3.6V
- 工作温度:-40°C ~ 85°C
-
外设与接口:
- 支持多种通信接口,包括SPI、I2C、USART等
- 具有12位ADC转换器,最大采样速率为1Msps
- 具有37个GPIO引脚
- 还包括DMA、电机控制PWM、温度传感器等外围设备
-
性能特点:
- 高性能:采用ARM Cortex-M3内核,支持多种外设,可应用于智能家居、工业自动化、电机控制等领域
- 低功耗:采用低功耗技术,待机模式下消耗极少的电量,可节省电池使用寿命
- 低成本:性价比较高,满足大多数应用场景的需求
-
封装与尺寸:
- 封装/外壳:48-LQFP
- 高度: 1.4 mm
- 长度: 7 mm
-
其他参数:
- 定时器:具有多个定时器,包括基本定时器、高级定时器和通用定时器
- 封装类型:STM32F103xx中密度性能线系列包括六种不同封装类型的设备,从36针到100针
1.功能初始化
主要包含对按键、LED、定时器以及所要播放的音乐进行低中高音、PWM脉宽和OLED显示屏初始化。
1、通过按键控制操作,K1播放下一首、K2播放下一首的按键操作。
2、接收到按键操作命令,做出相应的音乐。
3、正在播放的音乐会通过OLED显示屏显示。
4.LED亮起显示音乐播放。
2.硬件简介
2.1连接扬声器/蜂鸣器:
将扬声器或蜂鸣器的正极连接到STM32的GPIO引脚(如PA0),并在扬声器/蜂鸣器的负极与STM32的GND之间连接一个适当的电阻(如8Ω扬声器可接100Ω电阻)。
2.2电源连接:
4使用USB线将STM32开发板连接到电脑或使用适当的电池供电
3. 核心软件设计
3.1功能描述
主程序实现进行初始化后, 进入播放音乐环节。对音乐播放进行循环判断, 得到按键的命令后再进行按键播放。 按下K1则播放下首歌, 显示屏显示正在播放音乐名字。;按下K2则播放上一首歌。
3.2核心代码
#include "stm32F4xx.h"
#include "stm32f4xx_conf.h"
#include "stdio.h"
#include "led.h"
#include "key.h"
#include "delay.h"
#include "uart.h"
#include "ADC.h"
#include "bsp_lcd.h"
#include "bsp_sdram.h"
#include "fonts.h"
#include "bsp_general_tim.h"
#include "lcd_show_zn.h"
#include "lcd_show_zn_font.h"
//µÍ
#define M0 0
#define M1 261
#define M2 293
#define M3 329
#define M4 349
#define M5 392
#define M6 440
#define M7 493
//ÖÐ
#define L0 0
#define L1 523
#define L2 587
#define L3 659
#define L4 698
#define L5 784
#define L6 880
#define L7 988
//¸ß
#define H0 0
#define H1 1046
#define H2 1175
#define H3 1318
#define H4 1397
#define H5 1568
#define H6 1760
#define H7 1976
int couter = 0;
uint8_t key1;
uint8_t key2;
uint8_t key2_data = 0;
uint8_t color = 0;
uint32_t delay_time =10000;
uint32_t system_time = 0;//±íʾµÄÊÇϵͳµÄ¿ª»úʱ¼ä£¬Ä¬ÈÏÊÇ0
uint8_t beep_state = 0;
uint8_t led_state1 = 0;
uint8_t led_state2 = 0;
uint16_t music1[][2]=
{//СÐÇÐÇ
{M1,500},{M1,500},{M5,500},{M5,500},{M6,500},{M6,500},{M5,500},{M0,500},
{M4,500},{M4,500},{M3,500},{M3,500},{M2,500},{M2,500},{M1,500},{M0,500},
//{M5,500},{M5,5{M5,500},{M5,500},{M4,500},{M4,500},{M3,500},{M3,500},{M2,500},{M0,500},00},{M4,500},{M4,500},{M3,500},{M3,500},{M2,500},{M0,500},
};
uint16_t music2[][2]={
//Сë¿
{M1,400},
{M1,400},
{M1,400},
{M3,400},
{M5,400},
{M5,400},
{M5,400},
{M5,400},
{M6,400},
{M6,400},
{M6,400},
{H1,400},
{M5,400},
{M0,500},
{M4,400},
{M4,400},
{M4,400},
{M6,400},
{M3,400},
{M3,400},
{M3,400},
{M3,400},
{M2,400},
{M2,400},
{M2,400},
{M2,400},
{M5,400},
{M0,1000},
{M5,400},
{M1,400},
{M1,400},
{M1,400},
{M3,400},
{M5,400},
{M5,400},
{M5,400},
{M5,400},
{M6,400},
{M6,400},
{M6,400},
{H1,500},
{M5,400},
{M0,1000},
};
uint16_t music3[][2]={
//ÉúÈÕ¿ìÀÖ
{M5,500},
{M5,500},
{M6,500},
{M5,500},
{H1,500},
{M7,500},
{M0,500},
{M5,500},
{M5,500},
{M6,500},
{M5,500},
{H2,500},
{H1,500},
{M0,500},
//{M5,500},
//{M5,500},
//{H5,500},
//{H3,500},
//{H1,500},
//{M7,400},
//{M6,400},
//{M0,500},
};
void play1()
{
static uint16_t i = 0;
static uint16_t dekay = 0;
//delayµÈÓÚ0±íʾ¿ªÊ¼²¥·ÅÕâ¸öÒô·û
if(dekay == 0)
PWM_SetFrequency(music1[i][0]);//²¥·Å¸ÃÒô·û
//¼ÆËã¸ÃÒô·ûÒѾ²¥·ÅµÄʱ¼ä
dekay+=10;
//Èç¹û¸ÃÒô·û²¥·Åʱ¼ä´ú
if(dekay>=music1[i][1])
{
//Çå¿Õͳ¼ÆÊ±¼äµÄ±äÁ¿
dekay = 0;
//²¥·ÅÏÂÒ»¸öÒô·û
i++;
if(i>24)//дÁ˶àÉپʹóÓÚ¶àÉÙ
i = 0;
}
}
void play2()
{
static uint16_t i = 0;
static uint16_t dekay = 0;
//delayµÈÓÚ0±íʾ¿ªÊ¼²¥·ÅÕâ¸öÒô·û
if(dekay == 0)
PWM_SetFrequency(music2[i][0]);//²¥·Å¸ÃÒô·û
//¼ÆËã¸ÃÒô·ûÒѾ²¥·ÅµÄʱ¼ä
dekay+=10;
//Èç¹û¸ÃÒô·û²¥·Åʱ¼ä´ú
if(dekay>=music2[i][1])
{
//Çå¿Õͳ¼ÆÊ±¼äµÄ±äÁ¿
dekay = 0;
//²¥·ÅÏÂÒ»¸öÒô·û
i++;
if(i>22)//дÁ˶àÉپʹóÓÚ¶àÉÙ
i = 0;
}
}
void play3()
{
static uint16_t i = 0;
static uint16_t dekay = 0;
//delayµÈÓÚ0±íʾ¿ªÊ¼²¥·ÅÕâ¸öÒô·û
if(dekay == 0)
PWM_SetFrequency(music3[i][0]);//²¥·Å¸ÃÒô·û
//¼ÆËã¸ÃÒô·ûÒѾ²¥·ÅµÄʱ¼ä
dekay+=10;
//Èç¹û¸ÃÒô·û²¥·Åʱ¼ä´ú
if(dekay>=music3[i][1])
{
//Çå¿Õͳ¼ÆÊ±¼äµÄ±äÁ¿
dekay = 0;
//²¥·ÅÏÂÒ»¸öÒô·û
i++;
if(i>14)//дÁ˶àÉپʹóÓÚ¶àÉÙ
i = 0;
}
}
//±àдÖжϷþÎñº¯Êý key1
void EXTI0_IRQHandler()
{
if(EXTI_GetITStatus(EXTI_Line0) != RESET)//Ö¤Ã÷
{
//100ms = 100 000us
color++;
if(color>2)
color = 0;
EXTI_ClearITPendingBit(EXTI_Line0);
}
}
//±àдÖжϷþÎñº¯Êý key2
void EXTI15_10_IRQHandler()
{
if(EXTI_GetITStatus(EXTI_Line13) != RESET)//Ö¤Ã÷
{
key2_data++;
if(color>2)
color=0;
EXTI_ClearITPendingBit(EXTI_Line13);
}
}
int main(void)
{
GPIO_InitTypeDef gpio_info;
TIMx_Configuration();
GPIO_ResetBits(GPIOA,GPIO_Pin_5);
LED_init();
key1_init();
key2_init();
Delay_init();
UART_init(115200);
ADC_init();
ADC_GetValue();
//¹Ø±Õ3¸öµÆ
LED_Red_Ctrl(LED_OFF); //¹Ø
LED_Blue_Ctrl(LED_OFF);//¹Ø
LED_Green_Ctrl(LED_OFF);//¹Ø
//ÆÁÄ»³õʼ»¯
LCD_Init();
//ÆÁÄ»ÏÔʾ²ã³õʼ»¯
LCD_LayerInit();
//LTCDÍâÉè³õʼ»¯
LTDC_Cmd(ENABLE);
/*°Ñ±³¾°²ãË¢³ÉºÚÉ«*/
//Ñ¡¶¨¿ØÖƱ³¾°²ã
LCD_SetLayer(LCD_BACKGROUND_LAYER);
//Çå³ýÆÁÄ»²¢ÓúÚÉ«Ìî³ä
LCD_Clear(LCD_COLOR_BLACK);
/*³õʼ»¯ºóĬÈÏʹÓÃǰ¾°²ã*/
LCD_SetLayer(LCD_FOREGROUND_LAYER);
/*ĬÈÏÉèÖò»Í¸Ã÷£¬¸Ãº¯Êý²ÎÊýΪ²»Í¸Ã÷¶È£¬·¶Î§ 0-0xff,0Ϊȫ͸Ã÷£¬0xffΪ²»Í¸Ã÷*/
LCD_SetTransparency(0xFF);
//Çå³ýÆÁÄ»²¢ÓúÚÉ«Ìî³ä
LCD_Clear(LCD_COLOR_BLACK);
#if 1
//P11·äÃùÆ÷
//³õʼ»¯GPIO¡ªIʱÖÓ
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOI,ENABLE);
gpio_info.GPIO_Mode = GPIO_Mode_OUT;
gpio_info.GPIO_OType = GPIO_OType_PP;
gpio_info.GPIO_Pin = GPIO_Pin_11;
gpio_info.GPIO_PuPd = GPIO_PuPd_UP;
gpio_info.GPIO_Speed = GPIO_Low_Speed;
GPIO_Init(GPIOI,&gpio_info);
#endif
/*ÉèÖÃ×ÖÌåÑÕÉ«¼°×ÖÌåµÄ±³¾°ÑÕÉ«*/
LCD_SetColors(LCD_COLOR_WHITE,LCD_COLOR_BLACK);//×ÖÌå°×É« ±³¾°ºÚÉ«
/*Ñ¡Ôñ×ÖÌå*/
LCD_SetFont(&Font16x24);
#define LCD_FRAME_BUFFER ((uint32_t)0xD0000000)
while(1)
{
Delay_ms(10);
//¶ÁÈ¡°´¼ü״̬
uint8_t key1 = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0);
uint8_t key2 = GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13);
system_time = system_time + 10;//Â̵Æ
if(system_time%1000 == 0)
{
if(beep_state == 0)//
{
LED_Green_Ctrl(LED_ON);
beep_state = 1;
}
else
{
LED_Green_Ctrl(LED_OFF);
beep_state = 0;
}
}
if(color == 0)
{
LCD_SetColors(LCD_COLOR_WHITE,LCD_COLOR_BLACK);//×ÖÌå°×É« ±³¾°ºÚÉ«
LCD_DispString_EN_CH(100,200,"Сë¿");
LCD_DispString_EN_CH(100,300,"ÉúÈÕ¿ìÀÖ");
LCD_SetColors(LCD_COLOR_BLACK,LCD_COLOR_WHITE);
LCD_DispString_EN_CH(100,100,"СÐÇÐÇ");
}
else if(color == 1)
{
LCD_SetColors(LCD_COLOR_WHITE,LCD_COLOR_BLACK);//×ÖÌå°×É« ±³¾°ºÚÉ«
LCD_DispString_EN_CH(100,100,"СÐÇÐÇ");
LCD_SetColors(LCD_COLOR_BLACK,LCD_COLOR_WHITE);
LCD_DispString_EN_CH(100,200,"Сë¿");
}
else if(color == 2)
{
LCD_SetColors(LCD_COLOR_WHITE,LCD_COLOR_BLACK);//×ÖÌå°×É« ±³¾°ºÚÉ«
LCD_DispString_EN_CH(100,200,"Сë¿");
LCD_SetColors(LCD_COLOR_BLACK,LCD_COLOR_WHITE);
LCD_DispString_EN_CH(100,300,"ÉúÈÕ¿ìÀÖ");
}
else if(color == 3)
{
LCD_SetColors(LCD_COLOR_WHITE,LCD_COLOR_BLACK);//×ÖÌå°×É« ±³¾°ºÚÉ«
LCD_DispString_EN_CH(100,300,"ÉúÈÕ¿ìÀÖ");
}
if(color == 0 && key2_data ==1)//ÒôÀÖ1
{
play1();
}
else if(color == 1 && key2_data ==2)
{
play2();
}
else if(color == 2 && key2_data ==3)
{
play3();
}
else if(color == 3 && key2_data ==4)
{
play1();
}
}
}
4.结尾
通过本博客,我们介绍了如何使用STM32F103C8T6制作一个简单的音乐盒。您可以根据自己的需求添加更多的音符和旋律,甚至可以添加一些控制功能,如通过按钮选择不同的歌曲或旋律。希望这个项目能激发您对嵌入式编程和音乐制作的兴趣!