?? 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 + -