裸机程序中可能用到的文件以及函数
//system.c
/*************************************************************************************************************
* 文件名: system.c
* 功能: S3C6410相关系统函数
* 作者: cp1300@139.com
* 创建时间: 2012年3月4日11:25
* 最后修改时间:2012年3月4日
* 详细: 2012年3月5日17:00 添加VIC相关函数
*************************************************************************************************************/
#include "system.h"
/*************************************************************************************************************************
*函数 : void SetEINT_TriggerMode(u8 EINT0_N,u8 Trigger)
*功能 : 设置外部中断组0触发模式
*参数 : EINT0_N:中断源的编号(见:中断组0编号定义);Trigger:触发模式(EXT_LowLevel:低电平触发;EXT_HighLevel:高电平触发;
EXT_NegEdge:下降沿触发;EXT_PosEdge:上升沿触发;EXT_Edge:边沿触发)
*返回 : 无
*依赖 : 底层宏定义
*作者 : cp1300@139.com
*时间 : 20120304
*最后修改时间: 20120304
*说明 : 编号 GPN0--->GPN15 GPL8--->GPL14 GPM0--->GPM4,中断设置必须两个两个一起
*************************************************************************************************************************/
void SetEINT0_TriggerMode(vu8 EINT0_N,vu8 Trigger)
{
if(EINT0_N & 0x80) //EINT0CON1
{
EINT0_N -= 0x80;//减去标记
rEINT0CON1 &= ~(7 <
rEINT0CON1 |= Trigger <
}
else //EINT0CON0
{
rEINT0CON0 &= ~(7 <
rEINT0CON0 |= Trigger <
}
}
/*************************************************************************************************************************
*函数 : void Set_GateClk(u8 HCLK_DIV,FunctionalState Enable)
*功能 : CLK时钟门控设置(HCLK,PCLK,SCLK)
*参数 : CLK_DIV:外设(见:CLK门控时钟定义);Enable = ENABLE,1使能;=DISABLE,0失能
*返回 : 无
*依赖 : 底层宏定义
*作者 : cp1300@139.com
*时间 : 20120305
*最后修改时间: 20121005
*说明 : PCLK_GATE添加标识0x40,SCLK_GATE添加标示0x80;
*************************************************************************************************************************/
void Set_GateClk(vu8 CLK_DIV,FunctionalState Enable)
{
vu32 *P = &rHCLK_GATE;
if(CLK_DIV & 0x80) //SCLK
{
P = &rSCLK_GATE;
CLK_DIV -= 0x80; //去掉标示
}
else if(CLK_DIV & 0x40) //PCLK
{
P = &rPCLK_GATE;
CLK_DIV -= 0x40; //去掉标示
}
if(Enable == ENABLE) //使能
*P |= 1 <
else //失能
*P &= ~(1 <
}
/*************************************************************************************************************************
*函数 : void Set_INTtoIRQ(u8 INT_N)
*功能 : 设置一个中断为IRQ
*参数 : INT_N:中断编号(见:中断源编号定义);
*返回 : 无
*依赖 : 底层宏定义
*作者 : cp1300@139.com
*时间 : 20120305
*最后修改时间: 20120305
*说明 : 设置一个中断为普通中断模式
*************************************************************************************************************************/
void Set_INTtoIRQ(vu8 INT_N)
{
if(INT_N > 31) //VIC1
{
INT_N -= 32;
VIC1->INTSELECT &= ~(1 <
}
else //VIC0
VIC0->INTSELECT &= ~(1 <
}
/*************************************************************************************************************************
*函数 : void Set_INTtoFIQ(u8 INT_N)
*功能 : 设置一个中断为FIQ
*参数 : INT_N:中断编号(见:中断源编号定义);
*返回 : 无
*依赖 : 底层宏定义
*作者 : cp1300@139.com
*时间 : 20120305
*最后修改时间: 20120305
*说明 : 设置一个中断为快速中断模式
*************************************************************************************************************************/
void Set_INTtoFIQ(vu8 INT_N)
{
if(INT_N > 31) //VIC1
{
INT_N -= 32;
VIC1->INTSELECT |= (1 <
}
else //VIC0
VIC0->INTSELECT |= (1 <
}
/*************************************************************************************************************************
*函数 : void Set_IntEnable(u8 INT_N,FunctionalState EnInt)
*功能 : 开启或关闭一个VIC中断
*参数 : INT_N:中断编号(见:中断源编号定义),
* EnInt = ENABLE,1使能;=DISABLE,0失能;
*返回 : 无
*依赖 : 底层宏定义
*作者 : cp1300@139.com
*时间 : 20120305
*最后修改时间: 20120305
*说明 : 使能或失能VIC0,VIC1的一个中断
*************************************************************************************************************************/
void Set_IntEnable(vu8 INT_N,FunctionalState EnInt)
{
VICx_TypeDef *P = VIC0;
if(INT_N > 31) //VIC1
{
INT_N -= 32;
P = VIC1;
}
if(EnInt == ENABLE) //使能中断
P->INTENABLE = 1 <
else //取消中断
P->INTENCLEAR = 1 <
}
/*************************************************************************************************************************
*函数 : u8 Get_IntEnable(vu8 INT_N)
*功能 : 获取一个中断屏蔽状态
*参数 : 中断编号
*返回 : 1:该中断失能,0:该中断失能
*依赖 : 底层宏定义
*作者 : cp1300@139.com
*时间 : 20120524
*最后修改时间: 20120524
*说明 : 获取一个中断屏蔽状态
*************************************************************************************************************************/
u8 Get_IntEnable(vu8 INT_N)
{
VICx_TypeDef *P = VIC0;
if(INT_N > 31) //VIC1
{
INT_N -= 32;
P = VIC1;
}
if(P->INTENABLE & (1 <
return 1;
else
return 0;
}
/*************************************************************************************************************************
*函数 : void Set_SoftInt(u8 INT_N,u8 ENABLE)
*功能 : 开启或关闭一个软件中断
*参数 : INT_N:中断编号(见:中断源编号定义),ENABLE = Enable,1使能;=Disable,0失能;
*返回 : 无
*依赖 : 底层宏定义
*作者 : cp1300@139.com
*时间 : 20120305
*最后修改时间: 20120305
*说明 : 使能或失能VIC0,VIC1的一个软件中断
*************************************************************************************************************************/
void Set_SoftInt(vu8 INT_N,vu8 ENABLE)
{
VICx_TypeDef *P = VIC0;
if(INT_N > 31) //VIC1
{
INT_N -= 32;
P = VIC1;
}
if(ENABLE) //使能中断
P->SOFTINT = 1 <
else //取消中断
P->SOFTINTCLEAR = 1 <
}
/*************************************************************************************************************************
*函数 : void Set_IsrAddr(u8 INT_N,vu32 IsrAdd)
*功能 : 设置中断矢量入口
*参数 : INT_N:中断编号(见:中断源编号定义),IsrAdd:中断服务程序指针;
*返回 : 无
*依赖 : 底层宏定义
*作者 : cp1300@139.com
*时间 : 20120305
*最后修改时间: 20120311
*说明 : 设置矢量地址寄存器
*************************************************************************************************************************/
void Set_IsrAddr(vu8 INT_N,vu32 IsrAdd)
{
VICx_TypeDef *P = VIC0;
if(INT_N > 31) //VIC1
{
INT_N -= 32;
P = VIC1;
}
P->VECTADDR[INT_N] = IsrAdd;//将中断服务程序入口地址写入矢量地址寄存器
}
/*************************************************************************************************************************
*函数 : void Set_VectorPriority(u8 INT_N,u8 Priority)
*功能 : 设置矢量优先级
*参数 : INT_N:中断编号(见:中断源编号定义),Priority:优先级0-15;
*返回 : 无
*依赖 : 底层宏定义
*作者 : cp1300@139.com
*时间 : 20120305
*最后修改时间: 20120305
*说明 : 优先级为0-15,值越大优先级越高,15最高,0最低;
*************************************************************************************************************************/
void Set_VectorPriority(vu8 INT_N,vu8 Priority)
{
VICx_TypeDef *P = VIC0;
if(INT_N > 31) //VIC1
{
INT_N -= 32;
P = VIC1;
}
P->VECTRPRIORITY[INT_N] = Priority;//将中断优先级写入寄存器
}
/*************************************************************************************************************************
*函数 : u32 Get_PLLCLK(int pllreg)
*功能 : 获取PLL时钟频率
*参数 : pllreg : PLL选择
APLL 0 //ARM内核时钟PLL
MPLL 1 //主时钟PLL
EPLL 2 //外设时钟PLL
*返回 : 频率,HZ
*依赖 : 底层宏定义
*作者 : cp1300@139.com
*时间 : 20120526
*最后修改时间: 20120526
*说明 : 无
*************************************************************************************************************************/
u32 Get_PLLCLK(u8 pllreg)
{
u32 r = 0, m, p, s;
if (pllreg == APLL)
r = rAPLL_CON;
else if (pllreg == MPLL)
r = rMPLL_CON;
else if (pllreg == EPLL)
r = rEPLL_CON0;
m = (r>>16) & 0x3ff;
p = (r>>8) & 0x3f;
s = r & 0x7;
return (m * (SYSTEM_MAIN_CLK_IN / (p * (1 <
}
/*************************************************************************************************************************
*函数 : u32 Get_FCLK(void)
*功能 : 获取FCLK时钟频率
*参数 : 无
*返回 : 频率,HZ
*依赖 : 底层宏定义
*作者 : cp1300@139.com
*时间 : 20120526
*最后修改时间: 20120526
*说明 : 无
*************************************************************************************************************************/
u32 Get_FCLK(void)
{
return (Get_PLLCLK(APLL));
}
/*************************************************************************************************************************
*函数 : u32 Get_PCLK(void)
*功能 : 获取PCLK时钟频率
*参数 : 无
*返回 : 频率,HZ
*依赖 : 底层宏定义
*作者 : cp1300@139.com
*时间 : 20120526
*最后修改时间: 20120526
*说明 : 无
*************************************************************************************************************************/
u32 Get_PCLK(void)
{
u32 fclk;
u32 hclkx2_div = ((rCLK_DIV0 >> 9) & 0x7) + 1;
u32 pre_div = ((rCLK_DIV0 >> 12) & 0xf) + 1;
if(rOTHERS & 0x80)
fclk = Get_FCLK(); // SYNC Mode
else
fclk = Get_PLLCLK(MPLL); // ASYNC Mode
return fclk/(hclkx2_div * pre_div);
}
//////////////////////////////////////////////////////////////////
//???????′???,???printf????,
//PRINTF_EN == 1,?????printf??????
#if (PRINTF_EN_ == 1)
#include "uart.h"
int fputc(int ch,FILE *f)
{
UART0_SendByte((u8)ch);
return ch;
}
#endif
//PRINTF_EN == 2,?????printf?????
#if (PRINTF_EN_== 2)
#include "tft_lcd.h"
int fputc(int ch, FILE *f)
{
static u16 X;
static u16 X1;
static u16 Y;
static u8 flag;
if(flag == 0)
{
if(Y > LCD_YSIZE-1-16)
{
Y = 0;
X = X1 = LCD_XSIZE/2;
flag = 1;
LCD_Fill(X1,LCD_XSIZE-1,0,LCD_YSIZE-1,0xffff); //????????
}
}
else
{
if(Y > LCD_YSIZE-1-16)
{
Y = 0;
X = X1 = 0;
flag = 0;
LCD_Fill(0,LCD_XSIZE/2-1,0,LCD_YSIZE-1,0xffff); //????????
}
}
if((u8)ch == '\n')
{
X = X1;
Y += 12;
}
else if((u8)ch > 0x80) //????
{
return ch;
}
else
{
LCD_Char(X,Y,(u8 *)&ch,0x0000,0xffff,0x80);
if(flag == 0)
{
if(X > LCD_XSIZE/2-1-8)
{
X = X1;
Y += 12;
}
else
X += 8;
}
else
{
if(X > LCD_XSIZE-1-8)
{
X = X1;
Y += 12;
}
else
X += 8;
}
}
return ch;
}
#endif
//PRINTF_EN == 3,???????printf??????????
#if (PRINTF_EN_ == 3)
#include "tft_lcd.h"
#include "uart.h"
#include
u8 PrintfSet = 0; //0:????printf??????;1:????printf?????
int fputc(int ch, FILE *f)
{
static u16 X;
static u16 X1;
static u16 Y;
static u8 flag;
if(PrintfSet)
{
if(flag == 0)
{
if(Y > LCD_YSIZE-1-16)
{
Y = 0;
X = X1 = LCD_XSIZE/2;
flag = 1;
LCD_Fill(X1,LCD_XSIZE-1,0,LCD_YSIZE-1,0xffff); //????????
}
}
else
{
if(Y > LCD_YSIZE-1-16)
{
Y = 0;
X = X1 = 0;
flag = 0;
LCD_Fill(0,LCD_XSIZE/2-1,0,LCD_YSIZE-1,0xffff); //????????
}
}
if((u8)ch == '\n')
{
X = X1;
Y += 12;
}
else if((u8)ch > 0x80) //????
{
return ch;
}
else
{
LCD_Char(X,Y,(u8 *)&ch,0x0000,0xffff,0x80);
if(flag == 0)
{
if(X > LCD_XSIZE/2-1-8)
{
X = X1;
Y += 12;
}
else
X += 8;
}
else
{
if(X > LCD_XSIZE-1-8)
{
X = X1;
Y += 12;
}
else
X += 8;
}
}
}
else
UART0_SendByte((u8)ch);
return ch;
}
#endif
//system.h
/*************************************************************************************************************
* 文件名: system.h
* 功能: S3C6410相关系统函数
* 作者: cp1300@139.com
* 创建时间: 2012年3月4日11:25
* 最后修改时间:2012年3月4日
* 详细: 相关系统操作宏定义
*************************************************************************************************************/
#ifndef _SYSTEM_H_
#define _SYSTEM_H_
#include "sys_types.h"
#include "stdio.h"
#include "s3c6410_map.h"
#define Debug printf //调试支持
#define nop __nop() //空指令延时一个系统时钟周期
//相关外部函数申明
void SetEINT0_TriggerMode(vu8 EINT0_N,vu8 Trigger);//设置外部中断组0触发模式
void Set_GateClk(vu8 CLK_DIV,FunctionalState Enable); //CLK时钟门控设置(HCLK,PCLK,SCLK)
void Set_INTtoIRQ(vu8 INT_N); //设置一个中断为IRQ
void Set_INTtoFIQ(vu8 INT_N); //设置一个中断为FIQ
void Set_IntEnable(vu8 INT_N,FunctionalState EnInt); //开启或关闭一个VIC中断
void Set_SoftInt(vu8 INT_N,vu8 ENABLE); //开启或关闭一个软件中断
void Set_IsrAddr(vu8 INT_N,vu32 IsrAdd); //设置中断矢量入口
void Set_VectorPriority(vu8 INT_N,vu8 Priority); //设置矢量优先级
u8 Get_IntEnable(vu8 INT_N); //获取一个中断屏蔽状态
u32 Get_PCLK(void); //获取PCLK时钟频率
u32 Get_FCLK(void); //获取FCLK时钟频率
u32 Get_PLLCLK(u8 pllreg); //获取PLL时钟频率
//相关外部全局变量声明
extern u8 PrintfSet; //0:定义printf到串口;1:定义printf到液晶
//IO模式宏定义
#define IO_IN_PUT 0 //输入模式
#define IO_OUT_PUT 1 //输出模式
#define IO_SF_MODE 2 //特殊模式,复用功能
#define IO_EXT_INT 7 //外部中断输入模式
#define IO_NO_UP 0 //禁止上拉,下拉
#define IO_DROP_DOWM 1 //下拉
#define IO_PULL_UP 2 //上拉
//外部中断触发模式定义
#define EXT_LowLevel 0 //低电平触发
#define EXT_HighLevel 1 //高电平触发
#define EXT_NegEdge 2 //下降沿触发
#define EXT_PosEdge 4 //上升沿触发
#define EXT_Edge 6 //边沿触发
//使能printf输出
//0:关闭printf输出;1:使能printf到串口;2:使能printf到液晶;3:同时使能printf到串口和液晶
#define PRINTF_EN_ 3
//中断组0编号定义
// 外部中断组0的IO 偏移+标示 中断组0中的编号
#define EINT0_GPN0 0 //0
#define EINT0_GPN1 0 //1
#define EINT0_GPN2 4 //2
#define EINT0_GPN3 4 //3
#define EINT0_GPN4 8 //4
#define EINT0_GPN5 8 //5
#define EINT0_GPN6 12 //6
#define EINT0_GPN7 12 //7
#define EINT0_GPN8 16 //8
#define EINT0_GPN9 16 //9
#define EINT0_GPN10 20 //10
#define EINT0_GPN11 20 //11
#define EINT0_GPN12 24 //12
#define EINT0_GPN13 24 //13
#define EINT0_GPN14 28 //14
#define EINT0_GPN15 28 //15
#define EINT0_GPL8 (0x80 + 0) //16
#define EINT0_GPL9 (0x80 + 0) //17
#define EINT0_GPL10 (0x80 + 4) //18
#define EINT0_GPL11 (0x80 + 4) //19
#define EINT0_GPL12 (0x80 + 8) //20
#define EINT0_GPL13 (0x80 + 8) //21
#define EINT0_GPL14 (0x80 + 12) //22
#define EINT0_GPM0 (0x80 + 12) //23
#define EINT0_GPM1 (0x80 + 16) //24
#define EINT0_GPM2 (0x80 + 16) //25
#define EINT0_GPM3 (0x80 + 20) //26
#define EINT0_GPM4 (0x80 + 20) //27
//外部中断分组定义
// 组名 //组号 //范围
#define EINT_Group0 0 //GPN0--->GPN15 GPL8--->GPL14 GPM0--->GPM4
#define EINT_Group01 1 //GPA0--->GPA7 GPB0--->GPB6
#define EINT_Group02 1 //GPC0--->GPC7
#define EINT_Group03 2 //GPD0--->GPD5
#define EINT_Group04 2 //GPF0--->GPF14
#define EINT_Group05 3 //GPG0--->GPG7
#define EINT_Group06 3 //GPH0--->GPH9
#define EINT_Group07 4 //GPO0--->GPO15
#define EINT_Group08 4 //GPP0--->GPP14
#define EINT_Group09 5 //GPQ0--->GPQ9
//HCLK门控时钟定义
/*HCLK_GATE控制所有Ips的HCLK,如果区域为‘1’,则HCLK被提供,否则,HCLK被屏蔽。当S3C6410
转换成掉电模式时,系统控制器检查一些模块(IROM,MEM0,MEM1和MFC模块)的状态。因此,位25,22,
21,0必须为‘1’,以符合掉电的要求。
HCLK_GATE 位 描述 初始状态*/
#define HCLK_UHOST 29 //为UHOST 选通HCLK(0:屏蔽,1:通过)。 1
#define HCLK_SECUR 28 //为安全子系统选通HCLK(0:屏蔽,1:通过)。 1
#define HCLK_SDMA1 27 //为SDMA1 选通HCLK(0:屏蔽,1:通过)。 1
#define HCLK_SDMA0 26 //为SDMA0 选通HCLK(0:屏蔽,1:通过)。 1
#define HCLK_IROM 25 //为IROM 选通HCLK(0:屏蔽,1:通过)。 1
#define HCLK_DDR1 24 //为DDR1 选通HCLK(0:屏蔽,1:通过)。 1
#define HCLK_DDR0 23 //为DDR0 选通HCLK(0:屏蔽,1:通过)。 1
#define HCLK_MEM1 22 //为DMC1 选通HCLK(0:屏蔽,1:通过)。 1
#define HCLK_MEM0 21 //为DMC0,SROM,OneNAND,NFCON 和CFCON 选通HCLK(0:屏蔽,1:通过)。 1
#define HCLK_USB 20 //为USB OTG 选通HCLK(0:屏蔽,1:通过)。 1
#define HCLK_HSMMC2 19 //为HSMMC2 选通HCLK(0:屏蔽,1:通过)。 1
#define HCLK_HSMMC1 18 //为HSMMC1 选通HCLK(0:屏蔽,1:通过)。 1
#define HCLK_HSMMC0 17 //为HSMMC0 选通HCLK(0:屏蔽,1:通过)。 1
#define HCLK_MDP 16 //为MDP 选通HCLK(0:屏蔽,1:通过)。 1
#define HCLK_DHOST 15 //为直接HOST 接口选通HCLK(0:屏蔽,1:通过)。 1
#define HCLK_IHOST 14 //为间接HOST 接口选通HCLK(0:屏蔽,1:通过)。 1
#define HCLK_DMA1 13 //为DMA1 选通HCLK(0:屏蔽,1:通过)。 1
#define HCLK_DMA0 12 //为DMA0 选通HCLK(0:屏蔽,1:通过)。 1
#define HCLK_JPEG 11 //为JPEG 选通HCLK(0:屏蔽,1:通过)。 1
#define HCLK_CAMIF 10 //为相机接口选通HCLK(0:屏蔽,1:通过)。 1
#define HCLK_SCALER 9 //为定标器选通HCLK(0:屏蔽,1:通过)。 1
#define HCLK_2D 8 //为2D 选通HCLK(0:屏蔽,1:通过)。 1
#define HCLK_TV 7 //为TV 译码器选通HCLK(0:屏蔽,1:通过)。 1
#define HCLK_POST0 5 //为POST0 选通HCLK(0:屏蔽,1:通过)。 1
#define HCLK_ROT 4 //为旋转器选通HCLK(0:屏蔽,1:通过)。 1
#define HCLK_LCD 3 //为LCD 控制器选通HCLK(0:屏蔽,1:通过)。 1
#define HCLK_TZIC 2 //为中断控制器选通HCLK(0:屏蔽,1:通过)。 1
#define HCLK_INTC 1 //为向量中断控制器选通HCLK(0:屏蔽,1:通过)。 1
#define HCLK_MFC 0 //为MFC 选通HCLK(0:屏蔽,1:通过)。 1
//PCLK门控时钟定义
// PCLK_GATE 位 描述 初始状态
#define PCLK_SKEY (0x40 | 24) // 为安全键选通PCLK(0:屏蔽,1:通过)。 1
#define PCLK_CHIPID (0x40 | 23) // 为片上ID 选通PCLK(0:屏蔽,1:通过)。 1
#define PCLK_SPI1 (0x40 | 22) // 为SPI1 选通PCLK(0:屏蔽,1:通过)。 1
#define PCLK_SPI0 (0x40 | 21) // 为SPI0 选通PCLK(0:屏蔽,1:通过)。 1
#define PCLK_HSIRX (0x40 | 20) // 为HSI 接收器选通PCLK(0:屏蔽,1:通过)。 1
#define PCLK_HSITX (0x40 | 19) // 为HIS 发送器选通PCLK(0:屏蔽,1:通过)。 1
#define PCLK_GPIO (0x40 | 18) // 为GPIO 选通PCLK(0:屏蔽,1:通过)。 1
#define PCLK_IIC (0x40 | 17) // 为IIC 选通PCLK(0:屏蔽,1:通过)。 1
#define PCLK_IIS1 (0x40 | 16) // 为IIS1 选通PCLK(0:屏蔽,1:通过)。 1
#define PCLK_IIS0 (0x40 | 15) // 为IIS0 选通PCLK(0:屏蔽,1:通过)。 1
#define PCLK_AC97 (0x40 | 14) // 为AC97 选通PCLK(0:屏蔽,1:通过)。 1
#define PCLK_TZPC (0x40 | 13) // 为TZPC 选通PCLK(0:屏蔽,1:通过)。 1
#define PCLK_TSADC (0x40 | 12) // 为触摸屏ADC 选通PCLK(0:屏蔽,1:通过。 1
#define PCLK_KEYPAD (0x40 | 11) // 为Key PAD 选通PCLK(0:屏蔽,1:通过)。 1
#define PCLK_IRDA (0x40 | 10) // 为IRDA 选通PCLK(0:屏蔽,1:通过)。 1
#define PCLK_PCM1 (0x40 | 9) // 为PCM1 选通PCLK(0:屏蔽,1:通过)。 1
#define PCLK_PCM0 (0x40 | 8) // 为PCM0 选通PCLK(0:屏蔽,1:通过)。 1
#define PCLK_PWM (0x40 | 7) // 为PWM 选通PCLK(0:屏蔽,1:通过)。 1
#define PCLK_RTC (0x40 | 6) // 为RTC 选通PCLK(0:屏蔽,1:通过)。 1
#define PCLK_WDT (0x40 | 5) // 为看门狗定时器选通PCLK(0:屏蔽,1:通过)。 1
#define PCLK_UART3 (0x40 | 4) // 为UART3 选通PCLK(0:屏蔽,1:通过)。 1
#define PCLK_UART2 (0x40 | 3) // 为UART2 选通PCLK(0:屏蔽,1:通过)。 1
#define PCLK_UART1 (0x40 | 2) // 为UART1 选通PCLK(0:屏蔽,1:通过)。 1
#define PCLK_UART0 (0x40 | 1) // 为UART0 选通PCLK(0:屏蔽,1:通过)。 1
#define PCLK_MFC (0x40 | 0) // 为MFC 选通PCLK(0:屏蔽,1:通过)。 1
//PCLK门控时钟定义
//PCLK_GATE 位 描述 初始状态
#define SCLK_UHOST (0x80 | 30) // 为USB-HOST 选通特殊时钟 (0:屏蔽,1:通过)。 1
#define SCLK_MMC2_48 (0x80 | 29) // 为MMC2 选通特殊时钟 (0:屏蔽,1:通过)。 1
#define SCLK_MMC1_48 (0x80 | 28) // 为MMC1 选通特殊时钟 (0:屏蔽,1:通过)。 1
#define SCLK_MMC0_48 (0x80 | 27) // 为MMC0 选通特殊时钟 (0:屏蔽,1:通过)。 1
#define SCLK_MMC2 (0x80 | 26) // 为MMC2 选通特殊时钟 (0:屏蔽,1:通过)。 1
#define SCLK_MMC1 (0x80 | 25) // 为MMC1 选通特殊时钟 (0:屏蔽,1:通过)。 1
#define SCLK_MMC0 (0x80 | 24) // 为MMC0 选通特殊时钟 (0:屏蔽,1:通过)。 1
#define SCLK_SPI1_48 (0x80 | 23) // 为SPI 选通特殊时钟 (0:屏蔽,1:通过)。 1
#define SCLK_SPI0_48 (0x80 | 22) // 为SPI 选通特殊时钟 (0:屏蔽,1:通过)。 1
#define SCLK_SPI1 (0x80 | 21) // 为SPI 选通特殊时钟 (0:屏蔽,1:通过)。 1
#define SCLK_SPI0 (0x80 | 20) // 为SPI 选通特殊时钟 (0:屏蔽,1:通过)。 1
#define SCLK_DAC27 (0x80 | 19) // 为DAC 选通特殊时钟 (0:屏蔽,1:通过)。 1
#define SCLK_TV27 (0x80 | 18) // 为TV 译码器选通特殊时钟 (0:屏蔽,1:通过)。 1
#define SCLK_SCALER27 (0x80 | 17) // 为scaler27 选通特殊时钟 (0:屏蔽,1:通过)。 1
#define SCLK_SCALER (0x80 | 16) // 为定标器选通特殊时钟 (0:屏蔽,1:通过)。 1
#define SCLK_LCD27 (0x80 | 15) // 为LCD 控制器选通特殊时钟 (0:屏蔽,1:通过)。 1
#define SCLK_LCD (0x80 | 14) // 为LCD 控制器选通特殊时钟 (0:屏蔽,1:通过)。 1
#define SCLK_POST0_27 (0x80 | 12) // 为POST0 选通特殊时钟 (0:屏蔽,1:通过)。 1
#define SCLK_POST0 (0x80 | 10) // 为POST0 选通特殊时钟 (0:屏蔽,1:通过)。 1
#define SCLK_AUDIO1 (0x80 | 9) // 为PCM1,IIS1 和AC97 1 选通特殊时钟 (0:屏蔽,1:通过)。1
#define SCLK_AUDIO0 (0x80 | 8) // 为PCM0,IIS0 和AC97 0 选通特殊时钟 (0:屏蔽,1:通过)。1
#define SCLK_SECUR (0x80 | 7) // 为安全模块选通特殊时钟 (0:屏蔽,1:通过)。 1
#define SCLK_IRDA (0x80 | 6) // 为IRDA 选通特殊时钟 (0:屏蔽,1:通过)。 1
#define SCLK_UART (0x80 | 5) // 为UART0~3 选通特殊时钟 (0:屏蔽,1:通过)。 1
#define SCLK_OneNAND (0x80 | 4) // 为OneNAND 选通特殊时钟 (0:屏蔽,1:通过)。 1
#define SCLK_MFC (0x80 | 3) // 为MFC 选通特殊时钟 (0:屏蔽,1:通过)。 1
#define SCLK_CAM (0x80 | 2) // 为相机接口选通特殊时钟 (0:屏蔽,1:通过)。 1
#define SCLK_JPEG (0x80 | 1) // 为JPEG 选通特殊时钟 (0:屏蔽,1:通过)。 1
//中断源编号定义
/* S3C6410X 支持64 位中断源,不支持ARM1176HZF-S 镜像中断运行.
中断源 中断号 描述 组*/
#define INT_ADC 63 //ADC EOC 中断 VIC1
#define INT_PENDNUP 62 //ADC 笔向下/向上中断 中断 VIC1
#define INT_SEC 61 //安全中断 VIC1
#define INT_RTC_ALARM 60 //RTC 警告中断 VIC1
#define INT_IrDA 59 //IrDA 中断 VIC1
#define INT_OTG 58 //USB OTG 中断 VIC1
#define INT_HSMMC1 57 //HSMMC1 中断 VIC1
#define INT_HSMMC0 56 //HSMMC0 中断 VIC1
#define INT_HOSTIF 55 //主机接口中断 VIC1
#define INT_MSM 54 //MSM 调制解调器 I/F 中断 VIC1
#define INT_EINT4 53 //外部中断组1~组9 VIC1
#define INT_HSIrx 52 //HS Rx 中断 VIC1
#define INT_HSItx 51 //HS Tx 中断 VIC1
#define INT_I2C0 50 //I2C 0 中断 VIC1
#define INT_SPI_INT_HSMMC2 49 //SPI 中断或HSMMC2 中断 VIC1
#define INT_SPI0 48 //SPI0 中断 VIC1
#define INT_UHOST 47 //USB 主机中断 VIC1
#define INT_CFC 46 //CFCON 中断 VIC1
#define INT_NFC 45 //NFCON 中断 VIC1
#define INT_ONENAND1 44 //板块1 的ONENANE 中断 VIC1
#define INT_ONENAND0 43 //板块0 的ONENAND 中断 VIC1
#define INT_DMA1 42 //DMA1 中断 VIC1
#define INT_DMA0 41 //DMA0 中断 VIC1
#define INT_UART3 40 //UART3 中断 VIC1
#define INT_UART2 39 //UART2 中断 VIC1
#define INT_UART1 38 //UART1 中断 VIC1
#define INT_UART0 37 //UART0 中断 VIC1
#define INT_AC97 36 //AC 中断 VIC1
#define INT_PCM1 35 //PCM1 中断 VIC1
#define INT_PCM0 34 //PCM0 中断 VIC1
#define INT_EINT3 33 //外部中断20~27 VIC1
#define INT_EINT2 32 //外部中断12~19 VIC1
#define INT_LCD_2 31 //LCD 中断.系统I/F 完成 VIC0
#define INT_LCD_1 30 //LCD 中断.VSYNC 中断 VIC0
#define INT_LCD_0 29 //LCD 中断.FIFO 不足 VIC0
#define INT_TIMER4 28 //定时器4 中断. VIC0
#define INT_TIMER3 27 //定时器3 中断. VIC0
#define INT_WDT 26 //看门狗定时器中断. VIC0
#define INT_TIMER2 25 //定时器2 中断. VIC0
#define INT_TIMER1 24 //定时器1 中断. VIC0
#define INT_TIMER0 23 //定时器0 中断. VIC0
#define INT_KEYPAD 22 //键盘中断. VIC0
#define INT_ARM_DMAS 21 //ARM DMAS 中断. VIC0
#define INT_ARM_DMA 20 //ARM DMA 中断. VIC0
#define INT_ARM_DMAERR 19 //ARM DMA 错误中断. VIC0
#define INT_SDMA1 18 //安全 DMA1 中断. VIC0
#define INT_SDMA0 17 //安全 DMA0 中断. VIC0
#define INT_MFC 16 //MFC 中断. VIC0
#define INT_JPEG 15 //JPEG 中断. VIC0
#define INT_BATF 14 //电池故障中断. VIC0
#define INT_SCALER 13 //TV 转换器中断. VIC0
#define INT_TVENC 12 //TV 编码器中断. VIC0
#define INT_2D 11 //2D 中断. VIC0
#define INT_ROTATOR 10 //旋转器中断. VIC0
#define INT_POSTO 9 //后处理器中断. VIC0
#define INT_3D 8 //3D 图像控制器中断. VIC0
//#define Reserved 7 //保留 VIC0
#define INT_I2S 6 //I2S0/I2S1/INT_I2SV40/I2SV40中断 VIC0
#define INT_I2C1 5 //I2C1 中断 VIC0
#define INT_CAMIF_P 4 //照相机接口中断 VIC0
#define INT_CAMIF_C 3 //照相机接口中断 VIC0
#define INT_RTC_TIC 2 //RTC TIC 中断 VIC0
#define INT_EINT1 1 //外部中断4~11 VIC0
#define INT_EINT0 0 //外部中断0~3 VIC0
/*************************************************************************************************/
/* 对应位声明,方便位操作 */
#define BIT0 (0x0001 <
#define BIT1 (0x0001 <
#define BIT2 (0x0001 <
#define BIT3 (0x0001 <
#define BIT4 (0x0001 <
#define BIT5 (0x0001 <
#define BIT6 (0x0001 <
#define BIT7 (0x0001 <
#define BIT8 (0x0001 <
#define BIT9 (0x0001 <
#define BIT10 (0x0001 <
#define BIT11 (0x0001 <
#define BIT12 (0x0001 <
#define BIT13 (0x0001 <
#define BIT14 (0x0001 <
#define BIT15 (0x0001 <
#define BIT16 (0x00000001 <
#define BIT17 (0x00000001 <
#define BIT18 (0x00000001 <
#define BIT19 (0x00000001 <
#define BIT20 (0x00000001 <
#define BIT21 (0x00000001 <
#define BIT22 (0x00000001 <
#define BIT23 (0x00000001 <
#define BIT24 (0x00000001 <
#define BIT25 (0x00000001 <
#define BIT26 (0x00000001 <
#define BIT27 (0x00000001 <
#define BIT28 (0x00000001 <
#define BIT29 (0x00000001 <
#define BIT30 (0x00000001 <
#define BIT31 (0x00000001 <
//PLL选择
#define APLL 0 //ARM内核时钟PLL
#define MPLL 1 //主时钟PLL
#define EPLL 2 //外设时钟PLL
//主时钟输入
#define SYSTEM_MAIN_CLK_IN 12000000 //12MHZ
/*************************************************************************************************************************
*函数 : __inline void VICInterruptEnd(void)
*功能 : 在中断快要结束时清除中断
*参数 : 无
*返回 : 无
*依赖 : 底层宏定义
*作者 : 陈鹏
*时间 : 20120305
*最后修改时间: 20120305
*说明 : 写入任何数据清除中断,只有在中断服务程序中才可读,结束时才写
两个要一起清除,否则可能导致无法再次进入中断,无意间发现的
*************************************************************************************************************************/
__inline void VICInterruptEnd(void)
{
VIC0->ADDRESS = 0xffffffff; //写入任何值都可以清除当前中断
VIC1->ADDRESS = 0xffffffff; //写入任何值都可以清除当前中断
}
//通道选择
#define ch0 0
#define ch1 1
#define ch2 2
//printf输出定义
#if (PRINTF_EN_ == 1) //使能到串口
#define uart_printf(format,...) (printf(format, ##__VA_ARGS__)) //串口打印
#define DEBUG(format,...) (printf("
#endif
//printf输出定义
#if (PRINTF_EN_ == 2) //使能到液晶
#define lcd_printf(format,...) (printf(format, ##__VA_ARGS__)) //LCD打印
#define DEBUG(format,...) (printf("
#endif
//printf输出定义
#if (PRINTF_EN_ == 3) //同时使能到液晶和串口
#define uart_printf(format,...) PrintfSet=0;printf(format, ##__VA_ARGS_
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』