ホーム › フォーラム › Texas Instruments › プロセッサー › Sitara(AM335x、AM437x) › タイマーパラメータの計算方法について
このトピックには14件の返信が含まれ、2人の参加者がいます。4 年、 9 ヶ月前に クライフ さんが最後の更新を行いました。
-
投稿者投稿
-
タイマーパラメータの計算方法について
デバイス型番:AM3359お世話になります。
添付ファイルにタイマーパラメータの設定値として
#define OSAL_TEST_TIMER_PERIOD (726000U)
と定義されており
1msec毎にタイマー割込みが発生するように設計されている
ようですが、ここで726000Uの設定する計算方法はどのように
なるのでしょうか?Attachments:
hhkkuu様
同ファイルの初期設定関数(timer_initialize())を見ると、以下のように設定されております。
- l.175 timerParams.periodType = TimerP_PeriodType_MICROSECS;
l.176 timerParams.period = OSAL_TEST_TIMER_PERIOD;
タイマーの基本単位が”OSAL_TEST_TIMER_PERIOD”usごとに割り込む設定となっております。
デフォルトでは726ms(726000us)ごと、となっております。以上、ご確認をよろしくお願いいたします。
クライフクライフ様
御解答ありがとうございます。
私も御解答頂いたように思いましたが、
OSAL_TEST_TIMER_PERIODの値で初期化した後となりますが、
149行目で
handle = TimerP_create(id, (TimerP_Fxn)&timerIsr, &timerParams);
とありまして、タイマー割込みを生成しております。このタイマー割込みを実機で確認しますと、1ms周期で入っております。
またソースコード上でも
このタイマー割込み(timerIsr)が入った回数を310行目のtimer_get_time関数で参照しており
さらにtimer_get_time関数は
ti\pdk_am335x_1_0_16\packages\ti\transport\ndk\nimu\example\CCLink\cclink_slave\sample\srcにあります
USER_SAMPLE.cファイルの
user_display_cyclic_information関数で参照しております。
この関数内の定義で
USER_DISPLAY_INTERVAL_TIME 5000 /* Interval time for the display of the cyclic state [ms] */
とあり、タイマー割込み(timerIsr)の周期は1msで設計されているように思います。タイマー回路に入力されるクロックが726MHzと仮定しますと、726000*(1/726MHz)=1msとなりますが
データシートにおいては、設定に対する詳細な記載がまだ見つかっていない状況です。Attachments:
hhkkuu様
以下につきまして、ご教授いただけますでしょうか。
タイマー割り込み実機で確認、とのことですが、
このとき1msの割り込み間隔をどのように確認されたのでしょうか。
user_display_cyclic_information関数内のtimer_get_time関数で確認されたものでしょうか。
確認方法について詳細をお教えいただければ幸いです。よろしくお願いいたします。
クライフお世話になります。
タイマー割り込み実機での確認の件ですが、
外部デバイスとの通信を定周期(約10us)で行っております。
この通信を1000回(10ms)行ったとき、
timerIsr割り込みハンドラ内のtimerIsrCountが10毎増加していることが
デバッガで確認できたため、
相対的に1ms割り込みが入っていると判断致しました。またs_user_display_logger_information関数では
USER_DISPLAY_INTERVAL_TIMEが5000の場合、5秒ごとにコンソールにUart出力
USER_DISPLAY_INTERVAL_TIMEが1000の場合、1秒ごとにコンソールにUart出力
されることを確認しております。以上、よろしくお願い致します。
hhkkuu様
ご教授いただき、ありがとうございます。
再度調査いたしまして”OSAL_TEST_TIMER_PERIOD”ですが、正確にはOSへ供給するシステムティックの周期でございました。
AM335xシリーズでは、システムティックへのクロック供給はデフォルトではCPU(A8)のクロックを使用しています。いただきましたサンプルでは、CPU(A8)のクロックが726MHzで設定されている可能性がございます。
その場合、1/726MHz[s]のティック周期から726000カウント毎(1ms毎)にタイマー割り込みがかかるものと推測いたします。
先日の回答で誤解を与えてしまい、大変申し訳ございません。システムティックに対するCPU周波数について、下記HPにて記載がございます。
Processor SDK RTOS : 10.2.2.1.7.2. How to get accurate clock ticks from the clock module?
大変恐縮ですが、デバッガにてCPU周波数が726MHzとなっているか、上記資料ならびにTechnical Reference ManualのPLLを参考にご確認をいただければ幸いです。
AM335x and AMIC110 Sitara™ Processors Technical Reference Manual (Rev. Q)
以上、よろしくお願いいたします。
クライフ御解答ありがとうございます。
デバッガで確認致しましたところ、
DMTIMER3の入力クロックとしては24MHzが指定されておりました。
DMTIMER3は16bitタイマーとして設定されており、726000を指定すると
16bitタイマ値には
0xA269(41577)がセットされており、オーバーフローで割り込みが発生する場合
オーバーフローが発生するまでのカウント値は65535-41577=23958で、
さらに16bitタイマーの初期オフセット値は2A(42)とデータシートに
記載があり、これを加算しますと、23958+42=24000となります。
この場合割り込み周期が24000*1/24MHz=1msecになると推測致しました。hhkkuu様
DMTIMERにはauto-reloadモードが用意されております。
タイマーカウンタがオーバーフロー後、タイマーカウンタ(TCRR)がタイマーロードレジスタ(TLDR)の値をリロードします。デバッガで確認時、TLDRも同様に0xA269となっておりましたでしょうか。
また、auto-reloadモードを設定する、TCLR.ARビットがセットされておりましたでしょうか。Technical Reference Manual P.4442 20.1.3.1 Timer Mode Functionalityを合わせて参考にしていただければ幸いです。
以上、ご確認を宜しくお願い致します。
クライフ御解答ありがとうございます。
タイマー1msecが入った時点でBreakさせますと
TLDRは0xA26Aとなっており、TCLR.ARビットはセットされておりました。
0xA26Aと726000の関係が未確認の状況となります。Attachments:
hhkkuu様
Timer.cで定義されているOS用タイマーのID(OSAL_TEST_TIMER_ID)は”1″で定義しております。
今回の1ms周期の割り込みがDMTimer”3″でありましたら、OSAL_TEST_TIMER_PERIODと1ms周期を生成している割り込みは別のTimerモジュールではないかと推測しております。お手数ですが、OSAL_TEST_TIMER_PERIODの変更によって1ms割り込みに変化があるか、関連性をご確認いただくようお願いいたします。
以上、よろしくお願いいたします。
クライフお世話になります。
timer_initialize関数内に以下の記載があり
*(unsigned int*)CM_PER_TIMER3_CLKCTRL = 0x2; /* Module is explicitly enabled */の記述
でDMTIMER3が有効になり、TimerP_startでDMTIMER3のカウントが開始されております。
その他のタイマーは動作していないようです。
仮にtimerParams.period の値を変更致しますと、割り込み周期にも反映されることは確認できております。タイマーIDについてですが、バッチファイルより自動配置されましたcfgファイルを確認致しましたが、
ID1(TimerSetting(1))がDMtimer3ではと推測しております。以上、よろしくお願い致します。
Attachments:
hhkkuu様
ご確認いただき、ありがとうございます。
TimerはDMTimer3のみで、cfgファイルでもDMTimer3で設定されているとのことで理解いたしました。OSAL_TEST_TIMER_PERIODの変更による1ms割り込みに変化があるか、関連性をご確認についてはいかがでしょうか。
よろしくお願いいたします。
クライフお世話になります。
OSAL_TEST_TIMER_PERIODの変更による1ms割り込みに変化があるか
の関連性はあることの確認ですが、変更前後で割り込み回数をカウントし、
参照されるUART出力の間隔が変更される(1s⇒5sなど)を行っております。以上、よろしくお願い致します。
hhkkuu様
大変恐れ入りますが、hhkkuu様でデバッグされておりますサンプルプロジェクトをお送りいただくことはできますでしょうか。
メーカーへもOSAL_TEST_TIMER_PERIODについて問い合わせをさせていただいておりますが、使用されているプロジェクトの確認が必要なため、ご検討をいただければ幸いです。後ほどオフラインでご連絡をさせていただきますので、ご確認のほどよろしくお願いいたします。
以上、よろしくお願いいたします。
クライフhhkkuu様
お時間をいただいており、大変申し訳ございません。
頂きましたサンプルプロジェクトを確認させていただき、OSAL_TEST_TIMER_PERIODを726000から変更いただくと、TimerP_create()関数で処理実行後、TLDRも連動するように変更されることを確認いたしました。
以下一例になります。OSAL_TEST_TIMER_PERIOD:726000⇒363000、TLDR:0xFFFFA26A⇒0xFFFFD135
0xFFFFFFFF – 0xFFFFD135 = 0x2ECA(11978)
結果、OSAL_TEST_TIMER_PERIODを半分にすると、TLDRも半分になるようTimerP_create()関数で計算される。TI社提供のドキュメントも含めて調査いたしましたが、TimerP_create関数によってTimer割り込み周期を決定する旨の記述のみ確認ができました。
以下、インストールされたPDK内で用意されているドキュメントのURLでございます。../ti/pdk_am335x_1_0_16/packages/ti/osal/docs/doxygen/html/group___d_r_v___o_s_a_l___timer_p.html#ga6099d4900f354d6c036127f6150ec377
以上のことから、OSAL_TEST_TIMER_PERIODの変更でTLDRによるタイマ割り込み周期のレジスタを変更することができます。
つきましては、割り込み周期には同パラメータの変更をいただければと存じます。以上、よろしくお願いいたします。
クライフ - l.175 timerParams.periodType = TimerP_PeriodType_MICROSECS;
-
投稿者投稿