在Arduino上运行多个草图 解决方案1 ​​解决方案2

问题描述

我目前正在使用在带有附加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上工作。但是,它仅在启用引导复位向量的情况下起作用。我不确定导致此问题的原因,但现在可以解决。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...