Keil + Simulink генерирует файл A2L протокола калибровки Xcp
由于最近要为ECU移植XCP协议,所以记录一下,我使用的MCU为NXP S32K144,IDE选用MDK(官方IDE S32DS无代码联想功能,所以放弃,本来用vscode+ld+make来开发,但是发现还是用keil比较方便,具体方法,可以在S32DS生成外设配置,然后将Generated Code 拷贝到Keil中去,Keil中已自带S32K144官方驱动,但是版本较老,编译出错的地方需要及时修改),Xcp协议可以参考Vector 官方提供的Xcp_Basic SDK
- Определите файл .sct сценария связи Keil (S32K144_64_flash_user.sct). О том, как его использовать, см. В других статьях, чтобы разделить память S32K. Этот файл определяет распределение памяти во флэш-файле и файле отладки axf или hex после связывания, а также Микроконтроллер flash + ram распространяется во время выполнения, и конкретная информация об адресе памяти переменной раздела также предоставляется в скомпилированном файле .map для использования при создании файлов A2L.
- Цель здесь состоит в том, чтобы выделить измеряемые переменные (Измерение) и калибровочные переменные (Характеристика) в отдельные разделы памяти для упрощения управления и адресации с помощью главного компьютера Xcp_Master. Здесь два сектора S32K P_Flash разделены на две области для калибровочных и измерительных переменных (соответствующие адресу загрузки LR_Adrr, соответствующему справочной странице Xcp) и две области на Ram (соответствующие рабочему адресу ER_Adrr, соответствующему Xcp. Рабочая страница)
- m_flash_upload_start 0x00001000 Измерение Начальный адрес раздела флэш-памяти, 0x1000 = 4096/1024 = 4 КБ, один сектор S32K составляет 4 КБ, поэтому это второй сектор
- m_flash_upload_size 0x00000800 длина 2К
- m_flash_cali_start 0x00001800 Характеристика Флэш-раздел, третий сектор
- m_flash_cali_size 0x00000400
#define m_interrupts_start 0x00000000
#define m_interrupts_size 0x00000400
#define m_flash_config_start 0x00000400
#define m_flash_config_size 0x00000010
#define m_flash_upload_start 0x00001000 //如果使能加解密功能,第一扇区不能保存数据(会被擦除)
#define m_flash_upload_size 0x00000800
#define m_flash_cali_start 0x00001800
#define m_flash_cali_size 0x00000400
#define m_text_start 0x00002000
#define m_text_size 0x0007E000
- Определение макроса в S32K144_64_flash_user.sct
LR_m_data_upload_Rom m_flash_upload_start m_flash_upload_size
{
ER_m_data_upload_Ram m_data_upload_start m_data_upload_size
{
* (section_upload)
}
}
LR_m_data_cali_Rom m_flash_cali_start m_flash_cali_size
{
ER_m_data_cali_Ram m_data_cali_start m_data_cali_size
{
* (section_cali)
}
}
- Разделение на секторы, пожалуйста, Baidu для адреса загрузки и рабочего адреса. Проще говоря, если переменная LR выделена для Flash, а ER - для Ram, переменные во Flash будут скопированы в соответствующую область Ram во время инициализации S32K. (компилятор keil добавит свою собственную библиотечную функцию в функцию __main для выполнения задачи при включении MCU. Если это другие компиляторы, возможно, потребуется скопировать вручную), чтобы измерение и калибровка переменных может быть прочитан и записан (Ram) (необходимо переключиться на рабочую страницу, определение рабочей страницы справочной страницы будет отражено в файле A2L), но область Ram отключена и потеряна, поэтому вы может использовать EEPROM для резервного копирования во время процесса калибровки (временно не настраивал встроенный S32K.Если LR и ER являются областями флэш-памяти, переменная может быть только прочитана, но не записана стертое состояние, а команда стирания основана на секторе. Чтобы стереть, можно стереть только весь сектор).
#define Upload_Section __attribute__((section ("section_upload")))
#define Cali_Section __attribute__((section ("section_cali")))
- Определите два определения макроса, каждый раз, когда вы определяете переменную, вызывайте ее, вы можете указать компилятору разделить переменную на соответствующий раздел (раздел, включая LR и ER).
Upload_Section float me_Steerag_rate = 2.0f ;
Cali_Section float ca_Para1 = 1.0f ;
- Определите пример переменной. Здесь определены две тестовые переменные. Следует отметить, что имена этих двух переменных должны соответствовать именам переменных A2L, потому что информация об этих двух переменных будет храниться в файле .map, и когда Simulink называется
asap2post(".a2l文件地址",".map文件地址")
- Он будет проиндексирован в соответствии с именем переменной, и соответствующий адрес в файле карты будет заполнен в соответствующей позиции файла A2L, как показано ниже 0X1FFF8000, 0X1FFF880 - это этот адрес
/begin CHARACTERISTIC
ca_Para1
"This is Gain"
VALUE
0x1FFF8800 //characeristic 这里不能写 ECU Address?
Scalar_FLOAT32_IEEE //如果定义了这个数据类型,则要定义record_layout
0
untitled_CM_single_None
-2.0
10.0
/end CHARACTERISTIC
/begin MEASUREMENT
me_Steerag_rate
"steer wheel angle"
FLOAT32_IEEE
untitled_CM_single_deg_S
0
0
-250.0
250.0
0x1FFF8000 //都不用写ECU Address
/end MEASUREMENT
/* 在MCU将ROM RW拷贝进ram之前,先将upload_ram ,cali_ram区清空,然后后面MCU会调用库将upload_rom(ldr adrr) cali_rom拷贝
进upload_ram(exc_adrr) cali_ram*/
uint32_t upload_ram_start=0x1fff8000;
uint32_t upload_ram_end=0x1fff8000+0x800;
while(upload_ram_start != upload_ram_end)
{
*((uint32_t *)upload_ram_start)=(uint32_t)0x00000000;
upload_ram_start=upload_ram_start+4;
}
uint32_t cali_ram_start=0x1fff8800;
uint32_t cali_ram_end=0x1fff8800+0x400;
while(cali_ram_start != cali_ram_end)
{
*((uint32_t *)cali_ram_start)=(uint32_t)0x00000000;
cali_ram_start=cali_ram_start+4;
}
- Поскольку раздел определен выше, область RAM должна быть очищена перед копированием переменных из Flash в Ram, и этот код увеличен в функции void
init_data_bss (void) в S32K startup.c
Работа, которую предстоит проделать на стороне MCU, - это только это пока.Следующая статья сначала проанализирует файл A2L и то, как сгенерировать файл A2L с Simulink и связать файл .map, сгенерированный компилятором.