嵌入式技术论坛
直播中

陈丽

7年用户 1541经验值
私信 关注
[经验]

求一种基于rt-thread和CPK-RA2L1的音乐播放器设计方案

  一、前言
  第一次使用瑞萨的板子和RTT studio开发环境,跟着瑞萨活动的实践步骤,从最初的不适应,到慢慢熟悉,现在觉得RTT studio的IDE做得非常方便,瑞萨的教程也做的十分详细。但是因为工作原因,空闲时间有限,只跑了相关的几个外设实验,做了一个简易的音乐播放器,用按钮进行歌曲切换。后续将继续研究其他的外设应用。
  二、硬件连接
  用到的硬件资源:
  1、UART9: P109/P110
  2、按键输入(P004)
  3、PWM输出:P500
  4、SPI0
2.jpg
  三、软件工具
  1、环境搭建
   rt-thread studio 安装;
   灵活配置软件包(FSP)
   CPK-RA2L1板级支持包安装
   usb转串口工具
  (具体的步骤可参考瑞萨RA2L1开发实践指南,图文并茂,十分详细)
  2、另外用到软件:
  (1)中景园电子1.8寸显示屏自带汉字编码软件
  (2)音乐编码软件Music Encode,通过手动输入简谱进行转换,如下图所示。
2.jpg
  四、关键代码:
  play.c
  int player_next(player_t player)
  {
  uint16_t len;
  rt_uint32_t level;
  /* 关闭全局中断 */
  level = rt_hw_interrupt_disable();
  /* 将当前播放歌曲的序号 加一 */
  if (player-》song_current 《 player-》song_num)
  {
  player-》song_current ++;
  }
  else
  {
  player-》song_current = 1;
  }
  g_songnum = player-》song_current;
  /* 更新播放器的当前歌曲的播放时间以及总时间 */
  player-》song_time_pass = 0;
  /* 打开全局中断 */
  rt_hw_interrupt_enable(level);
  player-》decode-》control(player-》song_sheet[player-》song_current - 1], DECODE_OPS_CMD_GET_LEN, &len);
  /* 关闭全局中断 */
  level = rt_hw_interrupt_disable();
  player-》song_time_all = len;
  /* 打开全局中断 */
  rt_hw_interrupt_enable(level);
  if (player-》status != PLAYER_RUNNING)
  {
  player_play(player);
  }
  return 0;
  }
  LCD.c
  void lcd_thread_handler(void *parameter)
  {
  rt_uint8_t temp = 0;
  rt_kprintf(“lcd thread handler!”);
  LCD_Init();
  LCD_Fill(0,0,LCD_W,LCD_H,WHITE);
  lcd_show_menu();
  while(1)
  {
  rt_kprintf(“lcd thread running!”);
  if(temp != g_songnum)
  {
  rt_kprintf(“lcd,temp = %d,g_songnum = %d”,temp,g_songnum);
  temp = g_songnum;
  LCD_Fill(1,128+8,LCD_W,LCD_H,WHITE);
  }
  lcd_show_pic1();
  rt_thread_mdelay(500);
  }
  }
  void lcd_show_menu(void)
  {
  LCD_ShowPicture(0,0,127,128,gImage_music);
  LCD_ShowChinese(30,128-10,“正在播放”,RED,WHITE,16,0);
  LCD_ShowChinese(1,128+8,“快乐父子俩”,RED,WHITE,16,0);
  }
  void lcd_show_pic1(void)
  {
  switch (g_songnum){
  case 1 :LCD_ShowChinese(1,128+8,“快乐父子俩”,RED,WHITE,16,0);break;
  case 2 :LCD_ShowChinese(1,128+8,“葫芦娃”,RED,WHITE,16,0);break;
  case 3 :LCD_ShowChinese(1,128+8,“送别”,RED,WHITE,16,0);break;
  case 4 :LCD_ShowChinese(1,128+8,“两只老虎”,RED,WHITE,16,0);break;
  default: break;
  }
  }
  key.h
  #define KEY_NEXT_PIN 4
  key.c
  int key_init(void)
  {
  btn_last.press_logic_level = KEY_PRESS_LEVEL;
  btn_last.hold_cyc_period = 100;
  btn_last.cb = (my_button_callback)btn_cb;
  btn_next = btn_play = btn_last;
  btn_last.pin = KEY_PLAY_PIN;
  btn_play.pin = KEY_LAST_PIN;
  btn_next.pin = KEY_NEXT_PIN;
  my_button_register(&btn_last);
  my_button_register(&btn_play);
  my_button_register(&btn_next);
  my_button_start();
  return 0;
  }



原作者:当字符爱上音符

更多回帖

发帖
×
20
完善资料,
赚取积分