程序主要是JZ2440的,只是改了一下led.c,下載后發現led閃得非常快.
head.S
@*************************************************************************
@ File:head.S
@ 功能:設置SDRAM,將第二部分代碼復制到SDRAM,設置頁表,啟動MMU,
@ 然后跳到SDRAM繼續執行
@*************************************************************************
.text
.global _start
_start:
ldr sp, =4096 @ 設置棧指針,以下都是C函數,調用前需要設好棧
bl disable_watch_dog @ 關閉WATCHDOG,否則CPU會不斷重啟
bl memsetup @ 設置存儲控制器以使用SDRAM
bl copy_2th_to_sdram @ 將第二部分代碼復制到SDRAM
bl create_page_table @ 設置頁表
bl mmu_init @ 啟動MMU
ldr sp, =0xB4000000 @ 重設棧指針,指向SDRAM頂端(使用虛擬地址)
ldr pc, =0xB0004000 @ 跳到SDRAM中繼續執行第二部分代碼
halt_loop:
b halt_loop
init.c
/*
* init.c: 進行一些初始化,在Steppingstone中運行
* 它和head.S同屬第一部分程序,此時MMU未開啟,使用物理地址
*/
/* WATCHDOG寄存器 */
#define WTCON (*(volatile unsigned long *)0x53000000)
/* 存儲控制器的寄存器起始地址 */
#define MEM_CTL_BASE 0x48000000
/*
* 關閉WATCHDOG,否則CPU會不斷重啟
*/
void disable_watch_dog(void)
{
WTCON = 0; // 關閉WATCHDOG很簡單,往這個寄存器寫0即可
}
/*
* 設置存儲控制器以使用SDRAM
*/
void memsetup(void)
{
/* SDRAM 13個寄存器的值 */
unsigned long const mem_cfg_val[]={ 0x22011110, //BWSCON
0x00000700, //BANKCON0
0x00000700, //BANKCON1
0x00000700, //BANKCON2
0x00000700, //BANKCON3
0x00000700, //BANKCON4
0x00000700, //BANKCON5
0x00018005, //BANKCON6
0x00018005, //BANKCON7
0x008C07A3, //REFRESH
0x000000B1, //BANKSIZE
0x00000030, //MRSRB6
0x00000030, //MRSRB7
};
int i = 0;
volatile unsigned long *p = (volatile unsigned long *)MEM_CTL_BASE;
for(; i < 13; i++)
p[i] = mem_cfg_val[i];
}
/*
* 將第二部分代碼復制到SDRAM
*/
void copy_2th_to_sdram(void)
{
unsigned int *pdwSrc = (unsigned int *)2048;
unsigned int *pdwDest = (unsigned int *)0x30004000;
while (pdwSrc < (unsigned int *)4096)//pdwSrc表示地址值
{
*pdwDest = *pdwSrc;
pdwDest++;
pdwSrc++;
}
}
/*
* 設置頁表
*/
void create_page_table(void)
{
/*
* 用于段描述符的一些宏定義
*/
#define MMU_FULL_ACCESS (3 << 10) /* 訪問權限 */
#define MMU_DOMAIN (0 << 5) /* 屬于哪個域 */
#define MMU_SPECIAL (1 << 4) /* 必須是1 */
#define MMU_CACHEABLE (1 << 3) /* cacheable */
#define MMU_BUFFERABLE (1 << 2) /* bufferable */
#define MMU_SECTION (2) /* 表示這是段描述符 */
#define MMU_SECDESC (MMU_FULL_ACCESS | MMU_DOMAIN | MMU_SPECIAL |
MMU_SECTION)
#define MMU_SECDESC_WB (MMU_FULL_ACCESS | MMU_DOMAIN | MMU_SPECIAL |
MMU_CACHEABLE | MMU_BUFFERABLE | MMU_SECTION)
#define MMU_SECTION_SIZE 0x00100000
unsigned long virtuladdr, physicaladdr;
unsigned long *mmu_tlb_base = (unsigned long *)0x30000000;
/*
* Steppingstone的起始物理地址為0,第一部分程序的起始運行地址也是0,
* 為了在開啟MMU后仍能運行第一部分的程序,
* 將0~1M的虛擬地址映射到同樣的物理地址
*/
virtuladdr = 0;
physicaladdr = 0;
*(mmu_tlb_base + (virtuladdr >> 20)) = (physicaladdr & 0xFFF00000) | //一共三個其實是在建表
MMU_SECDESC_WB;
/*
* 0x56000000是GPIO寄存器的起始物理地址,
* GPBCON和GPBDAT這兩個寄存器的物理地址0x56000050、0x56000054,
* 為了在第二部分程序中能以地址0xA0000050、0xA0000054來操作GPFCON、GPFDAT,
* 把從0xA0000000開始的1M虛擬地址空間映射到從0x56000000開始的1M物理地址空間
*/
virtuladdr = 0xA0000000;
physicaladdr = 0x56000000;
*(mmu_tlb_base + (virtuladdr >> 20)) = (physicaladdr & 0xFFF00000) |
MMU_SECDESC;
/*
* SDRAM的物理地址范圍是0x30000000~0x33FFFFFF,
* 將虛擬地址0xB0000000~0xB3FFFFFF映射到物理地址0x30000000~0x33FFFFFF上,
* 總共64M,涉及64個段描述符
*/
virtuladdr = 0xB0000000;
physicaladdr = 0x30000000;
while (virtuladdr < 0xB4000000)
{
*(mmu_tlb_base + (virtuladdr >> 20)) = (physicaladdr & 0xFFF00000) |
MMU_SECDESC_WB;
virtuladdr += 0x100000;
physicaladdr += 0x100000;
}
}
/*
* 啟動MMU
*/
void mmu_init(void)
{
unsigned long ttb = 0x30000000;
__asm__(
"mov r0, #0n"
"mcr p15, 0, r0, c7, c7, 0n" /* 使無效ICaches和DCaches */
"mcr p15, 0, r0, c7, c10, 4n" /* drain write buffer on v4 */
"mcr p15, 0, r0, c8, c7, 0n" /* 使無效指令、數據TLB */
"mov r4, %0n" /* r4 = 頁表基址 */
"mcr p15, 0, r4, c2, c0, 0n" /* 設置頁表基址寄存器 */
"mvn r0, #0n"
"mcr p15, 0, r0, c3, c0, 0n" /* 域訪問控制寄存器設為0xFFFFFFFF,
* 不進行權限檢查
*/
/*
* 對于控制寄存器,先讀出其值,在這基礎上修改感興趣的位,
* 然后再寫入
*/
"mrc p15, 0, r0, c1, c0, 0n" /* 讀出控制寄存器的值 */
/* 控制寄存器的低16位含義為:.RVI ..RS B... .CAM
* R : 表示換出Cache中的條目時使用的算法,
* 0 = Random replacement;1 = Round robin replacement
上一篇:s3c2440——實現裸機的簡易printf函數
下一篇:FL2440 (2) 裸板程序 SDRAM
推薦閱讀
史海拾趣
在電子行業發展的浪潮中,愛普特半導體(APTSEMI)始終堅持自主創新的發展道路。公司自創立之初,就致力于研發具有自主知識產權的微處理器芯片。面對國外技術封鎖和市場壟斷的困境,愛普特團隊不畏艱難,投入大量研發資源,成功突破了多項技術難關,研發出了全國產、高可靠性的32位MCU產品。這些產品性能卓越,可與國際先進水平相媲美,為我國電子行業的自主可控發展貢獻了重要力量。
Bytes公司自成立以來,始終堅持以技術創新為核心競爭力。公司早期便投入大量研發資源,開發出一款具有劃時代意義的電子產品,迅速在市場上占據一席之地。隨著技術的不斷進步,Bytes公司不斷推出更新換代的產品,滿足消費者日益增長的需求。同時,公司還積極與高校、科研機構合作,共同研發新技術,為公司的持續發展提供源源不斷的動力。
隨著公司業務的不斷發展壯大,Elprotronic Inc.開始實施國際化戰略。他們積極開拓海外市場,與全球眾多知名電子廠商建立了長期穩定的合作關系。為了更好地服務海外客戶,公司還成立了專業的海外銷售和技術支持團隊,提供及時、高效的服務。通過國際化戰略的實施,Elprotronic Inc.不僅拓展了業務范圍,也提升了公司的國際競爭力。
2012年,對于Cableform Inc來說是一個重要的轉折點。這一年,公司成功加入了HUBBELL系列,與Hubbell工業控制有限公司建立了戰略合作關系。這一合作使得Cableform Inc能夠借助Hubbell的品牌影響力和市場渠道,進一步拓展業務范圍,提升市場地位。同時,通過與Hubbell的技術交流和資源共享,Cableform Inc在技術創新和產品升級方面也取得了顯著進展。
在1935年,DURAKOOL公司在Durakool成立,由幾位電子工程師和發明家共同創立。他們的初衷是為電氣和電子市場提供高質量的組件和系統。起初,公司面臨著資金短缺和市場競爭激烈的挑戰,但他們憑借對技術的熱情和不懈的努力,逐漸開發出了一系列具有競爭力的產品,如Durakool水銀繼電器和功率繼電器,贏得了客戶的認可。
Altus深知人才是企業發展的根本。因此,公司一直注重人才培養和引進工作。通過建立完善的培訓體系和激勵機制,Altus吸引了大量優秀人才加入公司,并為他們提供了廣闊的發展空間和職業晉升機會。這些人才在公司的各個崗位上發揮著重要作用,推動了公司的技術創新和市場拓展。同時,Altus還注重員工的福利待遇和文化建設,營造了積極向上、團結和諧的工作氛圍。
在wince下用mfc的dialog類編程,我在resource中加入了菜單,然后通過下面代碼加入到dialog的init中,實現了wince下dialog中添加菜單的功能 SHMENUBARINFO m_menu_bar; ZeroMemory(&m_menu_bar, ...… 查看全部問答∨ |
五個光控輸入, 分別控制五個氣動開關,時延可調。最好有顯示屏! 有沒有解決方案? 多長時間?大概多少鐵? 高手回答一下, yijian_102@163.com 謝謝! … 查看全部問答∨ |
我看的資料中說 如果我要在一條指令設斷點 其實就是運行中實時監測地址總線 如果是斷點 就激活cpu的debug 不過如果指令在cache中怎么辦 不就無法中斷了么? 我搜到網上的資料又說 “...所幸的是,我用的debugger提供JTAG Monitor,允許斷點 ...… 查看全部問答∨ |
|
你好!我現在使用PIC16F675,使用內部4MHZ。 GP5 輸入口; H : 工作; L:停止; GP3 不使用; GP4,GP2,GP1,GP0 輸出口,輸出脈沖,時間50US; GP4 外接NPN管 L ...… 查看全部問答∨ |
|
一個朋友說程序死機,拿過來仿真,發現在退出某函數時就產生了一個 Usage Fault:試圖在無效的 ISA 狀態中執行指令。例如,不是thumb 試圖在無效的 EPSR 狀態中執行,例如,在BX類型指令改變狀態之后。這包括從異常中返回之后的 ...… 查看全部問答∨ |