14 posts / 0 new
Last post
daniel59
Offline
Last seen:1 year 3 months ago
加入:2016-01-08 04:34
数组过大无法编译

我用OLED数模转换工具创建了一个很大的数组,把它放到代码里Keil无法Build。

请问有什么解决办法吗?我有外接一个1M的SPI FLASH。

Device:
CYibin
Offline
Last seen:4 months 3 weeks ago
工作人员
加入:2017-12-14 02:48
你好,

你好,

可预先将屏幕数据烧录到 FLASH 中。将该数组转化成 HEX 格式的文件,通过 SmartSnippets toolbox 烧录到 FLASH 的指定区域。程序运行之后,将其读出再送给屏幕即可。

daniel59
Offline
Last seen:1 year 3 months ago
加入:2016-01-08 04:34
您好!

您好!

想问一下如何转化为HEX文件呢?因为我是打算将固件直接烧录到FLASH去启动的,所以想问一下是否能修改keil的工程设置,使工程能够build成功呢?

CYibin
Offline
Last seen:4 months 3 weeks ago
工作人员
加入:2017-12-14 02:48
你好,

你好,

数组转化为 HEX 可在网上搜索到一些小工具来完成。我介绍的这种方式,是比较容易上手的。

也有稍微复杂,但之后会比较方便引用的方式:

你也可通过修改 keil 的分散加载文件 sct,指定一个区域用于保存数组数据,并在程序中将该数组指定链接到该区域。但是,程序里对该数组的访问,还是要通过读写外部 FLASH 的方式来进行,并且,你需要知道该数组实际对应的在 flash 中的位置。

以上方式需要你先了解内存分配,keil 链接文件配置等相关知识。

daniel59
Offline
Last seen:1 year 3 months ago
加入:2016-01-08 04:34
您好!

您好!

那若是将数组转化为HEX烧录到flash里,而后我又要讲固件烧到FLASH里通过spi启动程序,是应该先从0x20000000烧录固件再烧录FLASH吗?

CYibin
Offline
Last seen:4 months 3 weeks ago
工作人员
加入:2017-12-14 02:48
你好,

你好,

将数组起始地址分配到固件之后的位置,可通过 hex 合并工具,将两个 hex 文件合并为一个进行烧录

daniel59
Offline
Last seen:1 year 3 months ago
加入:2016-01-08 04:34
您好! 了解,我先进行尝试,如果还有问题再来咨询,谢谢您!

您好!

了解,我先进行尝试,如果还有问题再来咨询,谢谢您!

CYibin
Offline
Last seen:4 months 3 weeks ago
工作人员
加入:2017-12-14 02:48
好的,有问题随时可跟帖讨论

好的,有问题随时可跟帖讨论

daniel59
Offline
Last seen:1 year 3 months ago
加入:2016-01-08 04:34
您好!

您好!

我的程序好像无法读取FLASH……

我在想是否由于我板子上有一个SPI接口的加速度计芯片,而当时设计板子的时候又弄了2组SPI引脚,而导致FLASH无法读取?

引脚设定如下:
GPIO_ConfigurePin(ADXL_EN_GPIO_PORT, ADXL_EN_GPIO_PIN, OUTPUT, PID_SPI_EN, true);
GPIO_ConfigurePin(ADXL_CLK_GPIO_PORT, ADXL_CLK_GPIO_PIN, OUTPUT, PID_SPI_CLK, false);
GPIO_ConfigurePin(ADXL_DO_GPIO_PORT, ADXL_DO_GPIO_PIN, OUTPUT, PID_SPI_DO, false);
GPIO_ConfigurePin(ADXL_DI_GPIO_PORT, ADXL_DI_GPIO_PIN, INPUT, PID_SPI_DI, false);
GPIO_ConfigurePin(SPI_EN_GPIO_PORT, SPI_EN_GPIO_PIN, OUTPUT, PID_SPI_EN, true);
GPIO_ConfigurePin(SPI_CLK_GPIO_PORT, SPI_CLK_GPIO_PIN, OUTPUT, PID_SPI_CLK, false);
GPIO_ConfigurePin(SPI_DO_GPIO_PORT, SPI_DO_GPIO_PIN, OUTPUT, PID_SPI_DO, false);
GPIO_ConfigurePin(SPI_DI_GPIO_PORT, SPI_DI_GPIO_PIN, INPUT, PID_SPI_DI, false);

CYibin
Offline
Last seen:4 months 3 weeks ago
工作人员
加入:2017-12-14 02:48
你好,

你好,

SPI 外设只有一个。需要你软件上分时使用这两个硬件接口。

daniel59
Offline
Last seen:1 year 3 months ago
加入:2016-01-08 04:34
您好!

您好!

想问一下,是否能写1MB大的程序烧入Flash进行启动?还是说程序最大只能84kB?

CYibin
Offline
Last seen:4 months 3 weeks ago
工作人员
加入:2017-12-14 02:48
你好,

你好,

DA1458x 系列芯片程序需要拷贝到 ram 中运行。

580 具有 50kB 的 ram,所以一般采用 code(32kB) + data(12kB) 的组合方式。

585 具有 96kB 的 ram,所以一般采用 code(64kB) + data(32kB) 的组合方式。

DA1468x 系列芯片程序可通过 QSPI 接口,从 FLASH 运行;故代码量可不受 RAM 大小的限制。

daniel59
Offline
Last seen:1 year 3 months ago
加入:2016-01-08 04:34
您好!

您好!

感谢回复。

那就是说如果我是580+1MB flash,从flash启动的话,也只能用50kb,剩下的只能用作数据存储是吗?

CYibin
Offline
Last seen:4 months 3 weeks ago
工作人员
加入:2017-12-14 02:48
是的

是的