内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

NANDFlash裸板編程-創(chuàng)新互聯(lián)

   nand flash按照我的理解,在開(kāi)發(fā)板上就類(lèi)似我們所用的電腦中的硬盤(pán),用來(lái)保存系統(tǒng)運(yùn)行的操作系統(tǒng),應(yīng)用程序,數(shù)據(jù)等,掉電之后還可以永久得保存數(shù)據(jù)(不包括臨時(shí)數(shù)據(jù))。通過(guò)控制或配置NAND Flash的控制器寄存器,即可完成對(duì)nand的操作:包括讀、寫(xiě)、擦除等。

恩陽(yáng)ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書(shū)未來(lái)市場(chǎng)廣闊!成為成都創(chuàng)新互聯(lián)的ssl證書(shū)銷(xiāo)售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書(shū)合作)期待與您的合作!

   而控制、配置這些寄存器是根據(jù)板子的原理圖、用戶(hù)手冊(cè)以及nand flash芯片手冊(cè)上的說(shuō)明來(lái)配置的。

NAND Flash裸板編程

通過(guò)原理圖,可見(jiàn)nand flash與cpu之間的數(shù)據(jù)傳輸主要是通過(guò)LDDATA0~7這8根引腳線,其中傳輸?shù)摹皵?shù)據(jù)”可以是地址、數(shù)據(jù),也可以是命令,這就要靠CLE、ALE引腳的狀態(tài)進(jìn)行選擇。

NAND Flash裸板編程

對(duì)于命令的傳輸,主要是對(duì)NFCMD寄存器寫(xiě)以上相對(duì)應(yīng)的命令值,但這個(gè)命令是分兩個(gè)周期進(jìn)行的。

NAND Flash裸板編程

而對(duì)于數(shù)據(jù)的傳輸,在數(shù)據(jù)傳輸模式下,傳輸數(shù)據(jù)也是要根據(jù)以上的格式去進(jìn)行傳輸,分5個(gè)周期,每一個(gè)周期傳輸?shù)臄?shù)據(jù)都十分講究,這就要求要有一個(gè)符合這種格式的巧妙算法(在接下來(lái)的代碼中體現(xiàn))。

了解了這些命令、數(shù)據(jù)的傳輸格式之后,就是要對(duì)具體的寄存器進(jìn)行相應(yīng)的配置了。首先要介紹這些寄存器的作用(數(shù)據(jù)手冊(cè)上對(duì)各寄存器都有說(shuō)明):

(1)NFCONF:用來(lái)設(shè)置時(shí)序參數(shù),設(shè)置位寬。

(2)NFCMD:命令寄存器。

(3)NFADDR:地址寄存器。

(4)NFDATA:數(shù)據(jù)寄存器,用于讀寫(xiě)數(shù)據(jù)。

(5)NFSTAT:狀態(tài)寄存器,只用到最低1位,表示是否忙碌。

編程舉例

實(shí)現(xiàn)從nand flash中拷貝程序到sdram中運(yùn)行,其中涉及到啟動(dòng)代碼的編程,初始化內(nèi)存控制器,讀取并拷貝nand flash上的數(shù)據(jù)。(只展示部分核心代碼)

head.S

.text
.global    _start
_start:
    ldr sp,=4096            @設(shè)置堆棧
    bl disable_watch_dog    @關(guān)閉看門(mén)狗
    bl set_mem                @設(shè)置內(nèi)存控制器
    bl nand_init            @nand初始化

    ldr r0,=0x30000000
    ldr r1,=4096
    ldr r2,=4096             @傳遞參數(shù)
    bl nand_read            @從nand中拷貝

    ldr sp,=0x38000000
    ldr lr, =halt          @設(shè)置返回地址
    ldr pc, =main  
halt:
    b halt

nand.c

typedef struct s3c2440_nand  
{
    unsigned int NFCONF;
    unsigned int NFCONT;
    unsigned int NFCMMD;
    unsigned int NFADDR;
    unsigned int NFDATA;
    unsigned int NFMECCD0;
    unsigned int NFMECCD1;
    unsigned int NFSECCD;
    unsigned int NFSTAT;
    unsigned int NFESTAT0;
    unsigned int NFESTAT1;
    unsigned int NFMECC0;
    unsigned int NFMECC1;
    unsigned int NFSECC;
    unsigned int NFSBLK;
    unsigned int NFEBLK;
}s3c2440_nand;
//定義nandflash控制器的起始地址
static s3c2440_nand* nand_base = (s3c2440_nand*)0x4E000000;

//片選
void select_chip_or_not(int flag)//0不片選,1片選
{
    if(flag == 1)
    {
        nand_base->NFCONT |= (0x1<<1);
    }
    if(flag == 0)
    {
        nand_base->NFCONT &= ~(0x1<<1);
    }
}
void write_command(unsigned char cmd)
{
     volatile unsigned char *p = (volatile unsigned char *)&nand_base->NFCMMD;
    *p = cmd;
}
void write_addr(unsigned int addr)
{
    int i;
    volatile unsigned char* p = (volatile unsigned char *)nand_base->NFADDR;

    *p = addr & 0xff;
    for(i=0; i<10; i++);
    *p = (addr >> 9) & 0xff;
    for(i=0; i<10; i++);
    *p = (addr >> 17) & 0xff;
    for(i=0; i<10; i++);
    *p = (addr >> 25) & 0xff;
    for(i=0; i<10; i++);
}
//等待nand flash就緒
void wait_ldle(void)
{
    volatile unsigned char* p = (volatile unsigned char*)nand_base->NFSTAT;
    int flag = *p & 1;
    while(!flag)
    {
        int i;
        for(i=0;i<20;i++);
    }

}
unsigned char read_data(void)
{
    volatile unsigned char *p= (volatile unsigned char*)nand_base->NFDATA;
    return *p;
}
void nand_read(unsigned char* buf,unsigned char base_addr,unsigned int size)
{
    int i,j;
    //片選
    select_chip_or_not(1);
    //復(fù)制數(shù)據(jù)
    for(i=base_addr;i<base_addr+size;)
    {
        write_command(0);//發(fā)送讀命令
        write_addr(i);   //發(fā)送地址
        write_command(0x30);
        wait_ldle();
        for(j=0;j<512;j++,i++)
        {
            *buf = read_data(); //讀取數(shù)據(jù),一次讀取一頁(yè)(512個(gè)字節(jié))
            buf++;
        }
    }
    select_chip_or_not(0);//取消片選

}
void nand_reset(void)
{
    select_chip_or_not(1);//片選
    write_command(0xff);
    wait_ldle();
    select_chip_or_not(0);
}
void nand_init(void)
{
    
    nand_base->NFCONF = (0<<12)|(3<<8)|(0<<4);
    nand_base->NFCONT = (1<<4)|(1<<1)|(1<<0);
    nand_reset();
}

還要說(shuō)下Makefile

objs := head.o init.o nand.o main.o
nand.bin : $(objs)
    arm-linux-ld -Tnand.lds $^ -o nand_elf
    arm-linux-objcopy -O binary -S nand_elf  $@
%.o : %.S
    arm-linux-gcc -c $< -o $@
%.o : %.c
    arm-linux-gcc -c $< -o $@
clean :
    rm -f nand.bin *.o nand_elf

平時(shí)寫(xiě)的Makefile不一樣,這里使用了一個(gè)名為nand.lds的鏈接腳本,這樣做主要是為了試驗(yàn)讓編譯好的程序在鏈接時(shí)存放的地址和理論運(yùn)行地址都不同且不在同一個(gè)存儲(chǔ)設(shè)備上,方便看試驗(yàn)效果。

nand.lds

SECTIONS {
    first    0x00000000 : {head.o init.o nand.o}
    second     0x30000000 : AT(4096) {main.o}
}

鏈接腳本上的第一段是放head.S init.c nand.c編譯出的內(nèi)容,從0地址開(kāi)始存放和執(zhí)行,而main.o則是需要從nand flash手動(dòng)復(fù)制到sdram中去執(zhí)行。

實(shí)現(xiàn)的效果如圖:

NAND Flash裸板編程

創(chuàng)新互聯(lián)www.cdcxhl.cn,專(zhuān)業(yè)提供香港、美國(guó)云服務(wù)器,動(dòng)態(tài)BGP最優(yōu)骨干路由自動(dòng)選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動(dòng)現(xiàn)已開(kāi)啟,新人活動(dòng)云服務(wù)器買(mǎi)多久送多久。

網(wǎng)頁(yè)題目:NANDFlash裸板編程-創(chuàng)新互聯(lián)
當(dāng)前URL:http://www.rwnh.cn/article36/doposg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、定制網(wǎng)站、服務(wù)器托管、企業(yè)網(wǎng)站制作、網(wǎng)站策劃、微信小程序

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)
资兴市| 从江县| 河池市| 武安市| 泸水县| 宝兴县| 新蔡县| 贵定县| 江都市| 永清县| 格尔木市| 米林县| 阿城市| 永仁县| 玉屏| 丰宁| 土默特右旗| 麻城市| 鲜城| 张家港市| 汪清县| 望城县| 隆林| 克什克腾旗| 岢岚县| 南昌县| 贡嘎县| 平利县| 四会市| 新兴县| 南投县| 常宁市| 灌阳县| 上蔡县| 仲巴县| 敦化市| 六安市| 浦县| 出国| 随州市| 洞口县|