我正在使用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时有效。
如果您知道解决方法,请告诉我。 谢谢您的答复。
答案 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
写入寄存器。
答案 1 :(得分:0)
您需要在FLASH的原始开头放置8个字节。 Stm32始终从地址0x00000000引导,该地址是别名之一的存储器(取决于启动引脚和选项)。
第一个单词包含堆栈指针,第二个单词包含您的重置处理程序。您永远不会获得代码,因为它总是从同一地址引导。
您将需要修改链接描述文件和定义了矢量的启动文件
答案 2 :(得分:0)
您还可以编写一个引导程序。 Bootloader位于0x0800 0000地址上,并加载您的应用程序固件,这意味着跳转到该地址。
这是另一种方法。