打印

boothloader问题请教……

[复制链接]
2433|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
(放在PIC单片机版块不行啊,看了都没人回,还是要来侃单片机啊)小弟最近在用PIC16F876A玩boothloader,但是发现boothloader和我理解相差甚远啊。我以为只要把程序写进flash中,然后把PC指针指向程序开始的flash地址就OK了。
可是实际差远了。我把一个简单点亮LED的程序的opcode代码写进了flash中,然后把PC指针指向我写的flash开始地址。现在有3个问题:

第一:不管我怎么改PC的指针都不会指向我写的flash地址(我尝试过很多方法改变PC的指针,例如:1.PCL = 0xxx;2.asm("goto 0xXX")……)
第二:我烧写的是机器码,暂时不是hex,行不行?仿真的时候,我看见程序都烧进去flash中了。而且还用flash读出来了,都是对的。也就是说我现在只是基本实现了flash的读写。
第三:没有没那个大侠可以我一个boothloader的实例程序啊?让我学学啊……PICC中例子,我看的不是很明白
本人比较菜,望高手指点!

相关帖子

沙发
NE5532| | 2012-5-13 08:24 | 只看该作者
从楼主写C语言这点上来推断,楼主尚未理解单片机底层的运行机制,建议先恶补半年以上汇编再来玩。Boot更新的肯定是主程序,是上电执行的那部分程序,不需要PC指针单独跳转,跳转的是BOOT程序,一个goto或者call就解决问题了。

机器码和HEX之间的关系我实在没看出来,HEX文件里的数据就是机器码啊,楼主是基本概念搞混了吧。

使用特权

评论回复
板凳
小鱼儿1045|  楼主 | 2012-5-13 12:46 | 只看该作者
2# NE5532
NE5532版主的意思是用汇编写bootloader吗?你的意思是每次上电的时候是goto到bootloader的地方吗?

使用特权

评论回复
地板
NE5532| | 2012-5-13 13:22 | 只看该作者
这个跟单片机的具体结构还有关系,不过用汇编是最好的,C存在调用的问题,很容易搞死机。

使用特权

评论回复
5
ningling_21| | 2012-5-13 15:58 | 只看该作者
LZ理解的BOOTLOADER是怎样的呢?

使用特权

评论回复
6
小鱼儿1045|  楼主 | 2012-5-13 17:32 | 只看该作者
5# ningling_21
我理解的bootloader是在flash中一段程序,上电就执行这段程序,如果有程序更新,就把新的程序写进flash中,然后把PC指针指向刚刚写的flash起始地址。,是不是这样啊?
周边没人搞单片机,所以很多问题都要自己解决,没人商量。很无奈。谢谢啊!

使用特权

评论回复
7
小鱼儿1045|  楼主 | 2012-5-13 17:35 | 只看该作者
4# NE5532
NE5532有关于PICbootloader的例子吗?能给我学习学习吗?

使用特权

评论回复
8
NE5532| | 2012-5-13 19:30 | 只看该作者
没有,我只有AVR的,不过我知道BOOT的基本原理是一样的。

使用特权

评论回复
9
小鱼儿1045|  楼主 | 2012-5-13 23:41 | 只看该作者
8# NE5532
那能给我一份吗?我学习学习。谢谢了……
xiaoyuren1045@sina.com

使用特权

评论回复
10
原野之狼| | 2012-5-14 09:40 | 只看该作者
现在有3个问题:
第一:不管我怎么改PC的指针都不会指向我写的flash地址(我尝试过很多方法改变PC的指针,例如:1.PCL = 0xxx;2.asm("goto 0xXX")……)
改变PC指针,请使用汇编指令来实现,具体看对应芯片的的指令规范以及编译期的文档。
第二:我烧写的是机器码,暂时不是hex,行不行?仿真的时候,我看见程序都烧进去flash中了。而且还用flash读出来了,都是对的。也就是说我现在只是基本实现了flash的读写。
BIN和HEX无本质区别,只是描述方式的差异。你这里的读写应该是编程器替你实现的。
第三:没有没那个大侠可以我一个boothloader的实例程序啊?让我学学啊……PICC中例子,我看的不是很明白
既然都有例子了,那就好好研究一下吧。

使用特权

评论回复
11
小鱼儿1045|  楼主 | 2012-5-14 15:30 | 只看该作者
10# 原野之狼
但是PICC的例子,我怎么用,都没有用起来啊!它的例子我看了,基本知道些思路,但是用不起来。所以想找个能有的实例程序看看!

使用特权

评论回复
12
小鱼儿1045|  楼主 | 2012-5-14 20:47 | 只看该作者
还是直接上程序吧,这样直观一点,也方便大家指出小弟的不足和误区。
先说明几点:1、我的bootloader区设置在1F00----1FFF这段区间,如下图:


                     2、现在程序能实现上电的时候通过下图四句实现跳转到BootStar

                     3、但是现在的问题是我现在通过写flash,把程序写进了0200H的地址处,
                           想通过改变PCL的指针来跳转到0200H的地方执行,但是PC指针老是不对
                          下图是点亮一个LED的机器码。

                     4、求大侠们看看我这个粗略的程序有什么问题啊。谢谢了……
/******************************************************************/
//项目时间:2012/5/7
//程序功能:PIC实现简单的bootloader
//芯片型号:PIC16F877A
//晶振频率:20M
//程序备注:MPLAB IDE V8.33 ------ PICC V8.05
/*****************************************************************/
#include<pic.h>
#define uint8  unsigned char
#define uint16 unsigned int
#define RX_PIN  TRISC7
#define TX_PIN  TRISC6

uint8 DataH,DataL;
const uint8 FlashData[] = {0x01,0x83,0x30,0x02,0x00,0x8a,0x28,0xe4,0x01,0x83,
0x12,0x0a,0x11,0x8a,0x2f,0xfa,0x16,0x83,0x13,0x03,0x10,0x88,0x12,0x83,
0x10,0x88,0x2f,0xff,0x3f,0xff,0x3f,0xff};//点亮一个LED灯
/*****************************************************************/
//函数名称:void USART_init(void)
//功能描述:串口通信初始化
//全局变量:无
//参数说明:无
//返回说明:无
//程序说明:波特率9600 高速
/*****************************************************************/
void USART_init(void)
{
RX_PIN = 1;
TX_PIN = 1;
SPBRG = 0x81; //9600 20M
RCSTA = 0x90;
TXSTA = 0x24;
}
/*****************************************************************/
//函数名称:void PutChar(uint8 byte)
//功能描述:输出单字符
//全局变量:无
//参数说明:byte,要输出的数据
//返回说明:无
//程序说明:无
/*****************************************************************/
void PutChar(uint8 byte)
{
while(!TXIF);
TXREG = byte;
}
/*****************************************************************/
//函数名称:void PutString(const char *s)
//功能描述:输出字符串
//全局变量:无
//参数说明:S,要输出的字符串
//返回说明:无
//程序说明:无
/*****************************************************************/
void PutString(const char *s)
{
while(s && *s)
  PutChar(*s ++);
}
/*****************************************************************/
//函数名称:void Flash_Read(uint8 address)
//功能描述:输出单字符
//全局变量:无
//参数说明:uint8 MS_EEADR,地址高字节;uint8 LS_EEADR,地址低字节
//返回说明:无
//程序说明:无
/*****************************************************************/
void Flash_Read(uint8 MS_EEADR,uint8 LS_EEADR)
{
uint8 cnt;
for(cnt = 0;cnt < 16;cnt ++)
{
  EEADRH = MS_EEADR;
  EEADR = LS_EEADR;
  EEPGD = 1;   //Point to Program Memory
  RD = 1;    //EE Read Enable
  asm("nop");
  asm("nop");
  DataL = EEDATA;
  DataH = EEDATH;
  LS_EEADR++;
  PutChar(DataH);
  PutChar(DataL);
}
}
/*****************************************************************/
//函数名称:void Flash_Write(uint8 MS_EEADR,uint8 LS_EEADR)
//功能描述:输出单字符
//全局变量:无
//参数说明:uint8 MS_EEADR,数据高字节;uint8 LS_EEADR,数据低字节
//返回说明:无
//程序说明:无
/*****************************************************************/
void Flash_Write(uint8 MS_EEADR,uint8 LS_EEADR)
{
uint8 cnt;
for(cnt = 0;cnt < 16;cnt ++)
{
  EEADRH = MS_EEADR;
  EEADR = LS_EEADR;
  EEDATA = FlashData[cnt*2+1];
  EEDATH = FlashData[cnt*2];
  EEPGD = 1;
  WREN = 1;
  EECON2 = 0x55;
  EECON2 = 0xAA;
  WR = 1;
  asm("nop");
  asm("nop");
  while(WR);
  LS_EEADR ++;
  WREN = 0;
}
}
/*****************************************************************/
//函数名称:void main(void)
//功能描述:主函数
//程序说明:BootStart 1F00 ------ BootStop 1FFF
/*****************************************************************/
void main(void)
{
USART_init();
//PutString("Bootloader is running now!\n");
PutChar(':');
Flash_Write(0x02,0x00);
// Flash_Read(0x00,0xE0);
#asm   //想将PC指针指向0200H的应用程序地址,可是PC指针不对
movlw 0x02
movwf 0x0a  //PCLATH
movlw 0x00
movwf 0x02  //PCL
#endasm
while(1);
}
#asm
; Reset vector redirection
; some equates for accessing the program counter
PCL equ 02h  
PCLATH equ 0Ah
psect redirect,abs,class=CODE,delta=2 ;absolute psect so it goes
      ;to address zero

;The boot loader code has been written so that it doesn't need any
;variable initialization runtime startup code.
;Because of this, we can jump directly into the main() function.
global _main  
movlw _main >> 8 ;A "long" jump to main - this will cope with
movwf PCLATH  ;main being positioned anywhere
movlw _main & 0xFF
movwf PCL
#endasm

使用特权

评论回复
13
ningling_21| | 2012-5-14 21:20 | 只看该作者
用C不太容易实现绝对地址的跳转,还是用汇编实现吧...

使用特权

评论回复
14
小鱼儿1045|  楼主 | 2012-5-14 21:32 | 只看该作者
13# ningling_21
那我的bootloader程序框架对吗?

使用特权

评论回复
15
小鱼儿1045|  楼主 | 2012-5-15 14:43 | 只看该作者
别沉了啊,各位帮帮忙!顶一下啊!大神们!

使用特权

评论回复
16
ningling_21| | 2012-5-15 18:01 | 只看该作者
13# ningling_21  
那我的bootloader程序框架对吗?
小鱼儿1045 发表于 2012-5-14 21:32
思路基本正确.

使用特权

评论回复
17
小鱼儿1045|  楼主 | 2012-5-16 22:02 | 只看该作者
我再顶!
现在的进展是:如果我程序写在flash中263H的位置,然后PC指针指向200H,程序就可以运行。因为我发现每次指针跳转的时候都会自动在我赋值的地址多在63H个地址,我一直不知道为什么?PICC编译器有什么内涵吗??

我要一直顶,不能沉了,直到程序匠人来看看才行!我知道他也玩过PIC的。
顶!顶!顶!

使用特权

评论回复
18
小鱼儿1045|  楼主 | 2012-5-17 20:23 | 只看该作者
难道就没有高手玩过??
我在顶!

使用特权

评论回复
19
paozhuanyinyuge| | 2012-5-17 20:48 | 只看该作者
学习了。。。。

使用特权

评论回复
20
小鱼儿1045|  楼主 | 2012-5-18 22:37 | 只看该作者
顶!没有玩过bootloader吗??

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

70

主题

1965

帖子

19

粉丝