用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()\n");
LedTest();
print("LedTest()\n");
}
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...\n");
}
}
}

/*--------------------------------------------------------------------------------------
* 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\n"); 
return 0xffff;
}
Delay_US(5);
DS18B20_WriteData(0xcc);
DS18B20_WriteData(0x44);
if(DS18B20_Reset())
{
print("second reset field\n");
return 0xffff;
}; 
Delay_US(5);
print("reset ok\n"); 
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\n",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\n");
return 1;
}
    }  
    Delay_US(250);          //跳过回复信号  
    return 0x00;
}

posted @ 2020-09-04 23:48  sweet_li  阅读(240)  评论(0编辑  收藏  举报