S3C6410裸机程序相关系统函数
扫描二维码
随时随地手机看文章
裸机程序中可能用到的文件以及函数
//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 << EINT0_N);//清楚原来的设置 rEINT0CON1 |= Trigger << EINT0_N; } else //EINT0CON0 { rEINT0CON0 &= ~(7 << EINT0_N);//清楚原来的设置 rEINT0CON0 |= Trigger << EINT0_N; } } /************************************************************************************************************************* *函数 : 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 << CLK_DIV; else //失能 *P &= ~(1 << CLK_DIV); } /************************************************************************************************************************* *函数 : 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 << INT_N); } else //VIC0 VIC0->INTSELECT &= ~(1 << INT_N); } /************************************************************************************************************************* *函数 : 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 << INT_N); } else //VIC0 VIC0->INTSELECT |= (1 << INT_N); } /************************************************************************************************************************* *函数 : 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 << INT_N; //写1使能中断,写0无影响 else //取消中断 P->INTENCLEAR = 1 << INT_N; //写1清除中断使能,写0无影响 } /************************************************************************************************************************* *函数 : 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 << INT_N)) //该中断使能 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 << INT_N; //写1使能软件中断,写0无影响 else //取消中断 P->SOFTINTCLEAR = 1 << INT_N; //写1清除软件中断使能,写0无影响 } /************************************************************************************************************************* *函数 : 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 << s)))); } /************************************************************************************************************************* *函数 : 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" #includeu8 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 << 0) #define BIT1 (0x0001 << 1) #define BIT2 (0x0001 << 2) #define BIT3 (0x0001 << 3) #define BIT4 (0x0001 << 4) #define BIT5 (0x0001 << 5) #define BIT6 (0x0001 << 6) #define BIT7 (0x0001 << 7) #define BIT8 (0x0001 << 8) #define BIT9 (0x0001 << 9) #define BIT10 (0x0001 << 10) #define BIT11 (0x0001 << 11) #define BIT12 (0x0001 << 12) #define BIT13 (0x0001 << 13) #define BIT14 (0x0001 << 14) #define BIT15 (0x0001 << 15) #define BIT16 (0x00000001 << 16) #define BIT17 (0x00000001 << 17) #define BIT18 (0x00000001 << 18) #define BIT19 (0x00000001 << 19) #define BIT20 (0x00000001 << 20) #define BIT21 (0x00000001 << 21) #define BIT22 (0x00000001 << 22) #define BIT23 (0x00000001 << 23) #define BIT24 (0x00000001 << 24) #define BIT25 (0x00000001 << 25) #define BIT26 (0x00000001 << 26) #define BIT27 (0x00000001 << 27) #define BIT28 (0x00000001 << 28) #define BIT29 (0x00000001 << 29) #define BIT30 (0x00000001 << 30) #define BIT31 (0x00000001 << 31) //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(""format, __LINE__, ##__VA_ARGS__)) //DEBUG输出 #endif //printf输出定义 #if (PRINTF_EN_ == 2) //使能到液晶 #define lcd_printf(format,...) (printf(format, ##__VA_ARGS__)) //LCD打印 #define DEBUG(format,...) (printf(""format, __LINE__, ##__VA_ARGS__)) //DEBUG输出 #endif //printf输出定义 #if (PRINTF_EN_ == 3) //同时使能到液晶和串口 #define uart_printf(format,...) PrintfSet=0;printf(format, ##__VA_ARGS__) //串口打印 #define lcd_printf(format,...) PrintfSet=1;printf(format, ##__VA_ARGS__) //LCD打印 #define DEBUG(format,...) PrintfSet=0;printf(""format, __LINE__, ##__VA_ARGS__) //DEBUG输出 #endif #endif