?? main.c
字號:
// 功能描述:SPCE061A語音系統
#include "SPCE061A.h"
#include "DVR1600.h"
extern void ERASE_ST39VF040(void);
extern void Write_ST39VF040_One_Word(unsigned long m_addr,unsigned int m_data);
extern unsigned int Read_ST39VF040_One_Word(unsigned long m_addr);
extern void SACM_DVR1600_Stop(void);
#define C_UARTBaudRate_38400_H 0x01
#define C_UARTBaudRate_38400_L 0x40
#define uint unsigned int
#define ulong unsigned long
uint ext2flag,recvdata1,recvdata2,sendflag,playflag,playstate;
uint SOUND_NUM,VolumeIdx,writeflag,loopflag;
ulong flashaddr,timedelay;
int SndIdx;
uint uartrecvchar(uint *pchar)
{
uint temprecv;
timedelay=0;
while(!(*P_UART_Command2 & 0x0080)){
if(++timedelay==0x00100000)
{
*P_UART_Command1 = C_UART_RX_INT;
return 0;
}
*P_Watchdog_Clear = 0x0001;
}
temprecv = *P_UART_Data;
temprecv &=0x00FF;
*pchar=temprecv;
return 1;
}
void Initial(void)
{
// *P_SystemClock = 0x0098;
*P_INT_Mask = C_IRQ3_EXT2;
*P_IOA_Dir=0xffff;
*P_IOA_Attrib=0xffff;
*P_IOA_Data=0xffff;
*P_IOB_Dir=0xff77;
*P_IOB_Attrib=0xffff;
*P_IOB_Data=0xfff7;
*P_UART_BaudScalarHigh = C_UARTBaudRate_38400_H; //波特率設為38400
*P_UART_BaudScalarLow = C_UARTBaudRate_38400_L;
*P_UART_Command1 = C_UART_RX_INT; //UART接收中斷使能
*P_UART_Command2 = C_UART_TX_EN | C_UART_RX_EN; //UART接收發送管腳使能
__asm("IRQ ON");
}
void Record(void)
{
SACM_DVR1600_Initial(); // DVR1600初始化
SACM_DVR1600_Rec(0, BITRATE_16K); // 開始錄音,選擇16Kbps碼率。第一個參數無意義。
while(SACM_DVR1600_Status()&STATUS_PLAY) // 檢測錄音是否完成(當錄音數據充滿Flash后錄音完成)
{
*P_Watchdog_Clear = 0x01; // 清看門狗
SACM_DVR1600_ServiceLoop(); // 進行壓縮編碼
}
}
void PlayRecord(void)
{
playstate=1;
SACM_DVR1600_Play(SndIdx, DAC_1+DAC_2, RAMP_UP_DN); // 開始放音,由DAC1和DAC2輸出。第一個參數無意義。
while(SACM_DVR1600_Status()&STATUS_PLAY) // 檢測放音是否完成
{
*P_Watchdog_Clear = 0x01; // 清看門狗
SACM_DVR1600_ServiceLoop(); // 進行解碼
}
if (loopflag){
SndIdx++;
if (SndIdx==SOUND_NUM)
SndIdx=0;
}
}
//========================================================================
// 主函數
//========================================================================
int main()
{
Initial();
ext2flag=0;
playflag=0;
loopflag=1;
playstate=0;
flashaddr=0x00000004;
/* flashaddr=0x00001000;
for (loopflag=0;loopflag<0xff;loopflag++)
SOUND_NUM=Read_ST39VF040_One_Word(flashaddr);
*/
SOUND_NUM=Read_ST39VF040_One_Word(flashaddr);
if (SOUND_NUM>30)
SOUND_NUM=30;
VolumeIdx = 8; // 音量等級,可在0~15之間變化,默認的音量等級為8。
SndIdx = 0;
SACM_DVR1600_Initial(); // DVR1600初始化
SACM_DVR1600_Volume(VolumeIdx);
while(1)
{
if (ext2flag)
{
if (playflag)
PlayRecord();
*P_INT_Mask = *P_INT_Mask | C_IRQ3_EXT2;
ext2flag=0;
}
*P_Watchdog_Clear = 0x0001;
}
}
//========================================================================
// 中斷服務程序
//========================================================================
void FIQ(void)__attribute__((ISR));
void FIQ()
{
*P_INT_Clear = C_FIQ_TMA; // 清中斷請求標志
SACM_DVR1600_ISR(); // 調用中斷服務子程序
}
void IRQ3(void) __attribute__ ((ISR)); //外部中斷
void IRQ3(void)
{
ext2flag=1;
*P_INT_Clear = C_IRQ3_EXT2;
}
void IRQ5(void) __attribute__ ((ISR)); //定時中斷
void IRQ5(void)
{
}
void IRQ7(void) __attribute__ ((ISR)); //串口中斷
void IRQ7(void)
{
writeflag=0;
*P_UART_Command1 = 0x0000;
if (!uartrecvchar(&recvdata1))
return;
if (recvdata1==0x0001)
{
SACM_DVR1600_Stop();
playflag=1;
loopflag=1;
if (playstate)
SndIdx=-1;
else
SndIdx=0;
*P_UART_Command1 = C_UART_RX_INT;
return;
}
else if (recvdata1==0x0002)
{
SACM_DVR1600_Stop();
if (!uartrecvchar(&recvdata1))
return;
playflag=1;
loopflag=0;
SndIdx=recvdata1;
*P_UART_Command1 = C_UART_RX_INT;
return;
}
else if (recvdata1==0x0003)
{
SACM_DVR1600_Stop();
playstate=0;
playflag=0;
loopflag=0;
*P_UART_Command1 = C_UART_RX_INT;
return;
}
else if (recvdata1==0x0004)
{
VolumeIdx += 1;
if(VolumeIdx>15)
VolumeIdx = 0;
SACM_DVR1600_Volume(VolumeIdx);
*P_UART_Command1 = C_UART_RX_INT;
return;
}
else if (recvdata1==0x0005)
{
if(VolumeIdx>0)
VolumeIdx -= 1;
SACM_DVR1600_Volume(VolumeIdx);
*P_UART_Command1 = C_UART_RX_INT;
return;
}
else if (recvdata1==0x0006)
{
SACM_DVR1600_Stop();
writeflag=1;
ERASE_ST39VF040();
}
else
{
*P_UART_Command1 = C_UART_RX_INT;
return;
}
sendflag=0;
flashaddr=0x00000000;
while (1)
{
flashaddr++;
if (!uartrecvchar(&recvdata1))
{
if (sendflag && writeflag)
{
Write_ST39VF040_One_Word(flashaddr,recvdata2);
}
break;
return;
}
if (sendflag==0)
{
sendflag=1;
recvdata2 = recvdata1;
}
else
{
sendflag=0;
recvdata1 = recvdata1 <<8;
recvdata1 = recvdata1 + recvdata2;
Write_ST39VF040_One_Word(flashaddr,recvdata1);
}
// if (recvint==4096)
// {
// recvint=0;
// *P_UART_Data = 0x01;
// while(!(*P_UART_Command2 & 0x0040)){
// *P_Watchdog_Clear = 0x0001;
// }
// }
*P_Watchdog_Clear = 0x0001;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -