FSPではTimers:GPTとTimers:GPT_POEGの両方にGTETRGnが存在しています。
それぞれペリフェラルとしてはPOEGとGPTの信号となるのでしょうけどGTETRGn信号はGPTとPOEGで共有しているのでしょうか?それとも独立した信号で同じ名前を割り当ててしまっているだけでしょうか?この質問をした意図としては信号幅計測でGTETRGCを使い、同じく、GTETRGCでGTPのPWM出力を止めるということをしたいためです。
FSPの端子機能タブ上で割り当て可能なピンが違うので同じ名前でも違うと思いますが、RA6T2の100ピンのものを例えに
・GTPのGTETRGCをPE08に割り当てる
・POEGのGTETRGCをPD10に割り当てる
としてGTPのPE08の信号ON幅の時間計測とPOEGのPD10からくるエラー信号にともなうGTPのPWM信号出力停止処理などは両立できるのでしょうか?
よろしくお願いいたします。
FSP5.6.0(直近のリリース版)の端子設定を見ると、
GTETRGA(OUT) PB12, PC07,PC14 | GTETRGA(IN) PB10, PE00
GTETRGB(OUT) PA12, PA15, PC15 | GTETRGB(IN) PB10
GTETRGC(OUT) PD10 | GTETRGC(IN) PA11, PE08, PB07
GTETRGD(OUT) PA11, PC06, PC13 | GTETRGD(IN) PE09
GTETRGnを出力として設定可能な端子と、入力として設定可能な端子に分かれています。この事から
GTETRGC(OUT)とGTETRGC(IN) は実は別な端子で、何故か名称が同じだけであるようにも思えます。
(ハードウェアマニュアルからは、その様になっている様には読み取れませんが)
実際に動作を見てみると、GTETRGC(OUT), GTETRGC(IN)の区分はなく、FSPの不備であると思われます。(PE08を GTETRGC(IN), PD10をGTETRGC(OUT)に設定しての同時使用は不可であると思います。)
同じ名前を割り当てただけなのか?私がやりたいのはPE08もPD10も入力で動作するかは試してみるしかなさそうですね。FSPの特に「え?」な部分、一時的に割り込みを無効化してクリティカルセクションを抜けた後に再度有効化するためのAPIがデベロパアシスタンスにないのが不親切だなと思いました。ARM系の割り込みのEnable/Disableの切り替えを知らない人は困っちゃうと思う。
一時的に割り込みを無効化/再度有効化
一般的にはどうやるんでしょう?
RXでは
clrpsw_i()setpsw_i()
RL78, RH850では
DI()EI()
RAでは
__disable_irq()__enable_irq()
などを使っていますが、これが正解なのかは?
グローバルにやってしまうならそれでいいのですが、割り込みベクタ毎ならNVICが割り込みを管理するので割り込みの番号の割り込みビットを制御します。
一応はbsp_irq.hの中に便利に使えるAPIが用意されていますが、IRQn_TypeがFSP生成コードのどこに格納されているかに気付けるのはARM Cortex-M経験者で中級者以上かなと。ほとんどのスタックは_cfgのメンバに存在しますが、中にはメンバに存在しなくてマクロで定義が生成されているものもあります(vector_data.h)。GPTのCAPCURE COMPAREのAとBの割り込みとかです。
特定の割り込みの有効・無効を切り替える場合は、どっちかでやってますね。これも、どうやるのが定石なのか判らない。
・直接NVICのレジスタを叩く
#define NVIC_REG_IPR(n) (*(volatile unsigned long *)(0xE000E400+n*4)) //割り込み優先度
#define NVIC_REG_ISER(n) (*(volatile unsigned long *)(0xE000E100+n*4)) //割り込み許可
NVIC_REG_ISER(n) |= 0x00000001UL << i; //割り込みの有効化
→RA8x以外だったら上記でも行けた気がします…
・FSPの関数?を使う
NVIC_SetPriority((uint32_t)VECTOR_NUMBER_CAN_RXF, priority); //割り込み優先度
R_BSP_IrqEnable((uint32_t)VECTOR_NUMBER_CAN_RXF); //割り込み許可
→CANの受信割り込みを有効化する場合
(FSPのInterruptsタブでNew User Eventで割り込みに割り込み番号を割り当てる必要あり or stackを追加して、Interruptsタブに割り込みが追加されている(=割り込み機能に番号が割り振られている)必要がある)
(割り込み優先度を設定する関数と有効/無効化する関数名に統一感がない…優先度を設定する関数もR_で始まる関数が用意されているのでしょうか?)
やることは最後は同じなんですが・・・ルネサスコードのR_BSP_IrqEnable()で呼び出すためのベクター番号のセットの仕方がマチマチでスタックの初期化APIであるOpenでEnableしないものもあったり、_cfgのメンバにベクター番号メンバがあったり、なかったり。統一してほしい。それが済むとアシスタンスの一覧に載るようになるかも。よく使うので載せて欲しい。