📄 target.c
字号:
/****************************************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 + -