如何更改Flash的起始地址?

时间:2019-07-05 03:58:50

标签: stm32 stm32f4discovery stm32f7 stm32f0

我正在使用STM32F746ZG和FreeRTOS。 Flash的起始地址为0x08000000。但我想将其更改为0x08040000。我已经通过Google搜索了此问题,但没有找到解决方案。

我如下更改了链接脚本。

MEMORY
{
RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 320K
/* FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 1024K */
FLASH (rx)      : ORIGIN = 0x8040000, LENGTH = 768K
}

如果仅更改它并运行调试器,则它有问题。 如果我将VECT_TAB_OFFSET从0x00更改为0x4000,则可以正常工作。

/* #define VECT_TAB_SRAM */
#define VECT_TAB_OFFSET  0x40000  /* 0x00 */

SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; 

但是,如果我不使用调试器,它将无法正常工作。 这意味着它仅在使用ST-Linker时有效。

如果您知道解决方法,请告诉我。 谢谢您的答复。

3 个答案:

答案 0 :(得分:3)

引导地址可以在选项字节中设置。

您可以以16k的增量设置闪存中的任何地址。选项字节区域中有两个16位寄存器,一个在复位时引导引脚为低电平时使用,另一个在该引脚为高电平时使用。写入所需的地址,该地址右移14位,即除以16384。

要从 testDt = GetTestDate(); var data2 = testDt.Tables[0].AsEnumerable().Select(x => new { Family = x.Field<int>("tdFamily"), Class = x.Field<short>("luClass"), Region = x.Field<short>("luRegion"), Year = x.Field<int>("tdYear"), Population = x.Field<decimal>("tdPopulation ") }); DataTable pivotDataTable = data2.ToPivotTable( item => item.Year, item => new{ item.Family, item.Class, item.Region}, items => items.Any() ? items.Sum(x => x.Allocation) : 0 ); public static DataTable ToPivotTable<T, TColumn, TRow, TData>( this IEnumerable<T> source, Func<T, TColumn> columnSelector, Expression<Func<T, TRow>> rowSelector, Func<IEnumerable<T>, TData> dataSelector) { DataTable table = new DataTable(); var rowsName = ((NewExpression)rowSelector.Body).Members.Select(s => s).ToList(); foreach (var row in rowsName) { var name = row.Name; table.Columns.Add(new DataColumn(name)); } var columns = source.Select(columnSelector).Distinct(); foreach (var column in columns) table.Columns.Add(new DataColumn(column.ToString())); var rows = source.GroupBy(rowSelector.Compile()) .Select(rowGroup => new { Key = rowGroup.Key, Values = columns.GroupJoin( rowGroup, c => c, r => columnSelector(r), (c, columnGroup) => dataSelector(columnGroup)) }); foreach (var row in rows) { var dataRow = table.NewRow(); var items = row.Values.Cast<object>().ToList(); string[] keyRow = row.Key.ToString().Split(','); int index = 0; foreach (var key in keyRow) { string keyValue = key.Replace("}", "").Split('=')[1].Trim(); items.Insert(index, keyValue); index++; } dataRow.ItemArray = items.ToArray(); table.Rows.Add(dataRow); } return table; } } 引导,请按照参考手册的选项字节编程一章中的说明,将0x08040000写入寄存器。

enter image description here

答案 1 :(得分:0)

您需要在FLASH的原始开头放置8个字节。 Stm32始终从地址0x00000000引导,该地址是别名之一的存储器(取决于启动引脚和选项)。

第一个单词包含堆栈指针,第二个单词包含您的重置处理程序。您永远不会获得代码,因为它总是从同一地址引导。

您将需要修改链接描述文件和定义了矢量的启动文件

答案 2 :(得分:0)

您还可以编写一个引导程序。 Bootloader位于0x0800 0000地址上,并加载您的应用程序固件,这意味着跳转到该地址。

这是另一种方法。