📄 target.c
字号:
/****************************************Copyright (c)**************************************************
** Guangzhou ZHIYUAN electronics Co.,LTD.
**
** http://www.zyinside.com
**
**--------------File Info-------------------------------------------------------------------------------
** File Name: target.h
** Last modified Date: 2005-12-31
** Last Version: v1.0
** Description: 目标板特殊的代码,包括异常处理程序和目标板初始化程序
**
**------------------------------------------------------------------------------------------------------
** Created By: 黄绍斌
** Created date: 2006-8-10
** Version: v1.0
** Descriptions:
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Description:
**
********************************************************************************************************/
#define IN_TARGET
#include "config.h"
/*********************************************************************************************************
** "全局和静态变量在这里定义"
** global variables and static variables define here
********************************************************************************************************/
// IRQ中断向量地址表定义
uint32 VICVectAddr[32];
/*********************************************************************************************************
** Function name: IRQ_Exception
** Descriptions: 中断异常处理程序(实现向量中断处理),用户无需改动
** Input: 无
** Output: 无
** Created by: 黄绍斌
** Created Date: 2005-12-31
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void __irq IRQ_Exception(void)
{
void (*__Handler)(void);
uint32 irq_no;
uint32 bak;
// 找出当前中断号
bak = ICIP; // 读取IRQ Pending寄存器的值
for(irq_no=0; irq_no<32; irq_no++)
{
bak = bak>>1;
if(bak == 0) break;
}
// 取得中断服务程序地址并执行
__Handler = (void (*)(void)) VICVectAddr[irq_no];
__Handler();
}
/*********************************************************************************************************
** Function name: FIQ_Exception
** Descriptions: 快速中断异常处理程序,用户根据需要自己改变程序
** Input: 无
** Output: 无
** Created by: 黄绍斌
** Created Date: 2005-12-31
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void FIQ_Exception(void)
{
while(1); // 这一句替换为自己的代码
}
/*********************************************************************************************************
** Function name: TargetInit
** Descriptions: 目标板初始化代码,根据需要修改及调用。
** Input: 无
** Output: 无
** Created by: 黄绍斌
** Created Date: 2006-8-10
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void TargetInit(void)
{
/* 添加自己的代码 */
/* Add your codes here */
}
// SDRAM的地址(32位宽度)
#define SRAM_ADDR ((volatile unsigned int *) 0xA0000000)
/*********************************************************************************************************
** Function name: Init_Mem
** Descriptions: 初始化外部总线及SDRAM控制器
** Input: 无
** Output: 无
** Created by: 黄绍斌
** Created Date: 2006-8-10
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void Init_Mem(void)
{
uint32 bak;
// 配置总线I/O (必须先设置方向,再设置功能,否则由于GP80的MBREQ导致程序运行失败)
GPSR0 = GPSR0 | (1<<15);
GPSR1 = GPSR1 | (1<<(33-32));
GPSR2 = GPSR2 | (1<<(78-64)) | (1<<(80-64));
GPDR0 = (GPDR0 & (~(1<<18))) | (1<<15); // GP15为OUT功能,GP18为IN功能
GPDR1 = GPDR1 | (1<<(33-32)); // GP33为OUT功能
GPDR2 = GPDR2 | (1<<(78-64)) | (1<<(80-64)); // GP78,GP80为OUT功能
GAFR0_L = (GAFR0_L & 0x3FFFFFFF) | 0x80000000; // GP15为nCS1功能
GAFR0_U = (GAFR0_U & 0xFFFFFFCF) | 0x00000010; // GP18为RDY功能
GAFR1_L = (GAFR1_L & 0xFFFFFFF3) | 0x00000008; // GP33为nCS5功能
GAFR2_L = (GAFR2_L & 0xCFFFFFFF) | 0x20000000; // GP78为nCS2功能
GAFR2_U = (GAFR2_U & 0xFFFFFFFC) | 0x00000002; // GP80为nCS4功能
// 配置总线宽度及速度 (除Bank0外)
MSC0 = B0_CON | // Bank0的设置
B1_CON; // Bank1的设置
bak = MSC0; // 回读寄存器,保证已写入
MSC1 = B2_CON | // Bank2的设置
B3_CON; // Bank3的设置
bak = MSC1; // 回读寄存器,保证已写入
MSC2 = B4_CON | // Bank4的设置
B5_CON; // Bank5的设置
bak = MSC2; // 回读寄存器,保证已写入
#if EN_CLK520MHz != 0
// 配置SDRAM控制器 (参考值MDREFR=0x2009e01d)
// ALTREFA=0,ALTEFB=0,即使外部占用总线,还允许SDRAM刷新
// K0DB4=1,SDCLK0和SDCLK3的固定输出1/4 Fclk_mem(不由K0DB2控制)
// K2FREE=0, K1FREE=0, K0FREE=0,表示SDCLKn非自由运行(即由APD和KiRUN控制)
// SLFRSH=0,不发送自我刷新命令
// APD=0,禁止SDRAM自动掉电
// KnDB2为0时,SDCLKn以Fclk_mem时钟运行;为1时,SDCLKn以Fclk_mem/2的时钟运行。
// KnRUN为0时,禁止SDCLKn输出;为1时,允许SDCLKn输出。
// E1PIN=1,使能SDCKE1输出。
// DRI=24,每行刷新时间为8uS
// 先禁止SDCLK0-2输出,并设置DRI (未写出的位为0)
MDREFR = (0<<31) | // ALTREFA=0
(0<<30) | // ALTEFB=0
(1<<29) | // K0DB4=1
(0<<25) | // K2FREE=0
(0<<24) | // K1FREE=0
(0<<23) | // K0FREE=0
(1<<22) | // SLFRSH=1
(24<<0);
bak = MDREFR;
// 允许SDCLK1输出,输出时钟为Fclk_mem
bak = bak | (1<<13) | (1<<16); // K1DB2=0, K1RUN=1, K0RUN=1
MDREFR = bak;
bak = MDREFR;
// 清除SLFRSH位
bak = bak & (~(1<<22)); // SLFRSH=0
MDREFR = bak;
bak = MDREFR;
// 使能SDCKE1输出
bak = bak | (1<<15); // E1PIN=1
MDREFR = bak;
bak = MDREFR;
// MDCNFG设置
MDCNFG = (0<<31) | // MDENX=0,表示使用256MB的标准存储器映射(非1GB的映射)
(1<<27) | // 保留位,要求置1
(0<<17) | // DE3=0,禁止Bank3的SDRAM
(0<<16) | // DE2=0,禁止Bank2的SDRAM
(0<<15) | // STACK1=0
(0<<13) | // STACK0=0,即STACK[1:0]=00b,使用SDRAM地址为A24--A10
(0<<14) | // DCACX0=0,额外的列(Column)地址。请看DCAC0
(0<<12) | // DSA1110_0=0,Bank0、1块的SDRAM不使用SA1110地址多路方式(即使用MDCNFG的DAADR0的地址位)
(1<<11) | // 保留位,要求置1
(0<<10) | // DADDR0=0,使用标准地址寻址
(3<<8) | // DTC0=11b,SDRAM访问时间值设置(选用11组)
(1<<7) | // DNB0=1,SDRAM的内部分4个Bank
(2<<5) | // DRAC0=2,13行地址(row)
(1<<3) | // DCAC0=1,9位列地址(column)
(0<<2) | // DWID0=0,32位总线宽度SDRAM
(0<<1) | // DE1=0,禁止Bank1的SDRAM
(0<<0); // DE0=0,禁止Bank0的SDRAM
bak = MDCNFG;
// 软件延时,等待时钟稳定(200uS以上)
for(bak=0; bak<20000; bak++);
// 写操作测试,启动对应Bank的SDRAM刷新周期
for(bak=0; bak<8; bak++)
{
SRAM_ADDR[0] = 0x5555AAAA;
}
// MDCNFG设置
bak = (0<<31) | // MDENX=0,表示使用256MB的标准存储器映射(非1GB的映射)
(1<<27) | // 保留位,要求置1
(0<<17) | // DE3=0,禁止Bank3的SDRAM
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -