main.c

来自「博创2410的实验代码」· C语言 代码 · 共 246 行

C
246
字号
/***************************************************************************\
	Copyright (c) 2004-2007 threewater@up-tech.com, All rights reserved.
	by threewter	2004.5.12
\***************************************************************************/
/***************************************************************************\
    #说明: C  main 函数,ucos-ii初始化等定义
	----------------------------------  Bug  --------------------------------------

	----------------------------------  TODO list  --------------------------------------

	----------------------------------修正--------------------------------------
	2004-5-12	创建

\***************************************************************************/

#include"../ucos-ii/includes.h"               /* uC/OS interface */
#include "../ucos-ii/add/osaddition.h"
#include "../inc/drivers.h"

#include "../inc/sys/lib.h"
#include "../src/gui/gui.h"
//#include "2410addr.h"
#include <string.h>
#include <stdio.h>

#pragma import(__use_no_semihosting_swi)  // ensure no functions that use semihosting 

///******************任务定义***************///

#define rUTRSTAT0	(*(volatile unsigned *)0x50000010)
OS_STK Main_Stack[STACKSIZE]={0, };   //Main_Test_Task堆栈
void Main_Task(void *Id);             //Main_Test_Task
#define Main_Task_Prio     12

OS_STK test_Stack[STACKSIZE]={0, };   //test_Test_Task堆栈
void test_Task(void *Id);             //test_Test_Task
#define test_Task_Prio     15

//void Main_Task(void); 
int  Audio_Init(void);
static void uda1341_l3_address(U8 data);
static void uda1341_l3_data(U8 data);
unsigned Init_UDA1341(void);
void UDA1341_Send(unsigned char data);

FILE* pfile;                           //定义文件结构指针
U32 DataCount=0;
char str[AUDIO_IN_BUFFERSIZE*20];      //文件缓冲区
char TextFilename[]="/sys/ucos/fj/1.wav";

/***************************************************************/

/**************已经定义的OS任务*************
#define SYS_Task_Prio				1
#define Touch_Screen_Task_Prio		9
#define Main_Task_Prio              12
#define Key_Scan_Task_Prio          58
#define Lcd_Fresh_prio              59
#define Led_Flash_Prio              60

********************************************/

#define    LEN     64
int main(void)
{
  	ARMTargetInit();        // do target (uHAL based ARM system) initialisation //

	OSInit();               // needed by uC/OS-II //
	OSInitUart();
	initOSFile();
	
#if USE_MINIGUI==0
	initOSMessage();
	initOSList();
	initOSDC();
	initOSCtrl();
	LoadFont();
#endif

	loadsystemParam();
	
	// create the tasks in uC/OS and assign increasing //
	// priorities to them so that Task3 at the end of  //
	// the pipeline has the highest priority.          //
	LCD_printf("Create task on uCOS-II...\n");
	OSTaskCreate(Main_Task,  (void *)0,  (OS_STK *)&Main_Stack[STACKSIZE-1],  Main_Task_Prio);
	OSAddTask_Init(1);
	Audio_Init();
	pfile=fopen(TextFilename,"r");         //打开文件
	if(pfile==NULL){                       //文件打开失败
		LCD_printf("\n   Can't Open file!\n");
		while(1);
			OSTimeDly(1000);
	}
    DataCount=fread((U8*)str,512,(int)(AUDIO_IN_BUFFERSIZE*20/512),pfile);//读取音频文件数据
 	LCD_printf("Starting uCOS-II...\n");
	OSStart();       // start the OS //
    // never reached //
	return 0;
}

static void uda1341_l3_address(U8 data)   //设置UDA1341寄存器地址
{
	int i;

	write_gpio_bit(GPIO_L3CLOCK, 1);
	write_gpio_bit(GPIO_L3DATA, 0);
	hudelay(10);
	write_gpio_bit(GPIO_L3MODE, 0);     //L3MODE为低,设置地址模式
	hudelay(5);
	
	for (i = 0; i < 8; i++) {
		if (data & 0x1) {
			write_gpio_bit(GPIO_L3CLOCK, 0);//配合write_gpio_bit(GPIO_L3CLOCK, 1);模拟L3CLOCK时钟
			hudelay(1);
			write_gpio_bit(GPIO_L3DATA, 1); //写入1数据
			hudelay(1);
			write_gpio_bit(GPIO_L3CLOCK, 1);
			hudelay(1);
		} else {
			write_gpio_bit(GPIO_L3CLOCK, 0);
			hudelay(1);
			write_gpio_bit(GPIO_L3DATA, 0); //写入0数据
			hudelay(1);
			write_gpio_bit(GPIO_L3CLOCK, 1);
			hudelay(1);
		}
		data >>= 1;
	}
    hudelay(5);
	write_gpio_bit(GPIO_L3MODE, 1);
	hudelay(1);
}

static void uda1341_l3_data(U8 data)  //写UDA1341数据寄存器
{
	int i;
	write_gpio_bit(GPIO_L3MODE, 1);   //L3MODE为高,设置数据传输模式
	hudelay(5);
	
	for (i = 0; i < 8; i++) {
		if (data & 0x1) {
			write_gpio_bit(GPIO_L3CLOCK, 0);//配合write_gpio_bit(GPIO_L3CLOCK, 1);模拟L3CLOCK时钟
			hudelay(1);
			write_gpio_bit(GPIO_L3DATA, 1); //写入1数据
			hudelay(1);
			write_gpio_bit(GPIO_L3CLOCK, 1);
			hudelay(1);
		} else {
			write_gpio_bit(GPIO_L3CLOCK, 0); //配合write_gpio_bit(GPIO_L3CLOCK, 1);模拟L3CLOCK时钟
			hudelay(1);
			write_gpio_bit(GPIO_L3DATA, 0);  //写入0数据
			hudelay(1);
			write_gpio_bit(GPIO_L3CLOCK, 1);
			hudelay(1);
		}

		data >>= 1;
	}

	//write_gpio_bit(GPIO_L3MODE, 1);
	hudelay(1);
	write_gpio_bit(GPIO_L3MODE, 0);
	hudelay(2);
	write_gpio_bit(GPIO_L3MODE, 1);
}

static int uda1341_volume;
static U8 uda_sampling;
static int uda1341_boost;
unsigned Init_UDA1341(void)
{

  	uda1341_volume = 62 - ((DEF_VOLUME * 61) / 100);
	uda1341_boost = 0;
  	uda_sampling = DATA2_DEEMP_NONE | DATA2_PEAKAFTER;
	uda_sampling &= ~(DATA2_MUTE);

	write_gpio_bit(GPIO_L3CLOCK, 1);
	write_gpio_bit(GPIO_L3MODE, 1);

	uda1341_l3_address(UDA1341_REG_STATUS); //UDA1341复位
    uda1341_l3_data(STAT0_RST); 
    
	uda1341_l3_address(UDA1341_REG_STATUS);//写状态控制寄存器,设置UDA1341,参见UDA1341手册P15
    uda1341_l3_data(STAT0_SC_384FS | STAT0_IF_I2S | STAT0_DC_FILTER); // 256 system clock,IIS
    uda1341_l3_data(STAT1 | STAT1_DAC_GAIN | STAT1_ADC_GAIN | STAT1_ADC_ON | STAT1_DAC_ON);

    uda1341_l3_address(UDA1341_REG_DATA0); //写UDA1341数据寄存器,参见UDA1341手册P17
	uda1341_l3_data(DATA0 |DATA0_VOLUME(uda1341_volume));  // maximum volume
	uda1341_l3_data(DATA1 |DATA1_BASS(uda1341_boost)| DATA1_TREBLE(0));
    uda1341_l3_data(DATA2 |uda_sampling);
	uda1341_l3_data(EXTADDR(EXT2));
	uda1341_l3_data(EXTDATA(EXT2_MIC_GAIN(0x6)| EXT2_MIXMODE_CH2));
	uda1341_l3_data(EXTADDR(EXT5));
	uda1341_l3_data(EXTDATA(0x7));

	write_gpio_bit(GPIO_L3CLOCK, 1);
	write_gpio_bit(GPIO_L3MODE, 0);
    return 1;
}

void IIS_PortSetting(void)
{
    //----------------------------------------------------------
    //   PORT G GROUP
    //Ports  :   GPG9   GPG10  GPG8  
    //Signal :  L3CLOCK L3DATA L3MODE
    //Setting:   OUTPUT OUTPUT OUTPUT 
    //          [18:19] [20:21] [16:17]
    //Binary :     01  ,  01      01 
    //----------------------------------------------------------
    rGPGDAT = rGPGDAT & ~(UDA1341_MODE|L3CLK|L3DATA) |(UDA1341_MODE|L3CLK); //设置UDA1341 L3接口
    //Start condition : L3M=H, L3C=H
    rGPGUP  = rGPGUP  & ~(0x7<<8)|(0x7<<8);   //GPG8-10上拉关闭
    //The pull up function is disabled GPG[8:10]     
    rGPGCON = rGPGCON & ~(0x3f<<16)|(0x15<<16); //GPG8-10配置为输出
    //GPB[8:10]=Output(L3CLOCK):Output(L3DATA):Output(L3MODE)
    //----------------------------------------------------------
    //   PORT E GROUP
    //Ports  :  GPE4    GPE3   GPE2  GPE1    GPE0 
    //Signal : I2SSDO  I2SSDI CDCLK I2SSCLK I2SLRCK 
    //Binary :   10  ,   10     10 ,  10      10    
    //----------------------------------------------------------
    rGPEDAT = 0x0;
    rGPEUP  = rGPEUP  & ~(0x1f)  | 0x1f;
    //The pull up function is disabled GPE[4:0] 1 1111
    rGPECON = rGPECON & ~(0x3ff) | 0x2aa;
    //GPE[4:0]=I2SSDO:I2SSDI:CDCLK:I2SSCLK:I2SLRCK
}

int Audio_Init(void)      //音频配置初始化
{
    IIS_PortSetting();    //音频相应端口设置    
    Init_UDA1341();       //UDA1341初始化   
    return OK;
}

void Main_Task(void *Id)             //Main_Test_Task   Add by Allan_hua              
{
    int i=100;
    char *data;
	LCD_printf("Now Begin Playing...\n");

    //DMA2 for AudioOut
    rDMASKTRIG2 = (1<<2)|(0<<1);	//Dma2Stop

⌨️ 快捷键说明

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