上周,国外一个网友说AVRUB在AT90CAN128上不能正常运行,希望我帮助解决一下。AT90CAN128这个芯片在国内用的比较少,在淘宝上找了半天,才发现有一家提供AT90CAN128核心板的,价格虽然不算低,但也没有其他选择了。于是订购了一块,昨天终于收到了板子。
一段时间没有用过AVR了,感觉有点生疏了。翻出以前自制的USB STK502编程器和USB 串口转换器,开始测试。
下载Bootloader到AT90CAN128后,发现可以使用avrub进行程序下载,只是下载后仍然提升等待命令,就是不能运行用户程序。开始以为像ATmega2560那样,程序不能正常跳转到用户程序。但是读取AT90CAN128中Flash后发现,用户程序虽然下载到Flash中,但是只有低字节成功写入,高字节都是0。
仔细查找AT90CAN128的数据手册,发现它并没有像ATmega2560那样的EIND寄存器,但是有一个RAMPZ寄存器。本来这个寄存器是用于控制访问外部RAM的,但是在AT90CAN128中,它用于控制ELPM/SPM指令访问Flash范围。在AT90CAN128中,RAMPZ寄存器只有bit0有效。
当RAMPZ0为0时,访问低64K范围的Flash;当RAMPZ0为1时,访问高64K的Flash。于是在Flash写入函数中,插入了RAMPZ设置。再测试,Bootloader就可以正常运行了。
改进后的程序在附件中,供大家参考。附件中还有几个小测试程序,用于测试Bootloader。例子中的Bootloader,占用2K words的Boot空间,起始地址从0xF800(word)开始。
文章评论(0条评论)
登录后参与讨论