⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 target.c

📁 G.711/G.726语音采集源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************Copyright (c)********************************************************
**                   (c) Copyright 2004-2005, ZhaiHai guangdong china  xu.sunny
**                                    All Rights Reserved
**                                   zhiping_xu@hotmail.com
**
**-------------------------------------------File Info--------------------------------------------------------
* File          name:  target.c
* Last modified Date:	
* Last       Version:	1.0
* Descriptions      :  LPC2200 目标板具体代码头文件,每个项目必须包含这个文件,用户可以根据需求更新修改模板
**----------------------------------------------------------------------------------------------------------*/

#define IN_TARGET
#include "config.h"
/***************************************************************************************************************
*                                                IRQ_Exception
*
* Description: 外部中断处理 interrupt exceptional handler
*
* Arguments  : 
*              	         
*			         
* Returns    : 
*				       
* Note       : 根据需求可以改变代码 , change it as needed
***************************************************************************************************************/
void IRQ_Exception(void)
{
  while(1);                   //  change it to your code 这一句替换为自己的代码
}
/***************************************************************************************************************
*                                                FIQ_Exception
*
* Description: 外部快速中断处理 Fast interrupt exceptional handler
*
* Arguments  : 
*                       
* Returns    : 
*				       
* Note       : 根据需求可以改变它 change it as needed
***************************************************************************************************************/
void  FIQ_Exception(void)
{
    uint8 i = 0;
    /*static uint8  ADPCM_COUNT = 2;
	static uint8  ADPCM_TEMP,TEMP;
	T1IR  = 0XFF;
    if (ADPCM_COUNT == 2)
	  {
        ADPCM_TEMP = ADPCM.ADPCM_SEND_BUFF[ADPCM.ADPCM_COUNTER]; // 取语音数据 
	    ADPCM.ADPCM_COUNTER++;
	   // ADPCM_BUFF[ADPCM_CNT] = TEMP;
	    //ADPCM_CNT++;
	    ADPCM.ADPCM_REC_BUF[ADPCM.ADPCM_REC_CNT] = TEMP;// 接受到的数据放入缓冲区	    	    	    	    	    	    	   	    	    
	    ADPCM.ADPCM_REC_CNT++;
	    ADPCM_COUNT = 0;	
	  }	  
	while (i != 4)
	  {
	    IO0SET = PCM_CLK;
	    IO0SET = PCM_SYC;	
	    if ((ADPCM_TEMP & 0X80) == 0)  // 放音
	  	    IO0CLR = PCM_OUT;
	    else 
	  	    IO0SET = PCM_OUT;    
	  	ADPCM_TEMP = ADPCM_TEMP << 1;
	  	TEMP   = TEMP <<1;	  	    
	  	IO0CLR = PCM_CLK;	        	       	        
	    if ((IO0PIN & PCM_IN) != 0)  // 如管脚电平为高时,收到的时1
	  	    TEMP += 0X01;
	  	i++;        	        
	  }    	   
	IO0SET = PCM_CLK;	 
	IO0CLR = PCM_SYC; 
	IO0CLR = PCM_OUT;
	ADPCM_COUNT++; 	      	    
	//ADPCM.ADPCM_REC_BUF[ADPCM.ADPCM_REC_CNT] = TEMP;// 接受到的数据放入缓冲区	    	    	    	    	    	    	   	    	    
	IO0CLR = PCM_CLK;
	//ADPCM.ADPCM_REC_CNT++;	    
	//if ( ADPCM.ADPCM_REC_CNT > 64000)
	     //ADPCM.ADPCM_REC_CNT = 0;*/

uint8  ADPCM_TEMP,TEMP;
	T1IR  = 0XFF;
	ADPCM_TEMP = 0x00;	
    //ADPCM_TEMP = ADPCM.ADPCM_SEND_BUFF[ADPCM.ADPCM_COUNTER]; // 取语音数据 
	//ADPCM.ADPCM_COUNTER++;	
	//if (ADPCM.ADPCM_SEND_CNT == ADPCM.ADPCM_COUNTER) // 放音是否已结束
	  //  ADPCM.ADPCM_COUNTER = 0;
	//else
	 // {  
	  while (i != 8)
	      {
	        IO0SET = PCM_CLK;
	        IO0SET = PCM_SYC;	
	        if ((ADPCM_TEMP & 0X80) == 0)  // 放音
	  	       IO0CLR = PCM_OUT;
	        else 
	  	       IO0SET = PCM_OUT;    
	  	    ADPCM_TEMP = ADPCM_TEMP << 1;
	  	    TEMP   = TEMP <<1;	  	    
	  	    IO0CLR = PCM_CLK;	        	       	        
	        if ((IO0PIN & PCM_IN) != 0)  // 如管脚电平为高时,收到的时1
	  	       TEMP += 0X01;
	  	    i++;        	        
	      }    	   
	    IO0SET = PCM_CLK;	 
	    IO0CLR = PCM_SYC; 
	    IO0CLR = PCM_OUT; 	      	    
	    ADPCM.ADPCM_REC_BUF[ADPCM.ADPCM_REC_CNT] = TEMP;// 接受到的数据放入缓冲区	    	    	    	    	    	    	   	    	    
	    IO0CLR = PCM_CLK;
	    ADPCM.ADPCM_REC_CNT++;	    
	    if ( ADPCM.ADPCM_REC_CNT >= 82000)
	      {
	        T1TCR  = 0x00;               // 禁止计数器1计数
	        ADPCM.DTMF_COUNT = 0X00;
	        ADPCM.ADPCM_REC_CNT = 0;
	      }  
	  //}	
}
/***************************************************************************************************************
*                                                Timer0_Exception
*
* Description: 定时器0中断服务函数 Timer0 interrupt service function
*
* Arguments  :   
*              	         
* Returns    : 
*				       
* Note       : 此定时器主要是服务于系统OSII的时钟节拍
***************************************************************************************************************/
void Timer0_Exception(void)
{
    T0IR = 0x01;
    OSTimeTick();
    VICVectAddr = 0;            //interrupt close 通知中断控制器中断结束   
}
/***************************************************************************************************************
*                                                Timer0Init
*
* Description: Initialize the Time0
*
* Arguments  : 
*                     
* Returns    : 
*				       
* Note       :  Fplck = 55.296M   = 18.nS    
***************************************************************************************************************/
void Timer0Init(void)
{
    T0IR  = 0Xff;
    T0TC  = 0;
    T0TCR = 0x01; // 允许计数器0计数
    T0MCR = 0x03; // 允许匹配中断及匹配时TC复位
    T0MR0 = (Fpclk / OS_TICKS_PER_SEC);
 }
/***************************************************************************************************************
*                                                Timer1Init
*
* Description: Initialize the Time1
*
* Arguments  : 
*                     
* Returns    : 
*				       
* Note       :  Fplck = 27.648M   = 36.17nS    128K = 7.8125uS
***************************************************************************************************************/
void Timer1Init(void)
{
    T1IR  = 0XFF;
    T1TC  = 0;
    T1PR  = 0;
    //T1TCR = 0x01; // 允许计数器1计数
    T1MCR = 0x03; // 允许匹配中断及匹配时TC复位
    T1MR0 = (Fpclk / 8000); //(Fpclk / OS_TICKS_PER_SEC);
 }
/***************************************************************************************************************
*                                                PWMInit
*
* Description: Initialize the PWM,用于一个标准定时器
*
* Arguments  : 
*                     
* Returns    : 
*				       
* Note       :  Fplck = 55.296M   = 18.085nS    8K = 125uS
***************************************************************************************************************/
void PWMInit(void)
{
    PINSEL1 = (PINSEL1 & 0XFFFFF3FF) | 0X400;
    PWMIR  = 0X70F;
    PWMTC  = 0;
    PWMPR  = 0;    
    PWMMCR = 0X01; // 允许匹配5中断及匹配时TC复位
    PWMMR0 = (Fpclk / 10368000);
    PWMMR5 = (Fpclk / 20736000);
    PWMLER = 0x21;
    PWMPCR = (1 << 13);            /* 允许PWM5输出,单边PWM    */	
    PWMTCR = 0x09;            // 允许计数器1计数,允许PWM使能
 } 
/***************************************************************************************************************
*                                                EINT0_Init
*
* Description: 初始化目标板上的中断0  DTMF中断输入
*
* Arguments  : Pinsel: 主要是选择使用那个管脚作为外部中断输入
*                     
* Returns    : 
*				       
* Note       :  根据实际需要可以改变代码
***************************************************************************************************************/
void EINT0_Init(unsigned int Pinsel)
{
  uint8  i;
  
  if (Pinsel == 0X0C)                                // 参数过滤

      PINSEL0  = (PINSEL0 & 0XFFFFFFF3) | 0X0C;       // P0.1设置为外部中断 0 输入

  else 

     PINSEL1  = (PINSEL1 & 0XFFFFFFFC)  | 0X01;       // P0.16设置为外部中断 0 输入
     
   // EXTMODE 寄存器 使用复位值0X00,电平触发 
   i = VPBDIV; 
   i = VPBDIV;
  //if (i != 0)
   // VPBDIV   = 0x00; 
  EXTMODE  = EXTMODE | 0X01;                 // 设置中断方式,“1”边沿触发
  VPBDIV   = 0x00;
  VPBDIV   = 0x01;  
                                   
  // 写 EXTPOLAR 寄存器使用复位值0X00,低电平有效
  EXTPOLAR = (EXTMODE & 0X0E) | 0X01;                // 设置中断极性,“1”上升沿有效
  VPBDIV   = 0x00;
  VPBDIV   = 0x01;                                   // 重新设置 VPBDIV    
  EXTINT   = 0X0f;                                   // 清除EXTINT0的中断标志 
}
/***************************************************************************************************************
*                                                EINT1_Init
*
* Description: 初始化目标板上的中断1
*
* Arguments  : Pinsel: 主要是选择使用那个管脚作为外部中断输入
*                     
* Returns    : 
*				       
* Note       :  根据实际需要可以改变代码
***************************************************************************************************************/
void EINT1_Init(unsigned int Pinsel)
{
  uint8  i;
  
  if (Pinsel == 0X000000C0)
      PINSEL0  = (PINSEL0 & 0XFFFFFF3F) | 0X000000C0; // P0.3设置为外部中断 1 输入

  else   
      PINSEL0  = (PINSEL0 & 0XCFFFFFFF) | 0X20000000; // P0.14设置为外部中断 1 输入
  //EXTWAKE = 0X02; 
   // 写 EXTMODE 寄存器 
  i = VPBDIV;
  i = VPBDIV;
  if (i != 0)
    VPBDIV = 0X00;    
  EXTMODE  = (EXTMODE & 0X0D) | 0X02;                // 设置中断方式,“1”边沿触发
  VPBDIV   = 0x00;
  VPBDIV   = 0x01; 
  
  // 写 EXTPOLAR 寄存器
  EXTPOLAR = (EXTPOLAR & 0X0D)| 0X00;                // 设置中断极性,“0”上升沿有效
  VPBDIV   = 0x00;
  VPBDIV   = 0x01; 
  EXTINT   = 0X0f;                                   // 清除EINT1的中断标志
}
/***************************************************************************************************************
*                                                EINT2_Init
*
* Description: 初始化目标板上的中断2
*
* Arguments  : Pinsel: 主要是选择使用那个管脚作为外部中断输入
*                     
* Returns    : 
*				       
* Note       :  根据实际需要可以改变代码
***************************************************************************************************************/
void EINT2_Init(unsigned int Pinsel)
{
  uint8 i;
  if (Pinsel == 0X0000C000)
      PINSEL0  = (PINSEL0 & 0XFFFF3FFF) | 0X0000C000; //设置P0.7为中断2输入
      
  else
      PINSEL0  = (PINSEL0 & 0X3FFFFFFF) | 0X80000000;     // 设置P0.15为中断2输入

  // 写 EXTMODE 寄存器 
  i = VPBDIV;
  i = VPBDIV;
  if (i != 0)
     VPBDIV = 0X00;     
  EXTMODE  = (EXTMODE & 0X0B) | 0X04;                 // 设置中断方式,“1”边沿触发
  VPBDIV   = 0X00;
  VPBDIV   = 0X01;
  
  // 写 EXTPOLAR 寄存器
  EXTPOLAR = (EXTPOLAR & 0X0B) | 0X04;                 // 设置中断极性,“1”上升沿有效
  VPBDIV   = 0X00;
  VPBDIV   = 0X01;
  EXTINT   = 0X0f;
}
/***************************************************************************************************************
*                                                EINT3_Init
*
* Description: 初始化目标板上的中断3
*
* Arguments  : Pinsel: 主要是选择使用那个管脚作为外部中断输入
*                     
* Returns    : 
*				       
* Note       :  根据实际需要可以改变代码
***************************************************************************************************************/
void EINT3_Init(unsigned int Pinsel)
{
  uint8  i;
  
  if (Pinsel == 0X300)
     PINSEL1  = (PINSEL1 & 0XFFFFFCFF) | 0X300;       // 设置P0.20为中断3输入
     
  else
     PINSEL1  = (PINSEL1 & 0XCFFFFFFF) | 0X20000000;  // 设置P0.30为中断3输入
     
  // 写 EXTMODE 寄存器
  i = VPBDIV;
  i = VPBDIV;
  if (i != 0) 
    VPBDIV   = 0x00; 
    
  EXTMODE  = (EXTMODE & 0X07) | 0X08;                 // 设置中断方式,“1”边沿触发
  VPBDIV   = 0x00;
  VPBDIV   = 0x01; 
                                     
  // 写 EXTPOLAR 寄存器 
  EXTPOLAR = (EXTPOLAR & 0X07)| 0X08;                 // 设置中断极性,“1”上升沿有效
  VPBDIV   = 0x00;
  VPBDIV   = 0x01;                                     // 重新设置 VPBDIV  
  EXTINT   = 0X0f; 
}
/***************************************************************************************************************
*                                               VICInit
*
* Description: Initialize the Interrupt Vevtor Controller 初始化中断向量控制器
*
* Arguments  : 
*                     
* Returns    : 
*				       
* Note       :  根据实际需要可以改变代码,所有的中断向量设置
***************************************************************************************************************/
void VICInit(void)
{
    extern void IRQ_Handler(void);
   
    extern void UART0_Handler(void);
    extern void UART1_Handler(void);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -