用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;
}