📄 startup_c.c
字号:
/*
* COPYRIGHT (c) Notifier 1993-2004, All Rights Reserved
*
* 描述: LPC2xxx的启动模块,C代码
*
* 版本历史:
*
* 版本 作者 日期 修改内容
* 1.0 王璀 2005-11-05 创建
* 1.1 王璀 2006-01-17 标准化
* 添加了UndefinedInstHandler,PrefetchAbortHandler
* DataAbortHandler,FiqHandler函数
* 在ResetInitC中根据Reset的地址来区别启动程序和应用程序
* 1.2 王璀 2006-01-19 根据Reset地址,添加了外部总线寄存器的初始化
* 根据Reset地址,修改了MEMMAP寄存器的初始化
* 1.3 王璀 2006-01-22 删除了BCFG2和BCFG3的初始化。由应用程序的HardwareInit
* 进行
* 1.4 任学锋 2006-03-07 看门狗有效时,立即触发,复位
* 1.41 王璀 2006-03-15 代码格式修改
* 1.42 吴晓鑫 2006-05-12 BCFG1(外部RAM总线)的WST1设定由 0 -> 1,解决程序在RAM中
* 运行时发生的DataAbort或PrefetchAbort异常
* 1.42 王璀 2006-06-27 判断MEM_EFLASH_BASE的值,然后相应初始化BCFG0/BCFG1
*/
//==============================================================================
// 包含的头文件
//==============================================================================
#include "stdio.h"
#include "ucos_ii.h"
#include "bsp_cfg.h"
#include "library\lib_shell.h"
#include "library\lib_timer.h"
#include "library\lib_bits_operation.h"
#include "driver\drv_int_mgr_lpc2xxx.h"
#include "bsp\bsp_watchdog.h"
//==============================================================================
// 外部函数声明
//==============================================================================
extern void Reset(void);
//==============================================================================
// 函数定义
//==============================================================================
//------------------------------------------------------------------------------
// 函数描述:未定义指令异常处理函数
void UndefinedInstHandler(void)
{
printf("UndefinedInstHandler""\r\n");
#if BSP_WATCHDOG_EN > 0
BspWatchdogTriggerReset();
#endif
while (1);
}
//------------------------------------------------------------------------------
// 函数描述:取指令中止异常处理函数
void PrefetchAbortHandler(void)
{
printf("PrefetchAbortHandler""\r\n");
#if BSP_WATCHDOG_EN > 0
BspWatchdogTriggerReset();
#endif
while (1);
}
//------------------------------------------------------------------------------
// 函数描述:取数据中止异常处理函数
void DataAbortHandler(void)
{
printf("DataAbortHandler""\r\n");
#if BSP_WATCHDOG_EN > 0
BspWatchdogTriggerReset();
#endif
while (1);
}
//------------------------------------------------------------------------------
// 函数描述:快速中断异常处理函数
void FiqHandler(void)
{
printf("FiqHandler""\r\n");
#if BSP_WATCHDOG_EN > 0
BspWatchdogTriggerReset();
#endif
while (1);
}
//------------------------------------------------------------------------------
// 函数描述:初始化目标板
void ResetInitC(void)
{
INT32U resetEntryAddr = (INT32U)Reset;
if (resetEntryAddr == 0x80000000)
{
PINSEL2 = 0x0f814914;
#if MEM_EFLASH_BASE == 0x80000000
BCFG0 = 0x10001442;
// BCFG1 = 0x10000400; // WST1 ( 0 -> 1 ) eli 06.05.12
BCFG1 = 0x10000420;
// 有取指操作,假设该外部RAM的总线读操作的时间(WST1)设定过短(IS61LV5126-10T芯片
// 写操作和读操作的周期都为10ns),那么有可能读到的指令是错误的,
// 此后程序就会跑飞(通常是DataAbort或PrefetchAbort)
// 注:以上分析个人想法,不一定正确 - eli
#else
BCFG0 = 0x10001442;
BCFG1 = 0x10001442;
#endif
}
if ( (resetEntryAddr == 0x00000000)
|| (resetEntryAddr == 0x80000000) )
{
if (resetEntryAddr == 0x00000000)
{
WRITE_BITS(MEMMAP, MEMMAP_MAP_MASK, MEMMAP_MAP_IFLASH);
}
else if (resetEntryAddr == 0x80000000)
{
WRITE_BITS(MEMMAP, MEMMAP_MAP_MASK, MEMMAP_MAP_EFLASH);
}
// 设置系统各部分时钟
// Set system timers for each component
PLLCON = 1;
#if (Fpclk / (Fcclk / 4)) == 1
VPBDIV = 0;
#endif
#if (Fpclk / (Fcclk / 4)) == 2
VPBDIV = 2;
#endif
#if (Fpclk / (Fcclk / 4)) == 4
VPBDIV = 1;
#endif
#if (Fcco / Fcclk) == 2
PLLCFG = ((Fcclk / Fosc) - 1) | (0 << 5);
#endif
#if (Fcco / Fcclk) == 4
PLLCFG = ((Fcclk / Fosc) - 1) | (1 << 5);
#endif
#if (Fcco / Fcclk) == 8
PLLCFG = ((Fcclk / Fosc) - 1) | (2 << 5);
#endif
#if (Fcco / Fcclk) == 16
PLLCFG = ((Fcclk / Fosc) - 1) | (3 << 5);
#endif
PLLFEED = 0xaa;
PLLFEED = 0x55;
while((PLLSTAT & (1 << 10)) == 0);
PLLCON = 3;
PLLFEED = 0xaa;
PLLFEED = 0x55;
// 设置存储器加速模块
// Set memory accelerater module
MAMCR = 0;
#if Fcclk < 20000000
MAMTIM = 1;
#else
#if Fcclk < 40000000
MAMTIM = 2;
#else
MAMTIM = 3;
#endif
#endif
MAMCR = 2;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -