Keil + Simulink génère le fichier A2L du protocole d'étalonnage Xcp

Keil + Simulink génère le fichier A2L du protocole d'étalonnage 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
  • Définissez un fichier .sct de script de lien Keil (S32K144_64_flash_user.sct). Pour savoir comment l'utiliser, veuillez vous reporter à d'autres articles sur la partition de la mémoire S32K. Ce fichier détermine la répartition de la mémoire dans le fichier flashable et déboguer axf ou hex après la liaison, Le MCU flash + ram est distribué au moment de l'exécution, et les informations d'adresse mémoire spécifiques de la variable de partition sont également fournies dans le fichier .map compilé pour une utilisation dans la génération de fichiers A2L.
  • Le but ici est d'allouer des variables de mesure (Mesure) et des variables d'étalonnage (Caractéristique) à des partitions de mémoire séparées pour une gestion facile et un adressage facile par l'ordinateur hôte Xcp_Master. Ici, les deux secteurs de S32K P_Flash sont divisés en deux zones pour les variables d'étalonnage et de mesure (correspondant à l'adresse de charge LR_Adrr, correspondant à la page de référence Xcp), et deux zones sur Ram (correspondant à l'adresse d'exploitation ER_Adrr, correspondant à Xcp Page de travail)
  • m_flash_upload_start 0x00001000 Adresse de début de la partition Flash de mesure, 0x1000 = 4096/1024 = 4 Ko, un secteur de S32K est de 4 Ko, il s'agit donc du deuxième secteur
  • m_flash_upload_size 0x00000800 longueur 2K
  • m_flash_cali_start 0x00001800 Partition CharacteristicFlash, le troisième secteur
  • 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
  • Définition de macro dans 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)
	}
}
  • Division du secteur, veuillez Baidu pour l'adresse de chargement et l'adresse de fonctionnement. En termes simples, si la variable LR est allouée à Flash et ER est allouée à Ram, les variables de Flash seront copiées dans la zone correspondante de Ram lors de l'initialisation du S32K (Le compilateur keil ajoutera sa propre fonction de bibliothèque à la fonction __main pour terminer la tâche lorsque le MCU est mis sous tension. S'il s'agit d'autres compilateurs, il peut être nécessaire de le copier manuellement), de sorte que la mesure et l'étalonnage des variables peut être lu et écrit (Ram) (Le principe est de passer à la page de travail, la définition de la page de travail de la page de référence sera reflétée dans le fichier A2L), mais la zone Ram est mise hors tension et perdue, vous peut utiliser l'EEPROM pour la sauvegarde pendant le processus d'étalonnage (n'a pas temporairement ajusté le S32K intégré Si LR et ER sont tous des zones Flash, la variable ne peut être lue mais pas écrite (S32K écrit dans Flash doit s'assurer que l'emplacement est dans le effacé, et la commande d'effacement est basée sur le secteur, Pour effacer, seul le secteur entier peut être effacé).
#define  Upload_Section  __attribute__((section ("section_upload")))
#define  Cali_Section  __attribute__((section ("section_cali")))
  • Définissez deux définitions de macro, chaque fois que vous définissez une variable, appelez-la, vous pouvez dire au compilateur de diviser la variable dans la section correspondante (partition, y compris LR et ER).
Upload_Section float me_Steerag_rate  = 2.0f ;
Cali_Section float ca_Para1  = 1.0f ;
  • Définissez l'exemple de variable. Deux variables de test sont définies ici. Il faut noter que les noms de ces deux variables doivent correspondre aux noms de variables d'A2L, car les informations de ces deux variables seront stockées dans le fichier .map, et lorsque Simulink est appelé
asap2post(".a2l文件地址",".map文件地址")
  • Elle sera indexée en fonction du nom de la variable, et l'adresse correspondante dans le fichier de carte sera renseignée à la position correspondante du fichier A2L, comme suit 0X1FFF8000, 0X1FFF880 est cette adresse
	/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;
		}
  • Puisque la partition est définie ci-dessus, la zone Ram doit être effacée avant de copier les variables du Flash vers Ram, et ce code est agrandi dans la fonction void
    init_data_bss (void) dans S32K startup.c

Le travail à faire côté MCU n'est que cela pour le moment.Le prochain article analysera dans un premier temps le fichier A2L et comment générer le fichier A2L avec Simulink et associer le fichier .map généré par le compilateur.

Je suppose que tu aimes

Origine blog.csdn.net/wangke2b/article/details/115264492
conseillé
Classement