⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 startup_c.c

📁 ucos内核源代码
💻 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 + -