[Kinetis] 以YL-KL26Z开发板制作会讲故事的书——3

[复制链接]
1324|1
 楼主| 追逐浪花 发表于 2015-12-12 17:16 | 显示全部楼层 |阅读模式
程序代码
  经修改和调试,main.c的文件内容如下:
  1. /*******************Copyright (c)*******************
  2. **  Copyright ?2003~2009 Shenzhen uCdragon Technology Co.,Ltd. All Rights Reserved
  3. **
  4. **      http://www.ucdragon.com
  5. **
  6. **      深圳市优龙科技有限公司所提供的所有服务内容旨在协助客户加速产品的研发进度,在服务过程中所提供
  7. **  的任何程序、文档、测试结果、方案、支持等资料和信息,都仅供参考,客户有权不使用或自行参考修改,本公司不
  8. **  提供任何的完整性、可靠性等保证,若在客户使用过程中因任何原因造成的特别的、偶然的或间接的损失,本公司不承担任何责任。
  9. **                     —深圳市优龙科技有限公司
  10. **
  11. **--------------File Info------------------------------
  12. ** File Name:               Main.c
  13. ** Last modified date:      
  14. ** Last version:            V1.0
  15. ** Description:             主函数文件
  16. **
  17. **-----------------------------------------------------
  18. **      后经天津理工大学李静修改为多段语音文件键控播放,并在不断完善优**      化中,以期有更强的功能并更加易于使用。
  19. **
  20. ********************************************************************/
  21. #include "includes.h"
  22. #include "fat.h"
  23. void myDelay(INT16U uiTime);
  24. extern uint16_t SectorsPerClust;
  25. extern unsigned char audio[];
  26. /************************* 全局变量与函数 **************************/
  27. unsigned int FIFO_in;        //读取缓冲区指针
  28. unsigned int FIFO_out;       //播放缓冲区指针
  29. unsigned char Buffer[2048];  //2k缓冲区
  30. int i;
  31. INT32U         size1,size2=0;
  32. #define AD_Sample_Num   65535
  33. #define Volume_Num   20
  34. unsigned int Volume=Volume_Num;
  35. /********************************************************************
  36. ** Function name:           myDelay()
  37. ** Descriptions:            延时函数
  38. ** input parameters:        none
  39. ** output parameters:       none
  40. ** Returned value:          none
  41. ** Created by:            
  42. ** Created date:            
  43. **-------------------------------------------------------------------** Modified by:            
  44. ** Modified date:           
  45. ********************************************************************/
  46. void myDelay(INT16U uiTime)
  47. {
  48.     INT16U i,j;
  49.     for(i = 0; i < uiTime; i++) {
  50.       for(j = 0; j < 5000; j++);
  51.     }
  52. }
  53. /********************************************************************
  54. ** Function name:           main
  55. ** Descriptions:
  56. **                          SPI0 CS0  PTC4
  57. **                          SPI0 SCK  PTC5
  58. **                          SPI0 MOSI PTC6
  59. **                          SPI0 MISO PTC7
  60. ** input parameters:        none
  61. ** output parameters:       none
  62. ** Returned value:          none
  63. ** Created by:            
  64. ** Created Date:            
  65. **-------------------------------------------------------------------** Modified by:
  66. ** Modified date:
  67. *******************************************************************/


 楼主| 追逐浪花 发表于 2015-12-12 17:19 | 显示全部楼层
  1. int  main (void)
  2. {
  3.     INT8U flag,part;
  4.          int i;
  5.     int j=0;
  6.           INT32U         cluster,size=0;
  7.     struct        FileInfoStruct FileInfo;
  8.     SystemCoreClockUpdate();                                            /* 时钟配置                     */
  9.     uart0Init(9600,0,0,8,1);
  10.         printf("SD_SPI Test Star...\n");
  11.         gpioInit();                                                         /* 管脚初始化                   */
  12.     Led5Set(1);        /* D5点亮 */
  13.         dacInit();                                                          /* DAC  初始化                 */
  14.         adcInit();
  15.     pitInit();                                                          /* PIT  定时器初始化                 */
  16.         spiInit(SPI0_BASE_PTR , Master);                                    /* SPI0 主机模式初始化           */
  17.       
  18.                 flag=SD_Init();
  19.                 if(flag!=0)
  20.                 {
  21.                         printf("SD_Init...Fall!");
  22.                         while(1);
  23.                 }      
  24.                 FAT_Init();
  25.                 FAT_DisDir("\");
  26.                 while(1)
  27.                 {
  28.                 //   增添以按键来选择语音段播放功能
  29.                 if(j==0)                cluster=FAT_OpenFile("\\1.wav",&FileInfo);
  30.                 if(j==1)                cluster=FAT_OpenFile("\\2.wav",&FileInfo);
  31.                 if(j==2)                cluster=FAT_OpenFile("\\3.wav",&FileInfo);
  32.                 if(j==3)                cluster=FAT_OpenFile("\\4.wav",&FileInfo);
  33.                 if(j==4)                cluster=FAT_OpenFile("\\5.wav",&FileInfo);
  34.                 if(j==5)                cluster=FAT_OpenFile("\\6.wav",&FileInfo);
  35.                               
  36.                 if(cluster==0 || FileInfo.Size == 0)
  37.           {
  38.                 printf("File open err!\n");
  39.                 return 0;
  40.           }
  41.                
  42.     printf("File size is %d",FileInfo.Size);
  43.          FIFO_out = 0;
  44.     FIFO_in  = 0;
  45.          NVIC_EnableIRQ(PIT_IRQn);                                          
  46.     NVIC_SetPriority(PIT_IRQn,3);                                       
  47.     __enable_irq();
  48.         size1=FileInfo.Size;      
  49.                
  50.                 while(size<FileInfo.Size)
  51.                 {
  52.                
  53.                         for(part=0;part<SectorsPerClust;part++)
  54.                         {
  55.                                 FAT_LoadPartCluster(cluster,part,(uint8_t *)(Buffer+FIFO_in));        //读一个扇区
  56.                                 FIFO_in+=512;      
  57.                                 if(FIFO_in==2048) FIFO_in=0;
  58.                
  59.                 do
  60.       {                             //计算缓冲区出入口距离
  61.           i = FIFO_in - FIFO_out;
  62.                                         if(i<0) i+=2048;   //小于0要加上2048,再比较。   
  63.                  
  64.       } while(i>1024);           //如果缓冲区接近溢出,先暂停等待。
  65.                
  66.                   }   
  67.                 cluster=FAT_NextCluster(cluster);  //下一个扇区
  68.                 size=size+SectorsPerClust*512;
  69.                 }
  70.                 j++;
  71.                 if(j>=6) j=0;
  72.                 while((FGPIOD_PDIR & 1<<6) == 1<<6);
  73.                 myDelay(500);
  74.                 myDelay(500);
  75.                 size=0;
  76.                 size2=0;
  77.           }
  78.       
  79. }
  80. /********************************************************************
  81. ** Function name:           PIT_IRQHandler
  82. ** Descriptions:            PIT  8KHz
  83. ** input parameters:        none
  84. ** output parameters:       none
  85. ** Returned value:          none
  86. ** Created by:              
  87. ** Created date
  88. **-------------------------------------------------------------------
  89. ** Modified by:            
  90. ** Modified date:           
  91. ********************************************************************/
  92. void PIT_IRQHandler(void)
  93. {
  94.         PIT_T标志寄存器0 |= PIT_T标志寄存器_TIF_MASK;                                    
  95.         if(adcGetUint()<AD_Sample_Num/3)   
  96.     // 根据ad采样大小 3个led灯显示音量大小程度
  97.         {
  98.                 Led5Set(1);
  99.                 Led6Set(0);
  100.                 Led7Set(0);
  101.                
  102.         }
  103.         else if(adcGetUint()<2*AD_Sample_Num/3)
  104.         {
  105.                 Led5Set(1);
  106.                 Led6Set(1);
  107.                 Led7Set(0);
  108.       
  109.         }
  110.         else
  111.         {
  112.                 Led5Set(1);
  113.                 Led6Set(1);
  114.                 Led7Set(1);      
  115.                
  116.         }      
  117.         Volume=Volume_Num*adcGetUint()>>16;
  118.         if(size2 < size1)        dacTrigger(Buffer[FIFO_out]/(Volume_Num-Volume));        //语音输出
  119.         FIFO_out++;            //输出buffer下标+1
  120.         size2++;
  121.         if(FIFO_out>2047)      //达到最大值,重置下标   
  122.         {
  123.                 FIFO_out=0;
  124.         }
  125. }
  126. /********************************************************************
  127.   END FILE
  128. ********************************************************************/
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

256

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部