zoukankan      html  css  js  c++  java
  • 用DNW下载led的裸机程序

    用DNW下载led裸机程序

    本文用Uboot中提供的DNW命令工具下载可执行bin文件到SRAM中,没有写入flash所以掉电丢失,用于代码调试比较方便

    1、连接好串口线和USB数据线

    2、打开PC端 DNW 软件,设置好串口端口,波特率设置为:115200,设置USB Prot: Download Address:  0x57e00000 。

    3、 DNW 工具栏(Serial Port ->Connect)。 按住空格键, 启动开发板,进入Uboot状态。  

    4、在 DNW 窗口中输入:dnw  0x50008000 ,设置下载的地址

    5、会提示你准备传送文件,从DNW的usbport->Transmit->Transmit发送bin文件, DNW 会自动下载。  

    6、在 DNW 窗口中输入: go  0x50008000 ,即进入程序运行状态

     

    下面给出在OK6410a上跑led流水灯和ds18b20温度器裸机代码的例子,

    期中打印信息用的pr print = (pr)0xc7e12914;要从编译uboot时生成的 System.map文件中查找得到相应的值

    /*--------------------------------------------------------------------------------------
    * Author : xuetongs
    * Created Date : 2015/7/13  
    * QQ:287203960

    *       led跑马灯裸机代码
    **************************************************************************************/

    #define rGPMCON          (*(volatile unsigned *)(0x7F008820))
    #define rGPMDAT          (*(volatile unsigned *)(0x7F008824))
    #define rGPMPUD          (*(volatile unsigned *)(0x7F008828))
    typedef void (*pr)(const char *fmt, ...);
    void GPIO_Init(void);
    void LedTest(void);
    void Main(void)
    {
    pr print = (pr)0xc7e12914;
    GPIO_Init();
    print("GPIO_Init() ");
    LedTest();
    print("LedTest() ");
    }
    void msDelay(int time)
    {
        unsigned int i,j;
        for(i = 0; i < 2000000; i++)
        for(j=0; j<time; j++);
    }
    void GPIO_Init(void)
    {
    rGPMCON  = 0x11111;
    rGPMPUD  = 0x00;
    rGPMDAT  = 0x10;
    }
    void LedTest(void)
    {
    pr print = (pr)0xc7e12914;
    volatile unsigned int i;
    while (1)
    {
    for(i=0; i<4; i++)
    {
    rGPMDAT  = ~(1<<i);
    msDelay(1);
    print("wait... ");
    }
    }
    }

    /*--------------------------------------------------------------------------------------
    * Author : xuetongs
    * Created Date : 2015/7/13  
    * QQ:287203960

    * ds18b20 裸机代码
    **************************************************************************************/
    #define rGPPCON (*(volatile unsigned *)(0x7F008080))
    #define rGPPDAT (*(volatile unsigned *)(0x7F008084))
    #define Set18b20IOout() (rGPPCON |= 0x01)
    #define Set18b20IOin() (rGPPCON &= (~0xf))
    #define Read18b20IO() ((rGPPDAT & 0x01) ? 1 : 0)
    #define Write18b20IO(x) (x ? (rGPPDAT |= 0x01) : (rGPPDAT &= (~0x01)))
    #define PCLK 66000000  // forS3C6410 66MHZ
    #define HCLK 133000000 // forS3C6410 133MHZ
    #define rTCFG0                (*(volatile unsigned*)(0x7F006000))
    #define rTCFG1                (*(volatile unsigned*)(0x7F006004))
    #define rTCNTB2               (*(volatile unsigned*)(0x7F006024))
    #define rTCON                 (*(volatile unsigned*)(0x7F006008))
    #define rTCNTO2               (*(volatile unsigned*)(0x7F00602c))
    typedef void (*pr)(const char *fmt, ...);
    void Delay_US(int a);
    void DS18B20_WriteData(unsigned char data);
    unsigned char DS18B20_ReadData(void); 
    unsigned char DS18B20_Reset(void);  
    int main(void)
    {
    unsigned char th, tl;
    short int data;
    pr print = (pr)0xc7e12914;
    while(1) 

    if(DS18B20_Reset())   

    print("first reset field "); 
    return 0xffff;
    }
    Delay_US(5);
    DS18B20_WriteData(0xcc);
    DS18B20_WriteData(0x44);
    if(DS18B20_Reset())
    {
    print("second reset field ");
    return 0xffff;
    }; 
    Delay_US(5);
    print("reset ok "); 
    DS18B20_WriteData(0xcc);
    DS18B20_WriteData(0xbe);
    tl = DS18B20_ReadData();
    th = DS18B20_ReadData();
    data = th;  
    data <<= 8;  
    data |= tl;  
    data = data*625/100;
    print("result = %d ",data);
    Delay_US(1000);
    }
    return 0;
    }
    void Delay_US(int usec)
    {
    unsigned int val=(PCLK)/1000000-1; 
    rTCFG0 &= ~(0xff<<8);
    rTCFG0 |= 0<<8; 
    rTCFG1 &= ~(0xf<<8); 
    rTCFG1 |= 0<<8;
    rTCNTB2 = val; 
    rTCON&=~(0xf<<12); 
    rTCON|=0xb<<12;
    rTCON&=~(2<<12); 
    while(usec--)

    while(rTCNTO2 >= val>>1);
    while(rTCNTO2 < val>>1);
    };
    }
    void DS18B20_WriteData(unsigned char data)
    {
    unsigned char i=0;
    Set18b20IOout();
    for(i=0;i<8;i++)
    {
    Write18b20IO(0);
    Delay_US(12);
    Write18b20IO(data & 0x01);
    Delay_US(30);
    Write18b20IO(1);
    data >>= 1;
    Delay_US(2);
    }
    }
    unsigned char DS18B20_ReadData(void)
    {  
        unsigned char i=0,data = 0;  
          
        for(i=0;i<8;i++)  
        {  
            Set18b20IOout();
            Write18b20IO(0);
            data >>= 1;  
            Delay_US(4);  
            Write18b20IO(1);
            Set18b20IOin();
            Delay_US(6);  
            if(Read18b20IO())
                data |= 0x80;  
            Delay_US(55);  
        }  
        return data;  
    }
    unsigned char DS18B20_Reset(void)
    {  
        unsigned char i = 0;  
        Set18b20IOout();    //主机端口推挽输出模式  
        Write18b20IO(1);  
        Delay_US(1);  
        Write18b20IO(0);    //拉低总线480us~240us  
        Delay_US(500);      //>480US延时  
        Write18b20IO(1);  
        Delay_US(60);        //复位完成  
        Set18b20IOin();     //主机端口浮空输入模式  
        while(Read18b20IO())    //等待低电平应答信号  
        {  
            i++;  
            Delay_US(1);  
            if(i > 100)  
            {
    pr print = (pr)0xc7e12914;
    print("reset failed and return 1 ");
    return 1;
    }
        }  
        Delay_US(250);          //跳过回复信号  
        return 0x00;
    }

    主动一点,世界会更大!
  • 相关阅读:
    JavaScript匿名函数的使用
    __construct __destory __call __get __set
    嵌入式学习
    动态加载script文件
    Android框架Volley使用:Post请求实现
    Android框架Volley使用:Get请求实现
    安卓开发笔记(三十五):Cardview的简单使用
    安卓开发笔记(三十四):Material Design框架实现优美的左侧侧滑栏
    Android APK反编译技巧全讲解
    Java数据结构(一):栈
  • 原文地址:https://www.cnblogs.com/sweet-li/p/13616761.html
Copyright © 2011-2022 走看看