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ファイルを関連付ける方法について説明します。