EDN首页   博客首页

最新日志

发表于:2008-7-9 23:35:12
标签:PIC  FLASH  

1

PIC18F系列读写FLASH的函数

网上搜了一下,关于PIC18F系列读写FLASH的函数,有很多都是有错误的或者有BUG的,集中在表指针的操作上.

 

因此走了些弯路,现在发一个我自己写的读写FLASH的函数分享给大家,已测试过,支持绝大部分PIC18F系列的芯片.

 

还有一个是写"1字节"的函数,写几个字节的时候很有用.有人一定会反驳说写操作不是按64个字节块来执行的吗?确实是,下边已经给出注释了.

 

以下是写函数的部分代码:

#define addr 0x400   //定义要写入的起始地址

//写周期
void Write_Cycle(void)
{
 EEPGD = 1;    //EEPGD:闪存程序存储器或数据EEPROM 选择位
                         //1 = 访问闪速程序存储器
                         //0 = 访问数据EEPROM
 CFGS = 0;      //CFGS:闪存程序存储器/ 数据EEPROM 或配置寄存器选择位
                         //1 = 访问配置寄存器
                         //0 = 访问闪存程序存储器或数据EEPROM
 WREN = 1;    //WREN:闪存程序/ 数据EEPROM 写使能位
                         //1 = 允许闪存程序/ 数据EEPROM 的写周期
                         //0 = 禁止闪存程序/ 数据EEPROM 的写周期
 CARRY = 0;
 if(GIE)
    CARRY = 1;
 GIE = 0;         //关全局中断
 EECON2 = 0X55;
 EECON2 = 0XAA;
 WR = 1;        //1 启动读/写周期;0 写周期完成
 NOP();
 NOP();
 while(WR) ;  //等待写周期完成
 WREN = 0;    //0 禁止向程序存储器或EEPROM写操作

 if(CARRY)
      GIE = 1;     //IPEN=1,开中断
}

//器件复位时和写操作后保持寄存器的默认
//值为FFh。向保持寄存器写入FFh 并不会
//修改寄存器中存储的字节。这意味着,假如
//不想将某个位从0 改为1,而仅修改程序存
//储器中的个别字节也是可以的。当修改个
//别字节时,在执行写操作前不必装入所有
//的64 个保持寄存器。

 

//写函数,每次写入FLASH是1个字节
void Write_One_Byte(unsigned long address,unsigned char data)
{
     TBLPTRL = ((address) & 0xFF);
     TBLPTRH = (((address) >> 8) & 0xFF);
     TBLPTRU = (((address) >> 8) >> 8);

    TABLAT = data;
    asm("\tTBLWT*");

    FREE = 0;          //只执行写操作
    Write_Cycle();
}

//写函数,每次写入FLASH只能是64字节,故要写入大量数据的话,就需要多次写入
void Flash_Write(unsigned long address,unsigned char *Pdata)
{
 unsigned char count;
 unsigned char length; 

 Flash_Erase(address);     //擦除64个字节

 for(count=0; count<8; count++)    //写8次,8*8=64
 {
      TBLPTRL = ((address+count*8) & 0xFF);  //地址载入TBLPTR
      TBLPTRH = (((address+count*8) >> 8) & 0xFF);
      TBLPTRU = (((address+count*8) >> 8) >> 8);

  for(length=0; length<8; length++)    //写8字节到RAM
  {
     TABLAT = *(Pdata+length+count*8); //数据载入TABLAT
     if(length != 0)     
    {
        asm("\tTBLWT+*");  //TBLPTR需要预先增加   
     }
     else
     {
       asm("\tTBLWT*");  //地址已经载入TBLPTR,不需要预先增加   
      }
   }

    FREE = 0;       //只执行写操作
    Write_Cycle();
 }
}

void main(void)
{   
 Write_One_Byte(addr-1, 0xaa);
 Flash_Write(addr, &data[0]);
 while(1)
 {
  temp = Flash_Read(addr-1);
 }
}

 

MPLAB SIM仿真结果,其中地址0x3ff中的数据:0xaa就是用"写1字节"函数写上去的.

 

附件内含两个工程,一个是用PICC18编译器的,一个是MCC18编译器的.

 

再送大家一个CleanUp.bat,可以用来清除编译器产生的一些链接文件之类的,很好用.

附件下载地址:点击下载

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(0) | 阅读(440)
发表于:2008-6-12 14:29:40
标签:PIC  IAP  BOOTLOADER  HEX  

1

如何把两个*.hex合并成一个*.hex?在写IAP/Bootloader很有用哦

        前几天,一网友在某论坛上问我关于PIC Bootloader的问题,他问如何创建两个工程分别编写引导程序和用户程序,分别将两个工程编译成两个.hex文件,然后手工合为一个.hex文件,然后再把这个合并后的.hex文件(即包含引导程序和用户程序)烧写到芯片上去?

 

        恰好在这之前我写过PIC Bootloader,遇到并解决了这个问题.那么现在就来向大家介绍一下关于如何把两个.hex文件合并成一个.hex的方法,一般在你写IAP/Bootloader的时候能够用到,此方法自己认为很有创造性,希望大家喜欢,呵呵.

 

        阅读此文章之前你需要了解如下几个方面的知识:
        1.如何在PICC18编译器中实现程序定位?
答:方法是在MPLAB IDE中,从菜单中选择Project->Build Options...->Project,在PICC-18 Linker页标下的Specify offset for ROM(ROM代码偏移量)中输入偏移量XXX(注意这里输入的已经是16进制了,不用在转换)。 
        重新编译,然后在View->Program Memory就可以看到你的程序已经定位在XXX起始的地址上了.
        2.理解这个语句所代表的意思:  (*((void(*)(void))User_Start))();
        3.了解hex文件的格式.

 

        好,现在就开始谈谈实现方法吧:
        1.配置,编译,链接第一个程序,生成第一个.hex文件
        下边这个程序是0ffset_0x000.c,其代码位于0x000-0x4ff起始的地址块上,请参照Note上的提示进行设置,把生成的hex文件命名为:000.hex
/************************************************************************************************
**本程序只供学习使用,未经作者许可,不得用于其它任何用途
**版权所有,盗版必究。
**Copyright(C) CheungMan
**All rights reserved
**欢迎访问我的blog:http://www.ednchina.com/blog/cheungman
**E-mail          : zhw-198@163.com
************************************************************************************************
**FileName      : 0ffset_0x000.c
**Target        : PIC18F458
**XTAL          : 4MHZ
**Autor         : ZhangWen
**Start Date    : 2008.04.24
**Modify Date   :
**Edition       : V1.0
**HardWare      :
**SofeWare      : MPLAB IDE v8.02 + PICC 18 v8.35
**Function      : 请在MPLAB IDE中,从菜单中选择Project->Build Options...->Project,
**    在PICC-18 Linker页标下的Specify offset for ROM(ROM代码偏移量)中输入偏移量0
**Note          : 注意,此程序偏移0x000地址,其实默认就是0.
***********************************************************************************************/

#include

__CONFIG(1, HSPLL);   //配置HS,4倍频
__CONFIG(2, WDTDIS);   //禁止看门狗

#define User_Start    0x500     //用户程序开始位置

//延时
void Delay(void)
{
 unsigned long i;
 for(i=0; i<150000; i++);
}

void main(void)
{
 unsigned char FlashTime; //定义闪烁次数
     TRISB = 0x00;   //定义RB0-RB7为输出   
     PORTB = 0x00;   //初始化为低电平
     while(1)
    {
         for(FlashTime=0; FlashTime<10; FlashTime++)//闪烁10次
  {
   PORTB = 0xff;
          Delay();
          PORTB = 0x00;
          Delay();
  }
         (*((void(*)(void))User_Start))(); //进入用户程序,即0x500地址起始的程序代码,也就是0ffset_0x500.c
    } 
}

         2.配置,编译,链接第二个程序,生成第二个.hex文件
        下边这个程序是0ffset_0x500.c,其代码位于0x500-0xXXX起始的地址块上,请参照Note上的提示进行设置,把生成的hex文件命名为:500.hex
/************************************************************************************************
**本程序只供学习使用,未经作者许可,不得用于其它任何用途
**版权所有,盗版必究。
**Copyright(C) CheungMan
**All rights reserved
**欢迎访问我的blog:http://www.ednchina.com/blog/cheungman
**E-mail          : zhw-198@163.com
************************************************************************************************
**FileName      : 0ffset_0x500.c
**Target        : PIC18F458
**XTAL          : 4MHZ
**Autor         : ZhangWen
**Start Date    : 2008.04.24
**Modify Date   :
**Edition       : V1.0
**HardWare      :
**SofeWare      : MPLAB IDE v8.02 + PICC 18 v8.35
**Function      : 请在MPLAB IDE中,从菜单中选择Project->Build Options...->Project,
**    在PICC-18 Linker页标下的Specify offset for ROM(ROM代码偏移量)中输入偏移量0x500
**Note          : 注意,此程序偏移0x500地址
***********************************************************************************************/

#include

__CONFIG(1, HSPLL);     //配置HS,4倍频
__CONFIG(2, WDTDIS);    //禁止看门狗

//延时
void Delay(void)
{
 unsigned long i;
 for(i=0; i<150000; i++);
}

void main(void)
{
    TRISB = 0x00; //定义RB0-RB7为输出 
    PORTB = 0x00; //初始化为低电平
    while(1)
    {
 PORTB = 0xaa;
        Delay();
        PORTB = 0x55;
        Delay();
    } 
}

        3.使用UltraEdit分别打开000.hex和500.hex,然后对比一下两者,把500.hex中的部分代码复制并插入到000.hex的代码中,请看图1和图2所示,然后再另存为test.hex.至于为什么要这样操作或者怎样操作,请了解hex的格式先吧.

点击看大图

                                                     图1.选取500.hex上的数据

点击看大图

                                                   图2.拷贝到000.hex上去

        4.接着你可以把这个新生成的test.hex通过ICD2直接下载到芯片上去,你就可以看到0ffset_0x000.c程序中描述的,看到所有RB0-RB7闪烁10次后,接着就会进入0ffset_0x500.c程序中描述的,RB0-RB7间隔闪烁.如果在0ffset_0x500.c程序上再跳转到0x000地址上去的话,又运行0ffset_0x000.c程序了,是不是很有意思啊?不过我没增加这样的语句,你们自己加加看.

        5.在这里,我就用PROTEUS调试给大家看看吧,请看图3和图4.

                                 图3.运行0ffset_0x000.c时的情况

                          图4.运行0ffset_0x500.c时的情况

        PS:在这里要注意的是0ffset_0x500.c,由于此程序已偏移到0x500地址上去,如果你编写含中断的程序的话,需要重定义中断向量.至于如何重定义,下次再写篇如何定义的博文吧.这里我就没有重定义中断向量了,为的是用最简单,最通俗的程序,让大家理解,明白.
    
        再PS:请严格按照程序中NOTE的指示进行设置.

源码:rar

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(1) | 阅读(1209)
发表于:2008-6-4 23:39:29
标签:protel  原理图  标注  

1

Protel技巧之二:巧为元器件进行标注

        今天发现自己的博客中11篇博文,居然有5篇博客精华,质量很高啊,非常感谢EDNCHINA,非常开心,想起自己好久没有更新过BLOG了,想起以前设计原理图时候使用过的一个技巧,现发出来分享给大家.

 

        之前发过一篇博文叫:Protel技巧之一:设计原理图模块化.现在我就在此原理图基础上讲讲第二个技巧:巧为元件进行标注.

 

        大家调试一块电路板的时候,是不是经常要看着线路板,并对着原理图进行电路分析.每次你看着原理图上的某一个元件,然后在线路板使劲找那个元件的时候,或者根据这个元件,沿着电路找下一个元件的时候,可是你发现很难找到.那是因为你设计原理图时候没有就对一个模块电路的那些外围元件进行合理标注.

 

        如果我们设计原理图时候,分模块、分功能对电路的外围元件进行标注,那么你只需要知道这个模块在线路板那个位置,然后根据这个模块其中一个元件可很快就查询到下一个元件.例如图4中,你先在线路板上找到RS232模块所在位置,然后你先找到C1,就可以很快找到C2,C3,C4,C5了,因为数字排列挺有规律.如果你把这几个电容标注为C10,C7,C29,C30,C68,那么你在线路板上分析RS232电路的时候,是比较麻烦的,因为排列无规则,实际应用中你就能体会到.

 

        好了,现在我来说说如何巧为原理图的那些元器件进行合理标注的方法吧:

        1.首先,按下键盘"S",然后选择Outside Area,然后根据RS232的虚线框选取整个RS232模块,请看图1,你会发现除RS232模块外,其他被选取了,为什么要这样做,呵呵,看了下边步骤,你就明白了.

点击看大图

                                                                        图1

        2.接着Tools->Annotate,在Option选项中,我们把Annotate Option选为: ?Parts,勾选Current sheet only和Ignore selected part,接着在Re-annotate Method中选择你需要排列的顺序,具体设置请看图2.

                                              图2

        3.接着会生成REP文件,仅RS232模块的元器件被标注了,请看图3,图4.

                           图3

点击看大图

                                                           图4

        4.接着你继续重复以上步骤,就可以把所有元器件都分模块、分功能标注好.之前标注好的是不会重复标注的.

 

        这种方法的很实用,希望大家能喜欢,也希望大家能设计出一份好的原理图,简化工作量,给自己,给他人一个方便.

 

系统分类: PCB   |    用户分类:    |    来源: 原创

评论(2) | 阅读(1325)
发表于:2008-4-8 22:05:16
标签:PIC  16  dsPIC33  单片机  

1

如何使用PIC C30中的外设库函数?

        刚开始学dsPIC33,发现MicroChip做的C30编译器还不错,里边有常用的外设库(Peripheral Libraries),写程序也不用查datasheet就可以很快配置好寄存器了,节省了时间。


        由于刚上手MPLAB,根据前段时间对PIC32中的C32的了解,并根据C:\Program Files\Microchip\MPLAB C30\docs\中相关文档的学习,开始使用C30中的外设库编程。但是每次MAKE PROJECE的时候,老是出错,发现老是提示错误说LINK STEP ERROR。根据对编译器的一知半解,知道是库文件上出了问题,把C30目录下的文档翻了一遍,也没看到相关SAMPLE,看了HELP也没发现有什么要注意的地方,把BUILD OPTIONS中的选项仔细配置一下也仍失败。


        经过baidu,发现国内PIC 16位单片机的讨论和资料都很少。去MicroChip官方网站浏览了一下,发现SAMPLE也很少提及。无奈之下去MicroChip BBS上求救,经历第一次用蹩脚的英语在外国论坛上跟人家交流。


        后来一瑞典的外国网友指出“I think you need to include the .coff file for your device in the Library folder of your Mplab project tree ”。


        当时也不知道如何解决,后来看了C:\Program Files\Microchip\MPLAB C30\docs\periph_lib\16-bit Peripheral Libraries.htm中其中一段话
      “The library files are of the form libpDevice-elf.a or libpDevice-coff.a (depending on executable/object file format selected during the compile operation), where Device is a 16-bit device number (e.g., libp24HJ256GP610-coff.a or libp24HJ256GP610-elf.a for the PIC24HJ256GP610 device). ”


    我明白问题怎样解决了,于是我在MPLAB项目树中的Library Files中添加了libp33FJ64GP710-coff.a文件,再次MAKE,终于提示BUILDE SUCCEEDED。

点击看大图

e44fe62c

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(0) | 阅读(637)
发表于:2008-4-2 21:47:36
标签:protel  

2

Protel技巧之一:设计原理图模块化

 

        设计大系统的原理图的时候,通常元器件很多,而且连线错综复杂,很容易搞错,看起来也不舒服,如果大家设计的时候,把各个模块系统化,对不同功能的部分进行分类,然后用不同颜色的虚线框围起来,再用不同颜色的总线进行连接.这样既美观,又看的舒服,而且节省许多设计时间.

下边介绍一下如何设计.

举个简单的原理图见说明:

1.电源模块

点击看大图

2.RS232模块

点击看大图

3.CAN总线模块

点击看大图

4.MCU模块

5.MCU外围晶振、复位、下载模块

 

把这些不同功能的模块分离开来,然后用PolyLine虚线圈起来,这样做的目的有两个:

1.把一个模块跟其他模块独立开来;

2.以后设计的时候,只要沿着虚线部分选取模块,然后copy到新的设计原理图上就可以了.

把各个部分拼装组合,象搭积木一样,要什么copy什么,然后加上网络号,连上总线,一张漂亮美观的原理图出来了.

点击看大图

 

 

系统分类: PCB   |    用户分类:    |    来源: 原创

评论(1) | 阅读(621)
发表于:2007-9-14 17:50:43
标签:无标签

0

真正的变形金刚

http://www.56.com/n_v165_/c17_/23_/18_/yuan8088_/zhajm_1184957140_349_/39000_/0_/15707484.swf

简直是精品艺术品,叹为观止,你们觉得呢?

1c855e61

 

系统分类: 自由话题   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(540)
发表于:2007-7-21 23:56:00
标签:嵌入式  linux  毕业设计  

2

看了评论,我说说我的看法,也说说我做毕业设计的经历。

呵呵,多谢各位的评论,还希望各位多多指点一下啊,继续顶一顶啊。

其实这个毕业设计,当初定的方案跟现在做出来根本就不同,我就是在一步一步学习ARM+LINUX中,不断更改方案的。直到毕业答辩前的一个星期,我才初步定下了最终设计方案。现在,请大家看看我做毕业设计的经历吧。

我是刚开始学习ARM的,当初导师给毕业设计课题跟方案的时候,其实是要我用单片机做的,可我不愿意啊,我想学习ARM啊。于是我向导师表明这个意思,老师就说,那好吧,你就用ARM去做,加上S3C44B0已经有以太网控制器RTL8019,让我把测量出来的温度通过网卡,再接一个无线路由器实现数据无线传输,然后用C++BUILDER编一个界面。呵呵,看到这里,你们一定会笑死了吧,说这是啥设计啊。不过,毕竟这是一个毕业设计,毕竟这不是商业化的产品,毕竟我还是要毕业,于是我就依了老师。

今年3月份,我开始做这个毕业设计,一开始就是熟悉ARM的调试和开发步骤,熟悉ADS1.2,SDT啊,熟悉S3C44B0的datasheet啊,写些小程序啊,查找资料啊。

到了4月份,我就开始编写DS18B20在S3C44B0上的驱动(其实是跑裸机的,详情请见我blog上的日志),这个月也熟悉了uclinux的内核编译,不过老是出错,出错了我也不知道哪里出错了,只知道error,呵呵,不过现在不会了。

好了,5.1过去了,我发现我的毕业设计做的还不是怎样啊,就只是实现了测温,还要网络传输啊,还有编写界面啊,我开始急了,网络部分我怎么也搞不出来,到6月初可要答辩了啊。算了,先不理它了,过几天再研究吧。在这里我说一下,我喜欢把搞了几天的也弄不懂的东西放几天才去弄,通常过了几天我再去弄,通常就比较容易弄懂了。于是先开始研究uclinux吧,因为搞ARM,不搞点操作系统的话,就太不象话了吧,一个朋友说的,我受了他影响,当然我也不反对拿ARM当超级单片机的。

对uclinux的研究,我先是熟悉了uclinux的内核编译,裁减,添加用户程序啊,等等。之后看了玛玛金柯的菜鸟的ARM笔记中的关于uclinux下编写设备驱动程序,我就尝试了编写一个led的设备驱动,哈哈,经过努力,成功了。我开始对uclinux着迷了,就想试着编写DS18B20在uclinux下的设备驱动,也经过不少的努力,我也编写出来了,这期间有两个星期是最难熬啊,为什么呢,那么努力,但是出不了成果是很伤士气的啊。后来在两位好朋友的指点下,我知道了问题所在,原来是我在DS18B20转换时候,我设置的是12bit的分辨率,唉,根据datasheet,应该需要延时750ms的,我才给了10ms,唉,没有认真研究datasheet下场,活该。

好了,接下来该是研究socket了吧,就是实现数据通过网络传输。好了,在研究中,我发现了一个好东西,那就是uclinux下的web服务器--boa,也是因为boa,实现了我做信息家电的梦想吧。于是我就开始研究boa,发现配置好boa后,并且可通过编写CGI程序来实现:在IE浏览器中输入IP地址,就可以进入监控主页,然后在网页上进行操作,就可以在网页上看到反馈的信息。于是我又认真研究了boa,html语言。通过对这些所做的东西进行整合,才有了我这个毕业设计的皱形。

njsyq网友说的对,我这个界面太简单了,其实为了在答辩时候可以争取老师好感,我才编写这样的界面,也就是你们现在所看到的,是该修改一下界面。最后做出来,刚好过三天就要答辩了。

搞了boa,倒是把socket给丢了,不过我最终也搞了一下。编写上位机界面是来不及了,因为我对C++BUILDEER还不熟悉,就拿它来编过串口界面跟一些简单的小界面。最后我是找了个网络调试助手来调试。

不过,我这个设计只是实现局域网控制,还不能在广域网实现,好象需要注册域名、申请空间啊,这些我不懂,今后要在这方面进行努力研究。你想想啊要是用个手机上网,通过web技术实现对家里的电器设备进行控制,你说那是多么惬意啊。

后记:

1.看了各位的评论,我认真上网查了一下,才知道原来真的是可以用单片机做出来的,还请各位交流一下。

2.在这里我说说我的职业目标是嵌入式,而其中我最想做就是信息家电,而web技术与各种自动控制技术的结合,我相信一定是一个很好的发展方向。


 

系统分类: 嵌入式   |    用户分类:    |    来源: 原创

评论(2) | 阅读(1218)
发表于:2007-7-5 3:10:54
标签:uclinux  s3c44b0  web  嵌入式  温度  

7

毕业作品

本人毕业设计的作品,是在ARM7(S3C44B0)+uClinux的平台下进行开发设计的,通过编写DS18B20温度传感器的设备驱动和搭建uClinux下的Boa服务器,利用CGI编程,从而实现远程测控功能,可以在网页上显示检测的温度,还可以在网页上对设备进行控制。请参照如下图所示。

 

此项目可以作为一个信息家电的模型。

 

     责任描述:

1。编写DS18B20温度传感器和I/O控制在uClinux下的驱动程序及应用程序;

2。使用HTML语言制作测控系统主页;

3。配置Boa服务器,用C语言编写系统的CGI程序;

4。内核裁剪;

5。硬件制作与调试。 

 

图1 作品界面
 
图2 作品实物

图3 监控界面

系统分类: 嵌入式   |    用户分类:    |    来源: 原创

评论(14) | 阅读(2551)
发表于:2007-7-3 18:14:18
标签:S3C44B0  DS1820  温度  ARM  

2

S3C44B0驱动DS1820采集温度

    这个项目是我在S3C44B0上跑裸机(就是说不加操作系统,把S3C44B0当成超级单片机使用),通过驱动DS18B20集温度数据并通过超级终端把温度显示出来。本人是把单片机下DS18B20驱动程序移植到S3C44B0来的,所以要特别注意时序问题,主要是注意S3C44B0的主频设置问题,我在程序设置了S3C44B0的主频为20MHz

    这个项目的成功,是我学习ARM以来的一个伟大飞跃,我在QQ空间上写了一个日记,标榜为历史性的一天,可见其意义,此次成功,学习ARM我有了极大兴趣跟动力,算得上是踏进嵌入式的门槛,这也为我后来在uClinux下编写DS1820的驱动打下了基础。

点击看大图

    后记:学习ARM,需要良好的单片机基础,这是一定的。

rar

系统分类: ARM   |    用户分类:    |    来源: 原创

评论(2) | 阅读(1632)
发表于:2007-7-1 16:22:01
标签:S3C44B0  boot  bootloader  arm  

4

关于u-boot


U-BOOT是当前比较流行、功能强大的BootLoader,可以支持多种体系结构,具有下载,引导程序的功能,还

可以支持串口下载和网口下载.现在把一些命令总结一下,免得以后忘记了还可以查阅,本来早想写一篇关

于u-boot总结的了,今天网友板砖问了一下这方面的问题,所以就写一下关于这方面的东西。   

1.u-boot引导程序:


进入u-boot,输入命令print,查看bootcmd的参数,接着tftp *.bin文件到sdram中,现在我tftp一个ucos的led测试文件

ht_ucos.bin 到0x0c008000,命令如下:


set bootfile ht_ucos.bin
save 
tftp

 

点击看大图

 

接着要擦除flash的地址0x50000-0x1fffff,我的flash的地址分配如下:


u-boot代码区:  0x0-0x3ffff
u-boot的参数区:0x40000-0x4ffff
用户程序区:    0x50000-0x1fffff 


为了保证不出错,先擦除flash:


er 0x50000-0x1fffff 


接着把ht_ucos的程序从sdram拷贝到flash的地址0x50000


cp 0x0c008000 0x50000 hex长度         (hex的长度计算如下:hex/4+2)

 

 

hex的长度是4878(十六进制)/4+2=1220


接着是设置bootcmd这个参数了:


set bootcmd cp 0x50000 0x0c008000 1220\;go 0x0c008000
save


接着重启一下板子,可以看到在基于ucos操作系统下的流水灯,是使用u-boot引导的.

2.使用u-boot烧写uclinux到flash中


使用u-boot可以用来烧写程序,支持串口下载和网口下载,我一般是用tftp网口下载的,速度很快,使用串口老

是出问题,而且速度超慢.


烧写的步骤跟上边的差不多,只是要设置bootcmd的参数


set bootcmd bootm 0x50000
save


为什么是bootm 0x50000呢,我查到相关文档是这样解释的:下载的uclinux_rom.bin这个文件是压缩格式的,所

以需要使用bootm解压运行.bootm是首先在地址0x50000解压uclinux_rom.bin文件,然后运行的.


补充:如果只是把uclinux_rom.bin文件下载到sdram中的话,那么输入命令:


bootm 0x0c008000


也可以进入uclinux的界面,不过掉电之后再上电就不能再次运行了. 
    
3.u-boot的网络地址的设置问题


设置主机IP地址:set serverip 192.168.1.111
设置板子IP地址:set ipadder  192.168.1.30


注意两者的网段要相同.


如果是set serverip 192.168.1.111 
set ipadder  192.168.0.30


那可就不行了,上次因为没搞清楚这个,不同网段的话靠交换机或者是交叉网线线连接主机跟目标板是不能

通信的,害我搞了1个小时才发现问题.下次不能犯这种错误了.


还有就是板子如果没有u-boot的话,板子不能插上网线,插了网线会导致宿舍的交换机出现问题,连在交换机

的机子不能上网.
 
4.关于使用串口下载


串口下载挺慢,所以我不推荐使用这种方法.我一开始就是使用串口来下载,不过我的机子好像不能使用这

种方法来下载程序,下载小的文件还行,要是下载大点的文件就老是中途出错,可能我的串口有点问题,当初

因为这个搞得我差点失去学习ARM的信心,还好找到使用网络下载的办法.不过在这里也介绍一下吧:


loadb 0x0c008000


然后在超级终端上使用keimit协议下载选择文件


go 0x0c008000   


系统分类: ARM   |    用户分类:    |    来源: 原创

评论(0) | 阅读(1452)
2下一页总共 , 当前 /