CW32饭盒派提供了多个串行接口,提供串口可进行数据的交互和串口设备的控制,这里是利用串口来控制MP3播放模块,从而使饭盒派能轻松地实现音乐播放功能。
为了控制MP3模块,所用的串行接口为J8,见图1所示,这里只用引脚PA9来发送控制指令。
1.串行通讯
图1 串行接口
为发送控制指令,是讲指令放置在数组中,其格式为:
unsigned char
cmd[10] = {0X7E, 0xFF, 0x06, 0X06, 0x00, 0x00, 0x10, 0xFE, 0xE5, 0XEF};
验证指令发送的主程序为:
int32_t main(void)
{
RCC_Configuration();
GPIO_Configuration();
UART_Configuration();
USART_SendBuf_Polling(DEBUG_USARTx,cmd, 10);
while(1);
}
经下载,其运行结果如图1所示,说明程序正确。
图1 运行结果
2.界面设计
为了便于MP3模块的播放控制,可利用开发板所配置的TFT屏来显示播放菜单,其形式如图2所示。
图2 播放菜单
图3 提取字模
该字库的存储结构如下:
#define hz16_num
100
const struct typFNT_GB162 hz16[] = {
#if
USE_ONCHIP_FLASH_FONT
"鸿",0x00,0x10,0x80,0x20,0x40,0x7C,0x1F,0x44,0x84,0x64,0x44,0x54,0x44,0x44,0x04,0x4C,0x24,0x40,0x44,0x7E,0xC4,0x02,0x47,0x02,0x5C,0x7A,0x48,0x02,0x40,0x0A,0x00,0x04,/"鸿",0/
"雁",0x00,0x00,0x3F,0xFE,0x20,0x00,0x22,0x50,0x22,0x48,0x24,0xFE,0x24,0x90,0x2D,0x90,0x36,0xFE,0x24,0x90,0x24,0x90,0x24,0xFE,0x24,0x90,0x44,0x90,0x44,0xFE,0x84,0x80,/"雁",1/
...
"℃",0x60,0x00,0x91,0xF4,0x96,0x0C,0x6C,0x04,0x08,0x04,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x08,0x00,0x0C,0x04,0x06,0x08,0x01,0xF0,0x00,0x00,/"℃",0/
"%",0x00,0x00,0x00,0x44,0xA4,0xA8,0xA8,0xB0,0x54,0x1A,0x2A,0x2A,0x4A,0x44,0x00,0x00,/"%",0/
#endif
0x00,
};
显示播放菜单的主程序为:
int32_t main(void)
{
RCC_Configuration();
GPIO_Configuration();
UART_Configuration();
setVolume(18);
USART_SendBuf_Polling(DEBUG_USARTx, cmd6,10);
LED();
key();
Lcd_Init();
Lcd_Clear(RED);
Gui_DrawFont_GBK16(10,3,YELLOW,RED,"MP3 音乐播放器");
Gui_DrawLine(0, 22,139, 22,WHITE);
Gui_DrawFont_GBK16(10,32,WHITE,RED,"1--鸿雁");
Gui_DrawFont_GBK16(10,52,WHITE,RED,"2--光阴的故事");
Gui_DrawFont_GBK16(10,72,WHITE,RED,"3--风吹麦浪");
Gui_DrawFont_GBK16(10,92,WHITE,RED,"4--贝加尔湖畔");
Gui_DrawFont_GBK16(10,112,WHITE,RED,"5--传奇");
Gui_DrawFont_GBK16(10,132,WHITE,RED,"6--走过咖啡屋");
n=0;
while(1)
{
menu_cotrl();
}
}
3.按键控制
在播放控制方面,可利用开发板上的3个按键,其中K1用于选择选择下一首,K2用于选择选择上一首,K3用于确认播放。
图4 按键电路
实现按键处理的函数为:
void menu_cotrl(void)
{
if(GPIO_ReadPin(CW_GPIOB, PIO_PIN_13)==GPIO_Pin_RESET)
{
if(n>0) Gui_DrawFont_GBK16(18,12+n*20,WHITE,RED,"--");
n=n+1;
if(n>6) n=1;
while(GPIO_ReadPin(CW_GPIOB,GPIO_PIN_13)==GPIO_Pin_RESET);
Gui_DrawFont_GBK16(18,12+n*20,BLUE,RED,"--");
}
if(GPIO_ReadPin(CW_GPIOB, PIO_PIN_14)==GPIO_Pin_RESET)
{
if(n<6) Gui_DrawFont_GBK16(18,12+n*20,WHITE,RED,"--");
else
Gui_DrawFont_GBK16(18,12+n*20,WHITE,RED,"--");
if(n>1) n=n-1;
else n=6;
while(GPIO_ReadPin(CW_GPIOB, GPIO_PIN_14)==GPIO_Pin_RESET);
Gui_DrawFont_GBK16(18,12+n*20,BLUE,RED,"--");
}
if(GPIO_ReadPin(CW_GPIOB,
GPIO_PIN_15)==GPIO_Pin_RESET)
{
while(GPIO_ReadPin(CW_GPIOB, GPIO_PIN_15)==GPIO_Pin_RESET);
playn(n);
USART_SendBuf_Polling(DEBUG_USARTx, cmd3, 10);
}
}
图5控制效果
注:蓝色横线表示当前的播放选择
4.MP3播放控制
MP3播放模块是一款可通过串行通讯来控制的功能模块,它将MP3格式的音乐文件存放在TF卡中,并通过模块上的卡槽来连接,该模块的引脚排列如图6所示,其中RX引脚接开发板的PA9来接收指令,SPK_1和SPK_2则用于连接扬声器,VCC和GND用于连接5V电源,其他的引脚则可以不用。
图6引脚排列
用于该模块的通讯波特率是固定的,以此要将串口通讯的波特率设为9600bps,可用如下语句来定义:
#define DEBUG_USART_BaudRate 9600
播放指令被存放在数组中,其格式如下:
unsigned char
cmd[10] = {0X7E, 0xFF, 0x06, 0X03, 0x00, 0x00, 0x01, 0xFE, 0xF7, 0XEF};
其中,数组中的第6和第7元素是指定的歌曲编号,最后一个元素为校验码。
这样,就在饭盒派的基础上实现了中文菜单下的MP3音乐播放控制。