Keil + Simulink генерирует файл A2L протокола калибровки Xcp

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, сгенерированный компилятором.

рекомендация

отblog.csdn.net/wangke2b/article/details/115264492
рекомендация