Keil + Simulink genera el archivo A2L del protocolo de calibración Xcp

Keil + Simulink genera el archivo A2L del protocolo de calibración 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
  • Defina un archivo .sct de secuencia de comandos de enlace Keil (S32K144_64_flash_user.sct). En cuanto a cómo usarlo, consulte otros artículos para particionar la memoria S32K. Este archivo determina la distribución de la memoria en el archivo de depuración y flasheo axf o hexadecimal después del enlace, y El MCU flash + ram se distribuye en tiempo de ejecución, y la información de dirección de memoria específica de la variable de partición también se proporciona en el archivo .map compilado para su uso en la generación de archivos A2L.
  • El propósito aquí es asignar variables de medición (Medición) y variables de calibración (Característica) a particiones de memoria separadas para una fácil administración y fácil direccionamiento por parte de la computadora host Xcp_Master. Aquí, los dos sectores de S32K P_Flash se dividen en dos áreas para las variables de calibración y medición (correspondientes a la dirección de carga LR_Adrr, correspondiente a la página de referencia de Xcp), y dos áreas en Ram (correspondientes a la dirección de operación ER_Adrr, correspondiente a Xcp Página de trabajo)
  • m_flash_upload_start 0x00001000 Dirección de inicio de la partición flash de medición, 0x1000 = 4096/1024 = 4 KB, un sector de S32K es 4 KB, por lo que es el segundo sector
  • m_flash_upload_size 0x00000800 longitud 2K
  • m_flash_cali_start 0x00001800 Partición CharacteristicFlash, el tercer sector
  • 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
  • Definición de macro en 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)
	}
}
  • División de sector, por favor Baidu para la dirección de carga y la dirección de operación. En pocas palabras, si la variable LR se asigna a Flash y ER se asigna a Ram, las variables en Flash se copiarán en el área correspondiente de Ram durante la inicialización de S32K (El compilador keil agregará su propia función de biblioteca a la función __main para completar la tarea cuando la MCU esté encendida. Si se trata de otros compiladores, es posible que deba copiarse manualmente), de modo que la medición y calibración de las variables se puede leer y escribir (Ram) (La premisa es cambiar a la página de trabajo, la definición de la página de trabajo de la página de referencia se reflejará en el archivo A2L), pero el área de Ram se apaga y se pierde, por lo que puede usar EEPROM para respaldo durante el proceso de calibración (temporalmente no se ajustó el S32K incorporado Si LR y ER son todas áreas Flash, la variable solo se puede leer pero no escribir (S32K escribe en Flash debe garantizar que la ubicación esté en el estado borrado, y el comando de borrado se basa en el sector, para borrar, solo se puede borrar todo el sector).
#define  Upload_Section  __attribute__((section ("section_upload")))
#define  Cali_Section  __attribute__((section ("section_cali")))
  • Defina dos definiciones de macro, cada vez que defina una variable, llámela, puede decirle al compilador que divida la variable en la Sección correspondiente (partición, incluidas LR y ER).
Upload_Section float me_Steerag_rate  = 2.0f ;
Cali_Section float ca_Para1  = 1.0f ;
  • Definir el ejemplo de variable. Aquí se definen dos variables de prueba. Cabe señalar que los nombres de estas dos variables deben corresponder a los nombres de variable de A2L, porque la información de estas dos variables se almacenará en el archivo .map, y cuando Simulink se llama
asap2post(".a2l文件地址",".map文件地址")
  • Se indexará de acuerdo con el nombre de la variable, y la dirección correspondiente en el archivo de mapa se completará en la posición correspondiente del archivo A2L, de la siguiente manera 0X1FFF8000, 0X1FFF880 es esta dirección
	/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;
		}
  • Dado que la partición se define anteriormente, el área de Ram debe borrarse antes de copiar las variables en Flash a Ram, y este código se amplía en la función void
    init_data_bss (void) en el inicio de S32K.

El trabajo a realizar en el lado de MCU es solo este por el momento. El próximo artículo analizará inicialmente el archivo A2L y cómo generar el archivo A2L con Simulink y asociar el archivo .map generado por el compilador.

Supongo que te gusta

Origin blog.csdn.net/wangke2b/article/details/115264492
Recomendado
Clasificación