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

📄 main.c

📁 bu1566dsp芯片用来处理ov7660或其他30万摄像模组的图像预览.图像拍照(jpeg压缩)
💻 C
字号:
/****************************************Copyright (c)**************************************************
**--------------File Info-------------------------------------------------------------------------------
** File name:			main.c
** Last modified Date:  2007-04-16
** Last Version:		1.0
** Descriptions:		The main() function example template

********************************************************************************************************/
#include "config.h"
#include "stdlib.h"
#include "BUxx_Sample.h"
#include "BUxx_aDSC.h"
#include "BUxx_Main.h"
#include  "main.h"
#include "I2C.h"
#include "zlg7290.h"
#include  "target.h"
#include  "UART0.h"
#include  "lcddrive.h"

#include  "UART0.h"
#include  "hpi32.h"
#include  "fat32.h"


#define   KEY1       1<<20	         // 定义按键
#define   HcRECT   (1<<10)           // FOR RESET
#define   UART_BPS  115200           // 定义通讯波特率
#define   ZLG7290 0x70               // 定义器件地址
#define	BEEP	(1 << 7)            /* P0.07为蜂鸣器 */
#define   KEY_INT  1<<30           // 定义p0.30为 按键中断

#define   LEDCON   0xf0000000
char      SendBuf[16];     

UINT32 jpeg_size = JPEG_BUFFER;              //定义最大JPEG尺寸_    
//UINT16 * start_add = (UINT16 *) 0x80400000;  //定义放置DATA的起始地址
static UINT16  start_add[1024*100];

#define ARMMJPEG_BUFFER	(256*1024)
UINT32 ARMmjsize = ARMMJPEG_BUFFER;


#define	TaskStkLengh	512			//Define the Task0 stack length 定义用户任务0的堆栈长度 
#define TASK_STK_SIZE  128

#define CMD_SD_INIT		   0x00				/* 卡初始化卡命令  */
#define CMD_SD_READ    	   0x01				/* 卡读命令        */
#define CMD_SD_WRITE   	   0x02				/* 卡写命令        */
#define CMD_SD_ERASE	   0x03				/* 卡擦除命令      */

#define CMD_DATA_TRANS	   0x04				/* 将sd_buf中的数据发送到PC机 */
#define CMD_DATA_RECV	   0x05				/* 接收来自串口的数据,并放入sd_buf中 */

/* SD/MMC卡读写缓冲区,比SDMMC卡一个块大8字节 */  
uint8 sd_buf[520];

OS_STK  TaskStartStk[TASK_STK_SIZE]; 
OS_STK	TaskStk0[TaskStkLengh];		//Define the Task0 stack 定义用户任务0的堆栈
OS_STK	TaskStk1[TaskStkLengh];		//Define the Task1 stack 定义用户任务1的堆栈
OS_STK	TaskStk2[TaskStkLengh];		//Define the Task2 stack 定

OS_STK   TaskStk[TASK_STK_SIZE];			/* 任务堆栈 */


OS_STK	Task0Stk [TaskStkLengh];    // 定义用户任务0的堆栈
OS_STK	Task1Stk [TaskStkLengh];    // 定义用户任务1的堆栈

OS_STK   TaskCardStk[TASK_STK_SIZE];		/* 卡操作任务堆栈 */
OS_EVENT *Uart0ReviceMbox;					/* 串口接收数据邮箱 */

void 	Task0(void *pdata);			// 任务0

extern void C_Entry(void);
extern void  __irq aDSC_int_disp(void);
extern void  UART0SendStr(char *str);

/****************************************************************************
* 名    称:main()
****************************************************************************/

int main(void)
{  
    // UINT8 Key = 0;
     //UINT8 init_once = 0;
     char *start = "WELCOME";                     //write Frame jpeg    
     //static UINT16 start_add[100*1024]; 
   
     /************************ 初始化SD card  *************************/ 
     UINT8 *pRec;
     UINT8 err;
     UINT32 bufaddr,blockaddr,blocknum;
     uint16 temp; 
	
   //  pdata = pdata; 
     /************************ 初始化中断  *************************/
     PINSEL0 = 0x00000000;                         // 设置管脚连接GPIO 
     PINSEL1 = 0x00000000;

   /************************ 初始化DSP  *************************/ 
       Reset_BU1566();                 //Reset BU1566

     // INIT_BU1566();                  //BU1566 中断设定   
                                 /* 目标板初始化 */
   /******************* 初始化LCD and CAM  初始化串口************/        
       GUI_Initialize();                   // 初始化ARM 上的 LCD 
     
       C_Entry();                             // 初始化屏,刷BU1566屏红蓝色  
      
       sStartPreview();      
    /*******************  初始化串口************/
       UART0Init(115200);                 // 初始化UART0 为打印日期用的
       Time0Init();				     // 初始化定时器0 为测试串口用

  /******************* CMD_SD_INIT  初始化************/	      
    temp = SD_Initialize();				/* 初始化SD卡 */
//	EnumSdDev(); //读取sd卡系统信息   
//	CreateFile(0,"abcdef.jpg",0);//创建文件,文件名为8位

    sJPEGCEncode((UINT16 *) start_add, 19);
   
//	WriteFile(len,ubuf);//写数据,len=数据长度,ubuf=数据	

     sJPEGDecode((UINT16 *) start_add,&jpeg_size);	

			
}

 
/****************************************************************************
* 名    称:Reset_BU1566()
* 功    能:reset BU1566
* 入口参数:无
* 出口参数:无PINSEL0 &=~((0x3<<20)|(0xA<<0));
****************************************************************************/ 
void Reset_BU1566(void)
{
    UINT8 i;
    PINSEL0 &=~(0x3<<20);                   // 设置管脚po.10为连接GPIO输出
    IO0DIR |= HcRECT;	                    // 设置 P0.10为I/O为输出

   //直接写以下设定P0.10为输出也可
    //  IO0PIN = HcRECT;
  
     IO0SET = HcRECT;				        // BEEPCON = 1
	 for(i =0; i < 40; i ++);
     IO0CLR = HcRECT;				        // BEEPCON = 0
	 for(i =0; i < 40; i ++);	
     IO0SET = HcRECT;	
	 for(i =0; i < 40; i ++);               // BEEPCON = 1

} 

/****************************************************************************
* 名    称:INIT_BU1566()
* 功    能:BU1566的中断。 
* 入口参数:无
* 出口参数:无
****************************************************************************/
void INIT_BU1566(void)
{
    //p0.16 INT pin
   // PINSEL0 &=~(0xA<<0);                 // 设置管脚连接GPIO ,设置I/O连接到UART0 
   // PINSEL0 |= 0x00000005;                 // 设置管脚连接GPIO ,设置I/O连接到UART0     
   
    PINSEL1 |= 0x00000001;                 // 设置管脚连接,P0.16设置为EINT0
    EXTMODE = 0x0f;		                   // 设置EINT0中断为边沿触发模式 
    EXTPOLAR = 0x00;                       //下降沿有或低电平

    //为直接设定通道数,如spi为10=A
    VICVectCntl7 = (0x20|0x0E);            // 设置EINT0分配到IRQslot1
    
    VICVectAddr1 = (int) aDSC_int_disp;	   // 设置中断服务程序地 址
    
    VICIntEnable = 1<<14;		    	   // 使能EINT0中断,EINT0在Bit14上
 //   VICIntEnable = 0x00004000;           //使能EINT0中断,EINT0在Bit14
 }

/****************************************************************************
* 名    称:Time0Init()
* 功    能:初始化定时器0,定时时间为1S。 
* 入口参数:无
* 出口参数:无
****************************************************************************/
void TimeSendLCD(void)	
{
  
    uint32 times, hour, min, sec;
    char szTime[10];

    
    while( 0==(ILR&0x01) );       	// 等待RTC增量中断标志
    ILR = 0x01;				    	// 清除中断标志

    times = CTIME0;
    
    hour = 0x1F & (times>>16);
    min  = 0x3F & (times>>8);
    sec  = 0x3F & (times);
    szTime[0] = '0' + (hour/10); // '0' + 1 = '1'
    szTime[1] = '0' + (hour%10);
    szTime[2] = ':';
    szTime[3] = '0' + (min/10);
    szTime[4] = '0' + (min%10);
    szTime[5] = ':';
    szTime[6] = '0' + (sec/10);
    szTime[7] = '0' + (sec%10);
    szTime[8] = 0;	//	end flag of string
    
    
    SendTimeRtc();            // 读取时钟值,并向UART0发送
    
    aDRT_clear(0, 0, M_LCD_WSIZE, M_LCD_HSIZE, 0xf800 );	
    aDRT_write_string(szTime,2, 20, 40);
            
 }


/****************************************************************************
* 名    称:Time0Init()
* 功    能:初始化定时器0,定时时间为1S。 
* 入口参数:无
* 出口参数:无
****************************************************************************/
void  Time0Init(void)
{   /* Fcclk = Fosc*4 = 11.0592MHz*4 = 44.2368MHz
	   Fpclk = Fcclk/4 = 44.2368MHz/4 = 11.0592MHz
	*/
    T0PR = 99;			    					// 设置定时器0分频为100分频,得110592Hz
	T0MCR = 0x03;		   						// 匹配通道0匹配中断并复位T0TC
	T0MR0 = 552960;	    						// 比较值(1S定时值)
	T0TCR = 0x03;		   						// 启动并复位T0TC
	T0TCR = 0x01; 
}


/****************************************************************************
* 名    称:UART0_SendByte()
* 功    能:向串口发送字节数据,并等待发送完毕。
* 入口参数:data		要发送的数据
* 出口参数:无
****************************************************************************/
void  UART0_SendByte(uint8 data)
{  
    U0THR = data;				    	// 发送数据
    
    while( (U0LSR&0x40)==0 );	    	// 等待数据发送完毕
}

/****************************************************************************
* 名    称:UART0_SendStr()
* 功    能:向串口发送一字符串
* 入口参数:srt		要发送的字符串的指针
* 出口参数:无
****************************************************************************/
void  UART0_SendStr(uint8 const *str)
{  
    while(1)
    {  
        if( *str == '\0' ) break;
        UART0_SendByte(*str++);	    	// 发送数据
    }
}

/****************************************************************************
* 名    称:Time_INIT()
* 功    能:定时器。 
* 入口参数:无
* 出口参数:无
****************************************************************************/
 void Time_INIT(void)
 {
 
       while( (T0IR&0x01) == 0 );	  // 等待定时时间到
       T0IR = 0x01;
}



/*********************************************************************************************************
** 函数名称: TaskStart
** 功能描述: μCOS-II的第一个任务,通常由它初始化目标板和建立其它任务
********************************************************************************************************/
        void  TaskCard(void *pdata)
{
    uint8 *pRec;
    uint8 err;
	uint32 bufaddr,blockaddr,blocknum;
	
    pdata = pdata;                                                     /* 避免编译警告 */

    Uart0ReviceMbox = OSMboxCreate(NULL);                              /* 建立邮箱 */
    if (Uart0ReviceMbox == NULL)
        while (1);

  
    TargetInit();                                                      /* 目标板初始化 */
    for (;;)
    {
        pRec = (uint8 *)OSMboxPend(Uart0ReviceMbox, 0, &err);          /* 接收数据 */
        switch(pRec[0])
    	{
    		case CMD_SD_INIT: pRec[1] = SD_Initialize();			   /* 初始化SD卡 */
    		break; 
    		
    		case CMD_SD_READ:
    			 blockaddr = (pRec[1] << 24) + (pRec[2] << 16) +	   /* 计算块地址 */
    						 (pRec[3] << 8) + pRec[4];
    			 pRec[1] = SD_ReadBlock(blockaddr, sd_buf);		 	   /* SD卡单块读 */ 			
    		break;
    		 	    		
    		case CMD_SD_WRITE:	 
    			 blockaddr = (pRec[1] << 24) + (pRec[2] << 16) + 
    						 (pRec[3] << 8) + pRec[4];
    			 pRec[1] = SD_WriteBlock(blockaddr, sd_buf);		   /* SD 卡单块写 */
    		break;
    			
    		case CMD_SD_ERASE:	 
    			 blockaddr = (pRec[1] << 24) + (pRec[2] << 16) + 
    						 (pRec[3] << 8) + pRec[4];				   /* 擦卡起始地址 */
    			 blocknum  = (pRec[5] << 16) + (pRec[6] << 8) +	
    				 		 (pRec[7]);								   /* 块数 */
    			 pRec[1] = SD_EraseBlock(blockaddr, blocknum);		   /* 擦除操作 */
    		break;
   			
    		case CMD_DATA_RECV:	 
    			 bufaddr = (pRec[1] << 8) + pRec[2];				   /* 计算缓冲区地址 */
    			 memcpy(sd_buf + bufaddr, &pRec[3], 5);				   /* 收到数据放入pRec */
    		break;
    			
    		case CMD_DATA_TRANS: 
    			 bufaddr = (pRec[1] << 8) + pRec[2];				   /* 计算缓冲区地址 */ 
    			 memcpy(&pRec[1], sd_buf + bufaddr, 7);				   /* sd_buf数据放入pRec */
    		break;  							
    	
    		default: break;
    	}
    	
    	UART0Write(pRec, 8);		/* 发送响应帧 */
    }
}

⌨️ 快捷键说明

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