2017年5月25日木曜日

待ち時間をタイマで生成


 MMCの転送待ちに、タイマでタイミング生成を併用してみました。
 CMD17でシングルブロックリードを開始すると、カードが実際にデータを送ってくるまでにはある程度の待ち時間があるわけですが、これが結構長いので、単純にソフトウェアループを行うとちょっともったいないです。ということでTIMとセマフォを使って数百マイクロ秒のディレイを行い、その間はOSにリソースを返すようにしました。ディレイ中はIdleHookでトグルしているピンが動いているのを確認しているので、予想通りに動いているようです。

 ま、このカードの場合はディレイが1msecを超えてるのでOSに待たせても良いんですけどねorz

 今回は250usのディレイですが、ISRやらセマフォやらタスク切り替えやらで15usほどかかるようです。それでも他にリソースが渡っている時間のほうが長いと思うので、たぶん効果はあると思います。そんなキチキチのプログラムを作ってるのか、という問題はさておき。

 今回はTIM7を使いました。TIM7(と6)はOC/ICが搭載されておらず、トリガの接続も極めて限定的です。実質的に、TIM6/7はタイマ割り込みでソフトウェアのタイミングを作るか、DACの変換トリガに使うか、の2種類しか用途がありません。DACは今のところ使う予定がありませんし、他のTIMにも接続されているのでイザとなればそちらを使えます。ということで7を使いました。ちなみに6は似たような理由で他のソフトウェアタイミング生成に使用済みです。

 STM32のタイマは痒いところに手が届かない感じですが、それでもSTBee F4miniに乗ってる405RGではタイマが14個もありますから、かなり大胆に使えると思います。
 ただし、一部のタイマを除いて、ほとんどはアップカウントしかできない点に注意が必要です。今回の場合はタイマを0xFFFFで初期化しておき、TIMx->CNT = 0xFFFF - 待ち時間 として設定しました(なお、プリスケーラはマイコンの動作周波数[MHz]に設定してあるので、1クロック1usecです)。

0 件のコメント:

コメントを投稿