问题描述
我目前正在使用在带有附加TFT显示屏的ATMEGA644P上运行的定制板。我想在其上运行两个单独的草图,其中一个草图是用C语言编写的复杂的开源代码,另一个是我自己在Arduino中编写的代码。两者结合起来非常复杂且耗时,因为它们不在同一核心库上运行。
我的意图是将两个十六进制格式的草图上传到板上,并具有一个选择器开关,该选择器开关将根据开关的状态启动到正确的草图中。我研究了一些解决方案,但似乎没有一个完全适合我的需要,以下是我研究过的解决方案:
解决方案1
使用乔恩·麦克基(Jon Mackey)的AVRmultisketch。
这使用一个可编译多个ino文件的自定义应用程序和一个选择器草图,其中选择器草图将在内存中设置该草图的起始地址。主要问题是我的草图之一无法以ino格式提供。
解决方案2
从SD卡引导。
由于板上已装有SD卡,我想知道是否可以将两个十六进制文件都存储在SD卡中,并使用自定义草图或引导加载程序来选择要使用的草图。不幸的是,我找不到很多关于此的文档。大多数方法都显示了如何直接从SD卡上传草图,而无需任何选择过程。
我可以使用任何指南或方法来实现自己的目标吗?
解决方法
所以我不确定这是唯一的还是最好的方法,但是我设法通过使用avr_boot引导程序来做到这一点,该引导程序将在引导时从SD卡上载一个草图。我已经用arduino nano(ATMEGA328P)成功地对其进行了测试。
首先,确保可以编译默认文件。然后根据指南修改Makefile。可以通过将启动地址乘以2来计算启动地址,例如ATMEGA328P的启动地址,其中高熔丝位设置为0xD8为0x7000。还要记下SD卡的CS引脚。
然后修改第39行的main.c文件
const char filename[13] ="FIRMWARE.BIN\0";
与此
const char filename1[14] ="FIRMWARE1.BIN\0"; // EDIT FILENAME HERE
const char filename2[14] ="FIRMWARE2.BIN\0";
您可以使用任何想要的文件名,只需确保它们全部为大写且不占用数组大小即可。 然后替换此行194
fresult = pf_open(filename);
与此
DDRB &= ~(1 << PB1);
if ((PINB & (1 << PB1))) /* test button pressed */
{
fresult = pf_open(filename1);
}else{
fresult = pf_open(filename2);
}
我正在使用PB1作为选择器引脚。因此,它将在高时打开filename1,在低时打开filename2。现在,每次启动芯片时,它将检查PB1的状态并从SD卡上载正确的草图。这可能需要一些时间,具体取决于草图的大小。它还会消耗PROGRAM MEMORY 10000写周期,无论如何这都是很多的。可能的解决方法是通过将高熔丝位设置为0xD9来禁用启动复位向量。这将使其仅在按下重置按钮时才进入引导加载器,而不是在开机时进入引导加载器。
我也设法通过正确的配置在ATMEGA644PA上工作。但是,它仅在启用引导复位向量的情况下起作用。我不确定导致此问题的原因,但现在可以解决。