📄 main.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 + -