您的位置:首页 > 其它

OK6410用DNW下载led和ds18b20的裸机程序

2016-01-03 21:23 393 查看
本文用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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  OK6410a ds18b20 led 裸机