Keil + SimulinkはXcpキャリブレーションプロトコルA2Lファイルを生成します

Keil + SimulinkはXcpキャリブレーションプロトコルA2Lファイルを生成します

由于最近要为ECU移植XCP协议,所以记录一下,我使用的MCU为NXP S32K144,IDE选用MDK(官方IDE S32DS无代码联想功能,所以放弃,本来用vscode+ld+make来开发,但是发现还是用keil比较方便,具体方法,可以在S32DS生成外设配置,然后将Generated Code 拷贝到Keil中去,Keil中已自带S32K144官方驱动,但是版本较老,编译出错的地方需要及时修改),Xcp协议可以参考Vector 官方提供的Xcp_Basic SDK
  • Keilリンクスクリプト.sctファイル(S32K144_64_flash_user.sct)を定義します。使用方法については、他の記事を参照してS32Kメモリをパーティション分割してください。このファイルは、リンク後のフラッシュ可能およびデバッグファイルaxfまたはhexのメモリ分布を決定します。 MCU flash + ramは実行時に配布され、パーティション変数の特定のメモリアドレス情報も、A2Lファイルの生成に使用するためにコンパイルされた.mapファイルで提供されます。
  • ここでの目的は、測定変数(Measurement)とキャリブレーション変数(Characteristic)を別々のメモリパーティションに割り当てて、ホストコンピューターXcp_Masterによる管理とアドレス指定を容易にすることです。ここで、S32K P_Flashの2つのセクターは、キャリブレーション変数と測定変数用の2つの領域(Xcpリファレンスページに対応するロードアドレスLR_Adrrに対応)と、Ram上の2つの領域(Xcpに対応する動作アドレスER_Adrrに対応)に分割されます。作業ページ)
  • m_flash_upload_start 0x00001000測定フラッシュパーティションの開始アドレス、0x1000 = 4096/1024 = 4KB、S32Kの1つのセクターは4KBであるため、2番目のセクターです。
  • m_flash_upload_size0x00000800長さ2K
  • m_flash_cali_start 0x00001800 CharacteristicFlashパーティション、3番目のセクター
  • 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の変数はS32Kの初期化中にRamの対応する領域にコピーされます。プロセス。(keilコンパイラは独自のライブラリ関数を__main関数に追加して、MCUの電源がオンになったときにタスクを完了します。他のコンパイラの場合は、手動でコピーする必要がある場合があります)。読み取りと書き込みが可能(Ram)(前提は作業ページに切り替えることであり、参照ページの作業ページの定義はA2Lファイルに反映されます)が、Ram領域の電源がオフになり、失われるため、キャリブレーションプロセス中のバックアップにEEPROMを使用できます(一時的にS32Kビルトインを調整しませんでしたLRとERがすべてフラッシュ領域である場合、変数は読み取りのみが可能で書き込みはできません(フラッシュへのS32K書き込みは、場所が消去された状態であり、消去コマンドはセクターに基づいています。ワイプするには、セクター全体のみをワイプできます)。
#define  Upload_Section  __attribute__((section ("section_upload")))
#define  Cali_Section  __attribute__((section ("section_cali")))
  • 2つのマクロ定義を定義します。変数を定義して呼び出すたびに、変数を対応するセクション(LRとERを含むパーティション)に分割するようにコンパイラーに指示できます。
Upload_Section float me_Steerag_rate  = 2.0f ;
Cali_Section float ca_Para1  = 1.0f ;
  • 変数の例を定義します。ここでは2つのテスト変数を定義します。これら2つの変数の情報は.mapファイルに格納されるため、これら2つの変数の名前はA2Lの変数名に対応している必要があります。 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;
		}
  • パーティションは上記で定義されているため、Flashの変数をRamにコピーする前に、Ram領域をクリアする必要があります。このコードは、
    S32Kstartup.cのvoidinit_data_bss(void)関数で展開さます。

とりあえずMCU側で行う作業はこれだけです。次の記事では、最初にA2Lファイルを分析し、A2LファイルをSimulinkで生成し、コンパイラーによって生成された.mapファイルを関連付ける方法について説明します。

おすすめ

転載: blog.csdn.net/wangke2b/article/details/115264492